android - 将活动的 ViewModel 注入片段的 ViewModel
问题描述
我已经设置了一个非常类似于GithubBrowserSample
. 因此,匕首设置是相同的。
考虑有ActivityViewModel
and FragmentViewModel
,它们具有非零 arg 构造函数,因此它们是ViewModelProviders
通过 custom获取的ViewModelProvider.Factory
。
我想要的是指示匕首ActivityViewModel
在以下代码中注入已经创建的实例:
class FragmentViewModel @Inject constructor(
private val activityViewModel: ActivityViewModel
private val foo: Foo
) : ViewModel() {
...
}
使用当前声明 Dagger 将创建一个新实例,ActivityViewModel
无论是否已经存在。
发生这种情况是因为存在一个带@Inject
注释的构造函数ActivityViewModel
。
因此,dagger 可以自由假设,它是提供 to 实例的正确ActivityViewModel
方法FragmentViewModel
。
我知道如何为普通的 Dagger 做东西,但我不知道如何为 Dagger-Android 做这个,这个问题是专门针对 Dagger-Android 设置的。
作为一个肮脏的解决方案,我目前正在手动设置该实例:
class MyFragment : Fragment {
...
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel = ViewModelProviders.of(this, viewModelFactory).get(FragmentViewModel::class.java)
viewModel.activityViewModel = ViewModelProviders.of(activity!!, viewModelFactory).get(ActivityViewModel::class.java)
}
...
}
ViewModel
将父母注入孩子的正确方法是ViewModel
什么?
解决方案
这不是问题的答案,而是我提出并目前使用的一种方法。
声明了以下扩展函数:
inline fun <reified T : ViewModel> Fragment.getViewModel(
factory: ViewModelProvider.Factory = ViewModelProvider.NewInstanceFactory()
) = ViewModelProviders.of(this, factory).get(T::class.java)
inline fun <reified T : ViewModel> Fragment.getParentViewModel(
factory: ViewModelProvider.Factory = ViewModelProvider.NewInstanceFactory()
) = ViewModelProviders.of(activity!!, factory).get(T::class.java)
然后在片段类中,我们可以声明以下内容:
private val parentViewModel by lazy { getParentViewModel<ParentViewModel>(viewModelFactory) }
private val childViewModel by lazy {
val field = getViewModel<ChildViewModel>(viewModelFactory)
field.parentViewModel = parentViewModel
field
}
推荐阅读
- bash - xargs 命令在“LINE_MAX”断言上失败
- asp.net - 即使在 VB.NET 中使用 ORDER BY 子句,Oracle DataReader 也会被排序
- python - (Python 3.7)如何使用 tkinter 打印消息字符,它们之间有延迟?
- javascript - 在 React App 中使用时 Map 方法返回未定义
- product - OroCommerce 如何为产品表的新字段查找 Getter 和 Setter
- c# - 使用 https 在 IIS Express 上启用外部请求
- javascript - 从 NodeJS 中的 HTML 字符串中获取所有文本内容
- sql - 具有多个条件错误的 SQL Where Case
- javascript - 在快速服务器旁边使用下一个(在开发中)
- c# - 如何解决项目中的数据表库问题?