【问题标题】:How can I use ViewModel in custom helper class?如何在自定义助手类中使用 ViewModel?
【发布时间】:2022-07-02 08:51:33
【问题描述】:

我使用 ViewModel 和 LiveData 调用 Retrofit API。


public LiveData<List<History>> getHistory(Context context, String queryType, long from, long to) {
        
    return HistoryDataRepository.getInstance(context).getLocationHistory(queryType, from, to);
    
}

我在我的 Fragment 中使用这个函数,如下所示:


viewModel.getHistory(requireContext(), ConstantsHelper.QUERY_TYPE, fromDate, toDate).observe(this, data -> {
..
..
..
}

我想创建一个 HistoryHelper 类并将这个函数移动到我的助手类中,以使我的代码更有条理。

如何在我的自定义助手类中使用 ViewModel 函数?

【问题讨论】:

    标签: android mvvm


    【解决方案1】:

    ViewModel 的范围仅限于使用它们的生命周期:Activity 或 Fragment。除非您要创建的助手类是其中之一,否则在其中使用 ViewModel 是不可行的。请参阅ViewModel OverviewGuide to app architecture 了解更多详情。

    存储库已经是您的“助手”类,处理在您的应用中管理数据的业务逻辑。

    我注意到的一件事是 queryType 始终相同,因此您可以将其作为参数删除。另外,为什么您的存储库需要上下文?

    【讨论】:

      【解决方案2】:

      不建议做这样的事情,换个拱门试试。从问题中提出建议不是很有帮助。但, 您可以在 Helper 类中实现一个侦听器,该侦听器将获取 ViewModelStoreOwner。

      HistoryHelperListener{
         fun getViewModelStoreOwner(): FragmentActivity
      }
      

      然后使用getViewModelStoreOwner() 你可以初始化你的viewModel

      private var viewModel: TransactionTagHandlerViewModel? =
          ViewModelProvider(
              listener.getViewModelStoreOwner(), object : ViewModelProvider.Factory {
                  override fun <T : ViewModel> create(modelClass: Class<T>): T {
                      return HistoryHelperVM() as T
                  }
              }
          )[HistoryHelperVM::class.java]
      

      PS:在自定义类中处理 LiveData 可能会产生开销,因此更喜欢在HistoryHelper 中使用 API 回调接口和处理状态

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多