【问题标题】:Correct way to handle fragment's flow in the viewModel在 viewModel 中处理片段流的正确方法
【发布时间】:2021-03-07 05:52:18
【问题描述】:

我有一个Fragment 和一个ViewModel

Fragment 中,我有一个View,它公开了一个协程流,我想在ViewModel 中处理集合,显然我不会将View 引用到ViewModel .

我的想法基本上是在片段onViewCreated

view.flow
    .onEach(viewModel::collect)
    .launchIn(viewModel.viewModelScope)

这可行,但是……这是一个好的实现吗?还是有更好的方法来实现我的目标?

【问题讨论】:

    标签: android kotlin viewmodel kotlin-coroutines flow


    【解决方案1】:

    我相信您可以使用标准片段的范围而不是 viewmodelScope

    viewLifecycleOwner.lifecycleScope 来自 androidx.lifecycle:lifecycle-runtime-ktx:2.2.0 依赖项。

    喜欢这个

    view.flow
        .onEach(viewModel::collect)
        .launchIn(viewLifecycleOwner.lifecycleScope)
    

    【讨论】:

    • 我想过,但是 onEach 是可挂起的,这意味着挂起的块将被写入视图模型中,但实际上的范围是片段,而实际上的想法是在视图模型范围内启动它(ofc 我可以创建一个新的协程,但要避免)
    • viewModel.collect 是可暂停的,但如果您希望 viewmodel 中的代码在 viewmodelscope 中执行,您可以在 viewmodel 范围内启动一个新的协程。我担心如果您在视图模型范围内启动视图流,您将泄漏视图/片段......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多