flutter 以编程方式执行导航

ktca8awb  于 2023-02-25  发布在  Flutter
关注(0)|答案(1)|浏览(160)

我尝试在我的Flutter应用中实现深度链接逻辑。为了导航到我的目的地,并确保有正确的堆栈,我有时需要选择我的BottomNavigationBar上的正确标签,然后用TabController动画到我的TabBar的正确标签,滚动到我的ListView中的正确位置,然后按ListView中某个项目的DetailsScreen。但是,如果我的当前TabBottomNavigationBar上的当前状态已经打开了一个DetailsScreen,我首先需要弹出当前堆栈,然后推到例如列表中另一个项目的详细信息。

Navigator.of(context).pop();
Navigator.of(context).pushNamed(TabNavigatorRoutes.details, arguments: item);

的结果是pushName从未执行或只是在被推送后立即弹出,因为,我假设,pop()仍然在同一时间运行,所以它们会互相删除。
我修复了这个问题:

await Navigator.maybePop(context);
Navigator.of(context).pushNamed(TabNavigatorRoutes.details, arguments: item);

如果可能的话,它会弹出,并等待执行pushNamed,所以很好。

问题,我还有更深的屏幕,需要执行例如Navigator.of(context).popUntil((route) => route.isFirst);,以确保在执行另一个深链接之前弹出现有堆栈。这里也有同样的问题,下面的pushNamed将不会执行。Difference Navigator.of(context).popUntil((route) => route.isFirst);是一个void函数,因此我不能在这里使用wait。

我问ChatGPT的问题,并得到了以下解决方案,我应该用途:

Navigator.of(context).popUntil((route) => route.isFirst);
await Future.delayed(Duration.zero); // Wait for microtask queue to clear
Navigator.of(context).pushNamed(TabNavigatorRoutes.details, arguments: item);

这是有效的,但感觉是一个非常肮脏的解决方案。还有人有这个问题,并找到一个更好的解决方案?

suzh9iv8

suzh9iv81#

我终于解决了我的问题,通过调用使用一些基本:

while (Navigator.canPop(context)) {
   await Navigator.maybePop(context);
}
Navigator.pushNamed(context, TabNavigatorRoutes.details, arguments: item);

也许有人能告诉我这是否会有副作用或可能导致其他问题?我认为解决方案不是很理想,但比await Future.delayed(Duration.zero);更好,我欢迎建议!

相关问题