使用 SavedStateHandle 加入 sharedViewModel

ror*_*ror 4 android android-mvvm android-viewmodel koin androidx

我有单个活动应用程序和片段数量。其中一些片段正在使用我的视图模型,通常是这样的:

private val myViewModel: MyViewModel by sharedViewModel()
Run Code Online (Sandbox Code Playgroud)

如果我想同时拥有模型shared并使用 SavedStateHandle 保持其状态怎么办?我无法弄清楚这是否受支持,如果是,则需要如何使用它(在托管活动中将 viewmodel 声明为 stateViewModel 不起作用)。

ror*_*ror 6

更新:随着 koin 2.1.6 的到来,他们介绍org.koin.androidx.viewmodel.ext.android.stateSharedViewModel了你可以在你的片段中使用。


经过一个小时的挖掘 Koin 样本并找出一些问题:

  1. 假设您的视图模型与此类似:
class SavedStateViewModel(val handle: SavedStateHandle, val service: SimpleService) 
Run Code Online (Sandbox Code Playgroud)
  1. ...你的 DI 看起来像这样:
viewModel { (handle: SavedStateHandle) -> SavedStateViewModel(handle, get()) }
Run Code Online (Sandbox Code Playgroud)
  1. 您的共享状态视图模型可以在您的片段中使用,如下所示:
val sharedSaved: SavedStateViewModel by sharedViewModel()
Run Code Online (Sandbox Code Playgroud)
  1. (重要!)您在活动中需要此声明:
lateinit var savedVm: SavedStateViewModel
Run Code Online (Sandbox Code Playgroud)
  1. (重要)您需要super.onCreate(savedInstanceState)在您的活动之后立即调用它:
savedVm  = getStateViewModel() 
Run Code Online (Sandbox Code Playgroud)

重要的是不要对上述(stateViewModel)使用惰性版本。