将参数库传递给ViewModel而不是继承自AndroidViewModel是个好主意吗?

时间:2020-04-09 02:55:51

标签: kotlin android-jetpack

代码A来自https://github.com/android/architecture-components-samples/tree/master/PagingWithNetworkSample

代码B来自https://github.com/android/architecture-components-samples/tree/master/PagingSample

我知道当我需要使用AndroidViewModel来实例化基于数据库的Room(如代码B)时,应该使用ViewModel而不是Context

我发现代码A中的类SubRedditViewModel没有继承自AndroidViewModel,它使用构造函数传递了参数repository

将参数repository传递给ViewModel而不是继承自AndroidViewModel是个好主意吗?

代码A

class SubRedditViewModel(
        private val repository: RedditPostRepository,
        private val savedStateHandle: SavedStateHandle
) : ViewModel() {
   ...
}

代码B

class CheeseViewModel(app: Application) : AndroidViewModel(app) {
    val dao = CheeseDb.get(app).cheeseDao()
    ...
}

1 个答案:

答案 0 :(得分:3)

继承AndroidViewModel后,由于您依赖Android框架,因此您的类无法进行单元测试。另外,在代码段B中,您失去了为dao注入双倍测试的能力,从而使测试更加困难。

最后,请尝试避免使用框架类并练习依赖项注入(手动或借助Dagger这样的DI框架都没关系)。因此,您最好使用代码段A。