【问题标题】:AAC - How to avoid reference to activity in viewmodelAAC - 如何避免在视图模型中引用活动
【发布时间】:2019-09-21 18:16:39
【问题描述】:

我用来获取位置信息的FusedLocationProviderClient 需要引用活动或上下文。当我尝试在视图模型中实例化我的UserLocationService(实现FusedLocationProviderClient)时,我必须传递对活动的引用。

class UserLocationService {
public val locationUpdates: MutableLiveData<Location> = MutableLiveData()
private var fusedLocationClient: FusedLocationProviderClient
constructor(activity: Activity) {
    fusedLocationClient = LocationServices.getFusedLocationProviderClient(activity)
...

我不想传递对视图模型的任何引用。在这种情况下,正确的方法是什么?我可以直接在片段中使用UserLocationService,但我的理解是,视图模型应该进行实例化和初始化。

【问题讨论】:

  • a version of getFusedLocationProviderClient() that takes an ordinary Context,如果你愿意通过通知处理错误情况。
  • 但是如何获取UserLocationService内部的上下文呢?
  • 从架构的角度来看,我不知道那是什么。如果它是存储库或其他单例,您可以在创建它时提供Application 单例(例如,通过依赖倒置)。如果它只是视图模型正在使用的实用程序类,如一个答案所示,请使用 AndroidViewModel 作为视图模型的基类。然后,您可以访问getApplication() 以获取Application 单例。
  • 这只是一个存储库类。我已经从androidx.lifecycle.AndroidViewModel实现了AndroidViewModel类,但getApplication()还需要一个活动作为参考,如getApplication&lt;activity: Activity&gt;()
  • “但 getApplication() 还需要一个活动作为参考”——不,它不需要。它返回T,其中T 扩展自ApplicationThis sample project 演示了 AndroidViewModel 的使用,this projectthis projectthis project 也是如此。

标签: android reference viewmodel android-architecture-components fusedlocationproviderclient


【解决方案1】:

您应该使用AndroidViewModel

编辑:

所以你可以做的是拥有视图模型类。

class MyViewModel(application: Application) : AndroidViewModel(application) {
    private val context = application.applicationContext

}

然后根据需要使用上下文。

要初始化视图模型,您可以在 Activity 中执行类似的操作。

private val myViewModel: MyViewModel by lazy {
    ViewModelProviders.of(this).get(MyViewModel::class.java)
}

然后在onCreate()之后使用

【讨论】:

  • 我有一个如何使用它的例子吗?此类需要在构造函数中引用应用程序上下文。
猜你喜欢
  • 1970-01-01
  • 2019-09-26
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
相关资源
最近更新 更多