【发布时间】:2021-05-04 10:13:48
【问题描述】:
我正在使用 jetpack compose 和导航撰写库来从一个屏幕导航到下一个屏幕。通常你会有一个ViewModel 来处理用户交互(例如:viewModel.addItem())。为了完成 addItem 命令,我想通过navController.navigate() 显示另一个屏幕。 ViewModel 本身通过 hiltNavGraphViewModel() 注入到 Composable 中。
现在的问题是:我如何通过刀柄将NavController 注入ViewModel?
@HiltViewModel
class ScreenViewModel @Inject constructor(
private val navController: NavController // where does it come from?
) : ViewModel() {
fun addItem() {
navController.navigate("add-item-screen")
}
}
NavController 是通过可组合层次结构中的 rememberNavController() 方法创建的。我也不想将控制器向下传递到可组合层次结构或使用 CompositionLocal。首选方法是让控制器在 ViewModel 中可用。
【问题讨论】:
-
将回调放在
Compose function Screen上,不要将NavController带入ViewModel。我从来没有在撰写时看到过。 -
并使视图模型使用 StateFlow 进行事件。让那个收集在
Screendan 调用回调函数 -
@RofieSagara 感谢您的回答。我试图将 StateFlow 用作事件,但它有几个问题。按下返回时它不同步。当已经在目标路线上时,检查我们不需要再次导航的内容并不容易。 currentDestination.hasDeepLink() 方法不允许创建相应的路由 URI。
标签: android-jetpack-compose android-jetpack-navigation dagger-hilt