簡體   English   中英

如何為公共片段創建不同的視圖模型?

[英]How to create different viewModels for a common fragment?

在我的 Android 應用中,有 3 個 Fragment 布局和功能相似,只是 fetcher 參數不同。 簡而言之,它可以定義為

class MyFragment(private val fetcher: /* fetcher type */) : Fragment() {
    // Somme implementations
}

class MyFragmentViewModel(private val fetcher: /* fetcher type */) : ViewModel() {
    // ViewModel implementations
}

要創建這三個片段,我只需將三個不同的fetcher傳遞給MyFragment ,而MyFragment需要將fetcher傳遞給它的 viewModel。

我的問題是,如何讓三個片段都有自己的viewModel? 我通過

val viewModel: MyFragmentViewModel by viewModels()

如果我什么都不做,這三個片段可能會共享同一個 viewModel,這不符合我的要求。 我認為這可以通過向viewModels()方法提供factoryProducerownerProducer來完成,但我找不到很多關於它的參考資料,所以我不知道如何實現我的目標。

我終於解決了。

解決方案

首先,我需要ViewModelProvider.Factory

class MyFragmentViewModelFactory(private val fetcher: /* fetcher type */) : ViewModelProvider.Factory {
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        return MyFragmentViewModel(this.fetcher) as T
    }
}

然后在我的片段中使用 viewModel:

val viewModel: MyFragmentViewModel by viewModels {
    NyFragmentViewModelFactory(fetcher)
}

別的東西

要在這種情況下使用 Navigation 框架,只需刪除MyFragment fetcher ,並使用 SafeArgs 傳遞一個解析為不同fetcher的枚舉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM