我是新来的,所以我有一个简单的项目,我想创建一个简单的注册项目,所以我在我的项目中有视图模型,我有趣的希尔特库也在那里,当我构建项目时,它会抛出一个错误
myViewModel = ViewModelProvider(this)[MyViewModel::class.java]
作为"无法创建类com.app.myapp.viewModel"的实例,我不知道我错过了什么?
class Register : ComponentActivity() {
private lateinit var myViewModel: MyViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
myViewModel = [ViewModelProvider(this)::class.java]
setContent {
RegisterScreen(myViewModel)
}
}
}
@Composable
fun RegisterScreen(
myViewModel: MyViewModel
) {
}
系统无法创建viewModel的原因:
-
你的viewModel类不是Public
-
包含viewModel的包名包含特殊关键字(如"package.new.feature")
-
如果你使用dagger柄,你应该把注释
这样的构造函数@HiltViewModel
放在类声明之上,并创建像@HiltViewModel class viewModel @Inject constructor() : ViewModel()
-
对于dagger柄,你应该使用
hiltViewModel()
函数来创建实例,而不是viewModel()
依赖性:androidx.hilt:hilt-navigation-compose
@Composable
fun MyExample (viewModel: MyViewModel = hiltViewModel())
- 你的ViewModel类没有从
androidx.lifecycle.ViewModel
扩展
您正在尝试从基类ViewModel
创建视图模型。它不是这样工作的
您需要创建自己的视图模型类,并从基类ViewModel
扩展它,如下所示
class MyViewModel : ViewModel() {
}
所以你的代码会像
class MyViewModel : ViewModel() {
// your implementation
}
class Register : ComponentActivity() {
private lateinit var viewModel: MyViewModel // changes to this line
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel = ViewModelProvider(this)[MyViewModel::class.java] // changes to this line
setContent {
RegisterScreen(viewModel)
}
}
}
如果您正在使用compose,则应该查看视图模型和compose之间的集成
使您的可组合对象使用viewModel,而无需创建它然后将其传递给可组合对象
@Composable
fun MyExample(
viewModel: MyViewModel = viewModel()
) {
// use viewModel here
}
您应该创建从ViewModel
扩展的ViewModel
类,类似于RegisterViewModel
。
查看文档获取更多信息:https://developer.android.com/topic/libraries/architecture/viewmodel