如何将逻辑移到ViewModel?

问题描述 投票:0回答:1

我如何从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())
    }
}
android kotlin mvvm android-viewmodel android-mvvm
1个回答
1
投票

此逻辑可以移到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中,应使用对视图的特定命令(// TODOFragment)替换此Activity,这将触发导航到特定片段。例如,关于如何执行此操作的代码为here(但是,当然,任何ViewModel-Fragment解决方案都可以使用)。

在这种情况下,可以容易地测试此逻辑。

如果通过视图模型事件(在链接中描述)将ViewModelFragment连接起来,则可以执行此操作:

创建像这样显示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())

请注意,应该对链接的帖子进行所有必需的更改。

© www.soinside.com 2019 - 2024. All rights reserved.