我偶然发现了这个很琐碎但很棘手的问题。我已经花了相当多的时间搜索官方文档,但不幸的是没有找到答案。
官方文档说你应该将NavController
的示例传递给@Composable
-s,并将其称为onClick = { navController.navigate("path") }
。但是如果我必须从ViewModel触发导航事件(例如:登录时重定向,重定向到新创建的帖子页面)?等待任何协程(例如HTTP请求)在@Composable
中不仅是糟糕的,而且可能会迫使Android因为UI线程被阻塞而杀死应用程序
非官方的解决方案(大多以Medium文章的形式记录)是基于拥有一个单例类并观察一些MutableStateFlow
包含路径的概念。
这在理论上听起来很愚蠢,在实践中也没有多大帮助(没有副作用和重组友好,触发不必要的重新导航)。
3条答案
按热度按时间z4bn682m1#
我自己也一直在纠结同样的问题。从Google提供的关于这个主题的有限文档中,特别是架构事件部分,我想知道他们建议的是使用状态作为导航的触发器吗?
引用文件:
例如,在实现登录屏幕时,轻按登录按钮应会导致您的应用显示进度微调器和网络呼叫。如果登录成功,则您的应用将导航到另一个屏幕;在错误的情况下,应用程序显示Snackbar。下面是如何对屏幕状态和事件进行建模:
他们为上述要求提供了以下代码片段:
他们没有提供的是视图模型的其余部分和编写代码。我猜应该是这样的
视图模型也可以有一个类似这样的函数(通过单击撰写屏幕上的“登录”按钮来触发
z2acfund2#
rememberNavController
有一个非常简单的源代码,您可以使用它在单例服务中创建它:创建一个helper视图模型,以将
NavHostController
与NavHost
视图共享:然后,在任何视图模型中,您都可以注入它并用于导航:
u5rb5r593#
我走了一条类似于@Phil Dukhov的路。我创建了一个 Package 器类,它复制了已经在
rememberNavController()
中找到的代码:然后使用Hilt为我的
NavHostController
创建了一个提供程序。因为我需要navController遍历嵌套的NavHost
,所以我决定将其范围限定为ViewModel
这允许我将navcontroller直接注入到视图模型中,并从内部触发导航。然后,我可以通过以下方式从我的合成对象访问NavController:
为了构建嵌套的
NavGraph