我如何从ViewModel的片段中移动逻辑?
override fun onItemClick(titleName: Int) {
when (titleName) {
R.string.about_terms_service -> {
activity?.addFragment(
WebViewFragment.newInstance(
TERMS_LINK,
getString(R.string.about_terms_service)
)
)
}
R.string.about_open_source_licenses -> activity?.addFragment(LicensesFragment())
}
}
此逻辑可以移到ViewModel
,尽管有点开销。可以肯定的是,要添加哪个片段的决定应移至ViewModel
,但是添加片段的代码应保留在Fragment
(或Activity
)中。我认为应该看起来像这样:
片段:
override fun onItemClick(titleName: Int) {
viewModel.onTitleClick(titleName)
}
ViewModel:
fun onTitleClick(titleName: Int) {
when (titleName) {
R.string.about_terms_service -> {
postViewModelEvent(ShowWebViewFragmentEvent())
}
R.string.about_open_source_licenses -> {
// TODO: open License fragment
}
}
}
在ViewModel
中,应使用对视图的特定命令(// TODO
,Fragment
)替换此Activity
,这将触发导航到特定片段。例如,关于如何执行此操作的代码为here(但是,当然,任何ViewModel
-Fragment
解决方案都可以使用)。
在这种情况下,可以容易地测试此逻辑。
如果通过视图模型事件(在链接中描述)将ViewModel
与Fragment
连接起来,则可以执行此操作:
创建像这样显示WebViewFragment
的事件:
class ShowWebViewFragmentEvent(): ViewModelEvent {
override fun handle(activity: BaseActivity) {
super.handle(activity)
activity?.addFragment(
WebViewFragment.newInstance(
TERMS_LINK,
getString(R.string.about_terms_service)
)
)
}
}
像这样将其发布在您的ViewModel
中(替换为// TODO
首先):
postViewModelEvent(ShowWebViewFragmentEvent())
请注意,应该对链接的帖子进行所有必需的更改。