如何使用Hilt将Jetpack Compose的rememberNavController注入到Activity?
问题原因
- 你写的
NavigationModule不符合Hilt的依赖提供规则:- 提供依赖的方法没有添加
@Provides注解,Hilt无法识别该方法用于提供依赖 - 方法添加了
@Composable注解,@Composable函数只能在Compose上下文环境中调用,Hilt注入逻辑运行在普通Android生命周期上下文,没有对应的执行环境,根本无法调用该方法生成NavHostController实例
- 提供依赖的方法没有添加
- 你对
NavHostController的使用场景理解错误:NavHostController是和Compose视图生命周期绑定的控制器,必须在Compose Composition上下文中通过rememberNavController()创建,本身就不适合通过Hilt注入到Activity中。
解决方案
- 直接删除整个
NavigationModule文件,该实现没有作用 - 去掉
MainActivity中注入navHostController的代码,直接在setContent的Compose块中创建navHostController实例再传入NavigationComponent
修改后的MainActivity代码如下:
package com.example.crud.ui import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.material.MaterialTheme import androidx.compose.material.Surface import androidx.navigation.compose.rememberNavController import com.example.crud.navigation.NavigationComponent import com.example.crud.ui.theme.CRUDTheme import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { CRUDTheme { Surface(color = MaterialTheme.colors.background) { // 直接在Compose上下文中创建NavHostController val navHostController = rememberNavController() NavigationComponent(navHostController) } } } } }
其余代码无需修改,重新编译即可正常运行。
内容的提问来源于stack exchange,提问作者Pierre Vieira
相关产品推荐
相关产品推荐

