首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ViewTreeViewModelStoreOwner.get(视图)总是返回null

ViewTreeViewModelStoreOwner.get(视图)总是返回null
EN

Stack Overflow用户
提问于 2021-07-28 22:05:31
回答 2查看 145关注 0票数 0

我有一个复合视图,我想通过ViewModelLazy创建它的视图模型,我需要将视图的ViewModelStoreOwner发送到ViewModelLazy,但尝试使用ViewTreeViewModelStoreOwner.get(this)获取ViewModelStoreOwner总是返回null。复合视图本身是一个简单的视图,但我将在驻留在片段中的recyclerview适配器中使用它。现在,我被迫使用父片段ViewModelStoreOwner,这导致适配器中的所有项都具有相同的视图模型实例。我搜索了一个关于如何使用ViewTreeViewModelStoreOwner的例子,但我找不到,我是不是遗漏了什么?

注意:我是通过dagger-hilt注入视图模型的

EN

回答 2

Stack Overflow用户

发布于 2021-07-31 08:49:13

% 1,您需要更新

代码语言:javascript
复制
androidx.activity to 1.2.0
androidx.fragment to 1.3.0 

2、activity或fragment通过setTag将其ViewModelStore设置为rootViw,因此activity或fragment的rootView中的任何视图都会获得相同的ViewModelStoreOwner和ViewModelStore。

代码语言:javascript
复制
// ComponentActivity line 409
ViewTreeViewModelStoreOwner.set(getWindow().getDecorView(), this) 
// ViewTreeViewModelStoreOwner line 50
view.setTag(R.id.view_tree_view_model_store_owner, viewModelStoreOwner);
票数 0
EN

Stack Overflow用户

发布于 2021-11-24 04:59:30

这个例子展示了如何在自定义视图中实现它。

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68561923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档