使用Hilt注入的ViewModel在Composable函数中无法实例化如何解决
错误原因
- 构造函数依赖未提供绑定。你在MainViewModel的构造函数中注入了Int类型的
someInt,但未在Hilt的Module中声明该类型的依赖提供规则,Hilt无法实例化对应依赖,导致ViewModel创建失败。 - ViewModel获取方式错误。你在Composable中使用了Jetpack默认的
viewModel()方法获取Hilt注解的ViewModel,该方法不会走Hilt的依赖注入逻辑,无法识别@HiltViewModel注解。 - Hilt基础配置缺失。可能存在Application类未添加
@HiltAndroidApp注解、MainActivity未添加@AndroidEntryPoint注解的问题,这两个是Hilt注入Android组件的必要配置。
解决方案
按优先级依次检查修改:
- 处理ViewModel构造函数依赖
如果someInt是测试参数,可暂时移除构造函数中的该参数验证问题:
@HiltViewModel class MainViewModel @Inject constructor(): ViewModel(){ init{ println("ViewModel初始化完成") } // Mutable Live data for storing the value of the username entry field private var _username = MutableLiveData("") val username: LiveData<String> =_username // Function for changing the value of the username entry field fun onUsernameChange(it: String){ _username.value = it } }
如果需要保留该注入参数,需在Hilt Module中提供对应实例:
@Module @InstallIn(SingletonComponent::class) object AppModule { @Provides fun provideSomeInt(): Int = 100 // 替换为实际需要的数值 }
- 修正Composable中ViewModel的获取方式
将MainScreen函数的ViewModel默认值改为Hilt提供的hiltViewModel():
@Composable fun MainScreen(viewModel: MainViewModel = hiltViewModel()) { Column( modifier = Modifier.fillMaxSize(), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { val userName: String by viewModel.username.observeAsState("") OutlinedTextField( value = userName, onValueChange ={ viewModel.onUsernameChange(it) }, label = { Text(text = "User Name") } ) } }
- 补全Hilt基础注解
- 给自定义Application类添加
@HiltAndroidApp注解 - 给MainActivity添加
@AndroidEntryPoint注解:
@AndroidEntryPoint class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { TryingToGetTheViewModelToWorkTheme { Surface(color = MaterialTheme.colors.background) { MainScreen() } } } } }
内容的提问来源于stack exchange,提问作者AM_Codin
相关产品推荐
相关产品推荐

