为什么它在安卓喷气背包组成中说"Cannot create an instance of class com.app.myapp.viewModel"?



我是新来的,所以我有一个简单的项目,我想创建一个简单的注册项目,所以我在我的项目中有视图模型,我有趣的希尔特库也在那里,当我构建项目时,它会抛出一个错误

 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

相关内容

最新更新