使用 ModelFactory 在片段之间共享数据

share data between fragments using ModelFactory

我已经成功实现了基于存储库的 MVVM。但是我需要在片段之间传递一个 class 对象。我在多个片段之间实现了 sharedViewModel,但设置值始终为 null。我知道这是因为我没有将 activity 上下文传递给片段中视图模型的初始化。我正在使用 ModelFactory 制作我的视图模型的实例,但我无法找到一种方法来提供 'applicationActivity()' .

这是我的模型工厂:

class MyViewModelFactory  constructor(private val repository: MyRepository): ViewModelProvider.Factory {

override fun <T : ViewModel> create(modelClass: Class<T>): T {
    return if (modelClass.isAssignableFrom(MyOwnViewModel::class.java)) {
        MyOwnViewModel(this.repository) as T
    } else {
        throw IllegalArgumentException("ViewModel Not Found")
    }
}

这就是我初始化视图模型的方式:

  viewModel=ViewModelProvider(this, MyViewModelFactory(
        MyRepository(MyServices() ) )).get(MyOwnViewModel::class.java)

获取数据和其他一切都有效,但我需要能够在片段之间共享数据,而我无法使用此体系结构做到这一点。我没有使用匕首或刀柄。 谢谢指点。

你也可以这样写viewmodelfactory

class MyViewModelFactory(内部变量 viewModel:ViewModel):ViewModelProvider.Factory { 覆盖有趣的创建(模型Class:Class):T { return viewModel 为 T } }

要在片段之间共享数据,您可以使用 bundle

可以使用by activityViewModels()并通过工厂

private val myViewModel: MyViewModel by activityViewModels(factoryProducer = {
    MyViewModelFactory(<your respository instance>)
})

最好从单例或应用程序 class 中的字段获取存储库实例。如果您选择从应用程序 class 获取,您可以这样做;

class MyApp: Application() {

    val service by lazy { MyService() }
    val repository by lazy { MyRepository(service) }
}

通过将它们定义为惰性的,可以确保在必要时才对它们进行初始化

对于您的应用程序 class,您的视图模型调用应该如下所示

private val myViewModel: MyViewModel by activityViewModels(factoryProducer = {
    MyViewModelFactory((activity?.application as MyApp).repository)
})