我尝试在我的Flutter应用中实现深度链接逻辑。为了导航到我的目的地,并确保有正确的堆栈,我有时需要选择我的BottomNavigationBar
上的正确标签,然后用TabController
动画到我的TabBar
的正确标签,滚动到我的ListView
中的正确位置,然后按ListView
中某个项目的DetailsScreen
。但是,如果我的当前Tab
在BottomNavigationBar
上的当前状态已经打开了一个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);
这是有效的,但感觉是一个非常肮脏的解决方案。还有人有这个问题,并找到一个更好的解决方案?
1条答案
按热度按时间suzh9iv81#
我终于解决了我的问题,通过调用使用一些基本:
也许有人能告诉我这是否会有副作用或可能导致其他问题?我认为解决方案不是很理想,但比
await Future.delayed(Duration.zero);
更好,我欢迎建议!