为什么在 android jetpack compose 中显示 "Cannot create an instance of class com.app.myapp.viewModel"?
Why it says "Cannot create an instance of class com.app.myapp.viewModel" in android jetpack compose?
我是 adroid 的新手,所以我有一个简单的项目,我想创建简单的注册项目,所以我的项目中有 viewmodel,我也在其中使用 Hilt 库,当我构建项目时它被抛出
的错误
myViewModel = ViewModelProvider(this)[MyViewModel::class.java]
作为“无法创建 class 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
class,例如 RegisterViewModel
.
查看文档了解更多信息:
https://developer.android.com/topic/libraries/architecture/viewmodel
您正在尝试从基础 class ViewModel
创建视图模型。它不是这样工作的
您需要创建自己的视图模型 class 并像这样从基础 class 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 你应该看看 viewmodel 和 compose
之间的 integration
让您的可组合项使用 viewModel 而无需创建它然后将其传递给可组合项
@Composable
fun MyExample(
viewModel: MyViewModel = viewModel()
) {
// use viewModel here
}
可能导致系统无法创建viewModel的原因:
你的 viewModel class 不是 Public
您的包含 viewModel 的包名称包含特殊关键字(例如“package.new.feature”)
如果您使用的是匕首柄,则应在 class 声明上方添加注释 @HiltViewModel
并创建构造函数,如
@HiltViewModel
class viewModel @Inject constructor() : ViewModel()
使用匕首柄您应该使用 hiltViewModel()
函数来创建 compose 实例而不是 viewModel()
依赖性:androidx.hilt:hilt-navigation-compose
@Composable
fun MyExample (viewModel: MyViewModel = hiltViewModel())
- 您的 ViewModel class 未从
androidx.lifecycle.ViewModel
扩展
我是 adroid 的新手,所以我有一个简单的项目,我想创建简单的注册项目,所以我的项目中有 viewmodel,我也在其中使用 Hilt 库,当我构建项目时它被抛出
的错误 myViewModel = ViewModelProvider(this)[MyViewModel::class.java]
作为“无法创建 class 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
class,例如 RegisterViewModel
.
查看文档了解更多信息: https://developer.android.com/topic/libraries/architecture/viewmodel
您正在尝试从基础 class ViewModel
创建视图模型。它不是这样工作的
您需要创建自己的视图模型 class 并像这样从基础 class 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 你应该看看 viewmodel 和 compose
之间的 integration让您的可组合项使用 viewModel 而无需创建它然后将其传递给可组合项
@Composable
fun MyExample(
viewModel: MyViewModel = viewModel()
) {
// use viewModel here
}
可能导致系统无法创建viewModel的原因:
你的 viewModel class 不是 Public
您的包含 viewModel 的包名称包含特殊关键字(例如“package.new.feature”)
如果您使用的是匕首柄,则应在 class 声明上方添加注释
@HiltViewModel
并创建构造函数,如@HiltViewModel class viewModel @Inject constructor() : ViewModel()
使用匕首柄您应该使用
hiltViewModel()
函数来创建 compose 实例而不是viewModel()
依赖性:androidx.hilt:hilt-navigation-compose
@Composable
fun MyExample (viewModel: MyViewModel = hiltViewModel())
- 您的 ViewModel class 未从
androidx.lifecycle.ViewModel
扩展