如何为一个共同的片段创建不同的viewModels?

问题描述 投票:1回答:1

在我的Android应用中,有三个片段,布局和功能都很相似,只是在一个fetcher参数上有所不同。简单来说,可以定义为

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

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

要创建这三个片段,我可以通过三个不同的。fetcherMyFragmentMyFragment 需通过 fetcher 到它的viewModel中。

我的问题是,如何使三个片段有自己的viewModel?我通过以下方式获得片段的viewModel。

val viewModel: MyFragmentViewModel by viewModels()

而如果我什么都不做,三个片段可能会共享同一个viewModel,这不符合我的要求。我认为可以通过提供 factoryProducerownerProducerviewModels() 方法,但我找不到很多关于它的参考资料,所以我不知道如何实现我的目标。

android viewmodel
1个回答
0
投票

我终于解决了。

解决办法

首先,我需要将 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框架,只需要删除 fetcher 争论中 MyFragment并使用SafeArgs传递一个枚举,该枚举解析为不同的 fetchers.

© www.soinside.com 2019 - 2024. All rights reserved.