You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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组件的必要配置。
解决方案

按优先级依次检查修改:

  1. 处理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 // 替换为实际需要的数值
}
  1. 修正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")
            }
        )
    }
}
  1. 补全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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 18:45:05