小编Mic*_*l m的帖子

Android ViewModel - 在“by viewModels”之前调用“by ActivityViewModels”

离开 Android 开发一段时间后,我尝试从一个简单的项目重新开始。

我创建了一个新项目,选择“基本活动”选项,这导致了一个 MainActivity 和两个片段。从这里开始,由于主要功能需要数据库,因此我遵循了“Room with a view”codelab,但它只有一个活动。在我的项目中,我在活动中设置了一个观察者,一切工作正常,但是,一旦我将观察者移动到第一个片段中并使用“by ActivityViewModels”“检索”ViewModel,应用程序就开始抛出实例化异常。原因:MyViewModel 没有零参数构造函数。

经过一些调试后,我注意到片段中的“by ActivityViewModel”属性在活动中的“by viewModel”之前被调用。ViewModel 有一个工厂,我希望它的范围仅限于活动,稍后可以从第二个片段访问。

视图模型:

class MyViewModelFactory(private val repository: MyRepository) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
    if (modelClass.isAssignableFrom(MyViewModel::class.java)) {
        @Suppress("UNCHECKED_CAST")
        return MyViewModel(repository) as T
    }
    throw IllegalArgumentException("Unknown ViewModel class")
  }
}

class MyViewModel(private val repository: MyRepository): ViewModel() {
    val list: LiveData<List<Item>> = repository.allItems.asLiveData()
}
Run Code Online (Sandbox Code Playgroud)

活动

...more imports
import androidx.activity.viewModels

class MainActivity : AppCompatActivity() {

private lateinit var appBarConfiguration: AppBarConfiguration
private lateinit …
Run Code Online (Sandbox Code Playgroud)

android mvvm viewmodel kotlin androidx

3
推荐指数
1
解决办法
6965
查看次数

标签 统计

android ×1

androidx ×1

kotlin ×1

mvvm ×1

viewmodel ×1