我有一个复合视图,我想通过ViewModelLazy创建它的视图模型,我需要将视图的ViewModelStoreOwner发送到ViewModelLazy,但尝试使用ViewTreeViewModelStoreOwner.get(this)获取ViewModelStoreOwner总是返回null。复合视图本身是一个简单的视图,但我将在驻留在片段中的recyclerview适配器中使用它。现在,我被迫使用父片段ViewModelStoreOwner,这导致适配器中的所有项都具有相同的视图模型实例。我搜索了一个关于如何使用ViewTreeViewModelStoreOwner的例子,但我找不到,我是不是遗漏了什么?
注意:我是通过dagger-hilt注入视图模型的
发布于 2021-07-31 08:49:13
% 1,您需要更新
androidx.activity to 1.2.0
androidx.fragment to 1.3.0 2、activity或fragment通过setTag将其ViewModelStore设置为rootViw,因此activity或fragment的rootView中的任何视图都会获得相同的ViewModelStoreOwner和ViewModelStore。
// ComponentActivity line 409
ViewTreeViewModelStoreOwner.set(getWindow().getDecorView(), this)
// ViewTreeViewModelStoreOwner line 50
view.setTag(R.id.view_tree_view_model_store_owner, viewModelStoreOwner);发布于 2021-11-24 04:59:30
这个例子展示了如何在自定义视图中实现它。
class SummaryView(context: Context, attrs: AttributeSet?) : ConstraintLayout(context, attrs) {
private val viewModel by lazy {
ViewModelProvider(findViewTreeViewModelStoreOwner()!!).get<SummaryViewModel>()
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
viewModel.summaryModel.observe(findViewTreeLifecycleOwner()!!, ::populateSummaryView)
}
private fun populateSummaryView(summaryModel: SummaryModel) {
// do stuff
}
}我找到了这个很棒的例子here
https://stackoverflow.com/questions/68561923
复制相似问题