【问题标题】:How to execute network request when leaving Fragment?离开Fragment时如何执行网络请求?
【发布时间】:2020-01-24 07:59:43
【问题描述】:

如何在使用 Coroutines 和 ViewModel 退出一个 Fragment 时方便地执行网络请求?

工作流程是:用户输入一个包含盒子名称列表的片段 A。他选择了一个并被导航到片段 B,在那里他可以扫描条形码,这些条形码被添加到选定的框(在内存中)。扫描完所有必需的条形码后,他单击“返回”按钮,此时提到的带有条形码的框应发送到服务器(当然序列化为 JSON)。

ViewModelScope 当然不是解决方案,因为 Fragment 的 B ViewModel 已被清除。我尝试使用 WorkManager,但我不知道如何方便地做到这一点 - 它需要将 Context 引用传递给 ViewModel(为了使 ViewModel 从 Android 的平台引用中清除并简化单元测试,我想避免这种情况)并通过使用 Data 对象的 Box。

有没有更好的解决方案?

【问题讨论】:

    标签: android mvvm kotlin-coroutines


    【解决方案1】:

    您可以使用 Fragment 中的主机 Activity ViewModel 进行共享操作。因此,在您的情况下,请从主机 Activity ViewModel 发出网络请求。因此,当您从 Fragment A 导航到 B 时,网络请求将继续执行,并且数据将保留在 Activity ViewModel 上,因此您可以访问同一 Activity 托管的任何 Fragment 的值。

    您可以通过以下方法获取共享的ViewModel

    activity?.let {
    sharedViewModel = ViewModelProviders.of(it).get(SharedViewModel::class.java)
    }
    

    奖励积分

    即使 OP 不想使用范围为 Graph 的 ViewModel,它也被认为是更完美的方法。这是获取特定于 Graph 的 ViewModel 的方法

    val viewModel: CheckoutViewModel by navGraphViewModels(R.id.checkout_graph)
    

    【讨论】:

    • 这是我考虑过的解决方案之一,但由于这是一个单一的 Activity 应用程序,它似乎也有点笨拙。你将如何在这两个 ViewModel 之间传递 Box 对象?
    • Fragment 可以访问自己的 ViewModel 和 Activity ViewModel,因此 Fragment A 可以简单地将 box 对象传递给 Activity ViewModel,然后观察来自 Fragment B 的值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 2021-04-21
    • 1970-01-01
    • 2011-10-24
    • 2023-02-02
    • 2016-05-23
    相关资源
    最近更新 更多