我在Kotlin中使用Koin
库进行依赖注入。
Koin
提供了by viewmodel()
方法用于获取ViewModel实例,by sharedViewModel()
方法用于在Fragment中获取相同的ViewModel实例。
我该如何在Activity中获取相同的ViewModel实例?我没有找到任何实现方式。
我在Kotlin中使用Koin
库进行依赖注入。
Koin
提供了by viewmodel()
方法用于获取ViewModel实例,by sharedViewModel()
方法用于在Fragment中获取相同的ViewModel实例。
我该如何在Activity中获取相同的ViewModel实例?我没有找到任何实现方式。
在模块声明中,必须使用single{}
而不是viewModel{}
。
single { SharedViewModel() }
而且,您可以在视图中使用viewModel()。
View1
private val viewModel: SharedViewModel by viewModel()
视图2
private val viewModel: SharedViewModel by viewModel()
但是您必须在视图启动时加载模块,方法是:
loadKoinModules(module1)
重要的是,在销毁视图时必须卸载模块。
unloadKoinModules(mainModule)
因此,当卸载模块时,您的单例ViewModel将被销毁。
#编辑
现在,您可以使用sharedViewModel声明。
ViewModelStoreOwner
,并使用应用程序作为owner来注入viewModels。所需的代码如下:class App : Application(), ViewModelStoreOwner {
private val mViewModelStore = ViewModelStore()
override fun getViewModelStore(): ViewModelStore {
return mViewModelStore
}
}
val Context.app: App
get() = applicationContext as App
inline fun <reified T : ViewModel> Context.appViewModel(
qualifier: Qualifier? = null,
noinline state: BundleDefinition? = null,
noinline parameters: ParametersDefinition? = null
): Lazy<T> {
return lazy(LazyThreadSafetyMode.NONE) {
GlobalContext.get().getViewModel(qualifier, state, { ViewModelOwner.from(app, null) }, T::class, parameters)
}
}
inline fun <reified T : ViewModel> Fragment.appViewModel(
qualifier: Qualifier? = null,
noinline state: BundleDefinition? = null,
noinline parameters: ParametersDefinition? = null
): Lazy<T> {
return lazy(LazyThreadSafetyMode.NONE) {
GlobalContext.get().getViewModel(qualifier, state, { ViewModelOwner.from(requireContext().app, null) }, T::class, parameters)
}
}
class MainActivity : AppCompatActivity() {
private val mAppViewModel: AppViewModel by appViewModel()
}
SavedStateRegistryOwner
,并使用SavedStateHandle
从viewModel内部保存/恢复状态,现在绑定到进程生命周期。getViewModelStore()
覆盖。 - CatalinViewModel
的内容,以更好地理解它。
https://developer.android.com/topic/libraries/architecture/viewmodel
ViewModel
连接到您的Activity
,Fragments
之间共享活动的ViewModel
,koin
中sharedViewModel
的含义。context
和ViewModel Factory
,则sharedViewModel
是相同的。Intent
共享任何数据,没有其他方式,静态/全局
数据并在Activities
之间共享它们。我知道这已经很晚了,但你可以尝试一下这个方法:
如果你正在扩展一个BaseViewModel,你需要将baseViewModel声明为single
,然后在你的相应活动中注入BaseViewModel。
实际例子:
val dataModule = module {
single { BaseViewModel(get(), get()) }
}
在您的ViewModel中
class LoginViewModel(private val param: Repository,
param1: Pref,
param2: Engine) : BaseViewModel(param1, param2)
然后在你的活动类中
val baseViewModel: BaseViewModel by inject()
希望这能帮助到某个人。