Cannot create an instance of class com.example.loginapp.LoginViewModel

111 阅读1分钟

1、报错的图

image.png

2、开始的代码

image.png

3、LoginActivity调用

val viewModel: LoginViewModel = viewModel()
LoginScreen(viewModel)

image.png

4、修改以后的代码

image.png

说明: 该代码定义了一个 companion object 中的 provideFactory 方法,用于创建一个 ViewModelProvider.Factory 实例,专门用来生成带有依赖项 UserRepositoryLoginViewModel。其功能如下:

  • 接收 UserRepository 作为依赖
  • 返回一个匿名对象实现 ViewModelProvider.Factory
  • 重写 create 方法,将 LoginViewModel 强制转换为泛型类型 T 返回

5、调用的最新代码

image.png

// 使用factory创建ViewModel
val viewModel: LoginViewModel = viewModel(
    factory = LoginViewModel.provideFactory(repository)
)
val loginState by viewModel.loginState.collectAsState()

// 监听登录状态变化
LaunchedEffect(loginState.isSuccess) {
    if (loginState.isSuccess) {
        // 登录成功,跳转到MainActivity
        val context = applicationContext
        val intent = Intent(context, MainActivity::class.java)
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
        context.startActivity(intent)
        // 关闭当前Activity,防止返回登录页面
        finish()
    }
}
LoginScreen(viewModel)

说明:

这段代码实现登录状态监听并跳转主界面功能,具体如下:

  1. 使用 LoginViewModel.provideFactory 创建 LoginViewModel 实例;
  2. 通过 collectAsState() 收集 loginState 状态;
  3. 利用 LaunchedEffect 监听 loginState.isSuccess 变化;
  4. 登录成功后启动 MainActivity 并关闭当前页面。`