为什么在 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
  • 扩展