gpt4 book ai didi

android - 从 Jetpack Compose + Hilt + ViewModel 中的 ViewModel 导航的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-05 00:01:53 25 4
gpt4 key购买 nike

我偶然发现了这个非常微不足道但很棘手的问题。我花了相当多的时间搜索官方文档,但不幸的是没有找到答案。
官方文档说你应该传递一个 NavController 的实例下至 @Composable -s,并将其称为onClick = { navController.navigate("path") } .但是,如果我必须从 ViewModel 触发导航事件(例如登录时重定向、重定向到新创建的帖子页面)会发生什么?等待 @Composable 中的任何协程(例如 HTTP 请求)不仅不好,而且可能会因为阻塞的 UI 线程而迫使 Android 杀死应用程序
非官方解决方案(主要以 Medium 文章的形式记录)基于具有单例类的概念并观察一些 MutableStateFlow包含路径。
这在理论上听起来很愚蠢,在实践中并没有太大帮助(对副作用和重组不友好,会触发不必要的重新导航)。

最佳答案

rememberNavController有一个非常简单的源代码,您可以使用它在单例服务中创建它:

@Singleton
class NavigationService @Inject constructor(
@ApplicationContext context: Context,
) {
val navController = NavHostController(context).apply {
navigatorProvider.addNavigator(ComposeNavigator())
navigatorProvider.addNavigator(DialogNavigator())
}
}
创建辅助 View 模型以共享 NavHostControllerNavHost看法:
@HiltViewModel
class NavViewModel @Inject constructor(
navigationService: NavigationService,
): ViewModel() {
val controller = navigationService.navController
}

NavHost(
navController = hiltViewModel<NavViewModel>().controller,
startDestination = // ...
) {
// ...
}
然后在任何 View 模型中,您都可以将其注入(inject)并用于导航:
@HiltViewModel
class ScreenViewModel @Inject constructor(
private val navigationService: NavigationService
): ViewModel() {
fun navigateToNextScreen() {
navigationService.navController.navigate(Destinations.NextScreen)
}
}

关于android - 从 Jetpack Compose + Hilt + ViewModel 中的 ViewModel 导航的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72020288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com