使用 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)
})
我已经成功实现了基于存储库的 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)
})