首页 > 解决方案 > 为 AndroidViewModel 创建 ViewModelFactory 的正确方法是什么

问题描述

我正在尝试使用 AndroidViewModel 而不是常规的 ViewModel,因为 AndroidViewModel 包含绑定服务所需的应用程序引用。

我的问题是,如何向 ViewModelFactory 提供应用程序参数?

目前我正在从 ViewModelFactory 注入器实用程序已经可用的 ApplicationContext 中投射它,但我读过这很危险,因为 ApplicationContext 的投射可能并不总是返回 application

我只是在学习Android,跟随向日葵的例子,所以答案可能很简单。我只是不知道。. . 然而。(希望你能帮忙)。

这是我目前的做法,您可能会注意到,这与 Google 在 Sunflower 示例中的做法密切相关:

使用 AndroidViewModel 的片段

class GalleryFragment : Fragment() {

private lateinit var viewModel: GalleryViewModel
private var memoList: List<Memo> = emptyList()

override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
): View? {
    val view = inflater.inflate(R.layout.gallery_fragment, container, false)
    val context = context ?: return view
    val factory = InjectorUtils.provideGalleryViewModelFactory(context)
    viewModel = ViewModelProviders.of(this, factory).get(GalleryViewModel::class.java)
    ... 

注射器实用程序

object InjectorUtils {

fun provideMemoViewModelFactory(context: Context, memoId: Long): MemoViewModelFactory {
    val application = context.applicationContext as Application //this could be dangerous
    val repository = getMemoRepository(context)
    return MemoViewModelFactory(application, repository, memoId)
   }
}

视图模型工厂

class MemoViewModelFactory(
    private val application: Application,
    private val memoRepository: MemoRepository,
    private val memoId: Long
 ) : ViewModelProvider.NewInstanceFactory() {

@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(modelClass: Class<T>): T {
    return MemoViewModel( application, memoRepository, memoId) as T
  }
}

视图模型

class MemoViewModel(
    application: Application,
    memoRepository: MemoRepository,
    private val memoId: Long
) : AndroidViewModel(application) {
...

我关心的是 InjectorUtil 内部,我通过转换 applicationContext 来获得对应用程序的引用。如果我沿着这条路继续前进,我是否会遇到麻烦?在其他地方我应该添加应用程序引用,在那里我可以直接访问它而不是通过 applicationContext 的转换?

谢谢

约翰

标签: androiddependency-injectionkotlinandroid-viewmodel

解决方案


推荐阅读