使用 viewModels 从 ChildFragment 访问 ParentFragment 中的 ViewModel
Accessing ViewModel in ParentFragment from ChildFragment using viewModels
我正在尝试使用 viewModels
从 ChildFragment
访问 ParentFragment
的 ParentViewModel
。这是我的代码。
// In ParentFragment
class ParentFragment : Fragment() {
val parentViewModel: ParentViewModel by viewModels {
ParentViewModelFactory(getRepository())
}
...
}
// In ChildFragment
class ChildFragment : Fragment() {
val parentViewModel: ParentViewModel by viewModels(
{ requireParentFragment() }
)
...
}
但是,只有当我在 ParentViewModel
中设置一个 LiveData
变量并让 ParentFragment
像这样观察它时,此代码才有效:
parentViewModel.text.observe(this) {
toast(it)
}
我没有必要从 ParentFragment
内部观察 ViewModel
。我只需要它为 ChildFragments
定义 lifecycle
。
如果我摆脱上面的观察,我会得到这个错误:
'java.lang.RuntimeException: Cannot create an instance of class ParentViewModel'
我怎样才能让 ChildFragments 在不设置虚拟实时数据对象的情况下访问 ParentViewModel
,以便 ParentFragment
可以观察到它们。
在 ChildFragment 中,您应该在初始化时传递工厂。试试这个
class ChildFragment : Fragment() {
val parentViewModel: ParentViewModel by viewModels(
{ requireParentFragment() }
) { ParentViewModelFactory(getRepository()) }
...
}
我正在尝试使用 viewModels
从 ChildFragment
访问 ParentFragment
的 ParentViewModel
。这是我的代码。
// In ParentFragment
class ParentFragment : Fragment() {
val parentViewModel: ParentViewModel by viewModels {
ParentViewModelFactory(getRepository())
}
...
}
// In ChildFragment
class ChildFragment : Fragment() {
val parentViewModel: ParentViewModel by viewModels(
{ requireParentFragment() }
)
...
}
但是,只有当我在 ParentViewModel
中设置一个 LiveData
变量并让 ParentFragment
像这样观察它时,此代码才有效:
parentViewModel.text.observe(this) {
toast(it)
}
我没有必要从 ParentFragment
内部观察 ViewModel
。我只需要它为 ChildFragments
定义 lifecycle
。
如果我摆脱上面的观察,我会得到这个错误:
'java.lang.RuntimeException: Cannot create an instance of class ParentViewModel'我怎样才能让 ChildFragments 在不设置虚拟实时数据对象的情况下访问
ParentViewModel
,以便 ParentFragment
可以观察到它们。
在 ChildFragment 中,您应该在初始化时传递工厂。试试这个
class ChildFragment : Fragment() {
val parentViewModel: ParentViewModel by viewModels(
{ requireParentFragment() }
) { ParentViewModelFactory(getRepository()) }
...
}