离开 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)