断言失败:在 Flutter 中使用 Navigator.popUntil() 时 !_debugLocked 不正确

Posted

技术标签:

【中文标题】断言失败:在 Flutter 中使用 Navigator.popUntil() 时 !_debugLocked 不正确【英文标题】:Failed assertion: !_debugLocked is not true when using Navigator.popUntil() in Flutter 【发布时间】:2020-02-15 10:44:02 【问题描述】:

在我的颤振应用程序中,我使用此代码转到我的仪表板页面,但它第一次没有这样做,我收到 debugLocked 错误。

应用程序中的启动页面是一个路由器,用于检查共享首选项“sessionid”,如果设置,则将用户直接带到仪表板,否则将用户带到登录处。

如果没有下面的代码,我可以使用Navigator.pushReplacement() 很好地访问我的仪表板,但随后,appBar 上会出现一个后退箭头。这个后退按钮将应用程序带回路由器。

我搜索了有关如何从导航器中删除所有屏幕的答案,我找到了以下内容。

Navigator.of(context).popUntil(ModalRoute.withName(Dashboard.id));

使用上面的代码会给我debugLocked 错误。有没有办法缓解这个问题?或者还有其他有效的方法可以让我从上下文中删除屏幕吗?将automaticallyImplyLeading 设置为false 是否有帮助?因为只有在有人登录或注册后才会出现此错误。

【问题讨论】:

您想直接导航到上一页吗?如果是这种情况,您只需要使用: Navigator.pop(context); 另外,您可以更改导航并使用 Pages 引用而不是 Routes,我认为这是在 Flutter 上导航的更好方式 不,我不想导航到上一页。其次,您能否详细说明使用页面引用是什么意思?它比路线好在哪里? 您可以使用对页面的引用进行导航,例如: Navigator.push(HomePage()) 对我来说更好,因为您不需要为每个页面创建路由并且更容易传递参数到不同的页面,这是我的偏好,我认为这是在 Flutter 中导航的推荐方式 据我所知,我不了解这些术语。然而,那个骗子并没有回答我的问题。 【参考方案1】:

要删除所有以前的路线,请使用Navigator.pushAndRemoveUntil()

【讨论】:

我会试试这个并告诉你! 是的,这解决了问题。如果我可以原谅..你能解释一下为什么 popUntil 方法在这里失败了吗?或者为什么pushAndRemoveUntil比前者好? PushAndRemoveUntil 并不比 PushReplacement 好。我可以解释实际上非常微不足道的差异。 PushReplacement 通过推送指定的路径然后删除之前的路径来替换当前的导航器路径,而不是 PushAndRemoveUntil 删除所有之前的路径。不幸的是,除非我看到您的代码,否则我无法向您解释为什么 popUntil 不起作用【参考方案2】:

如果您出于某种原因遇到 setState 错误,这可以是另一种选择。

navigationService.popUntil((_) => true);
navigationService.navigateTo(
  'authentication',
);

基本上我等到导航完成设置所有内容然后调用navigateTo。

【讨论】:

以上是关于断言失败:在 Flutter 中使用 Navigator.popUntil() 时 !_debugLocked 不正确的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:ClipPath() 小部件中的断言失败错误

Flutter RenderObject 断言失败

断言在 Web 版本上失败,但在 iOS Flutter 上成功

Flutter with Firebase Google 登录:断言失败 network_image_io.dart

Flutter - 断言失败:第 61 行第 12 行:'_route == ModalRoute.of(context)':不正确

颤动:使用navigator.dart时失败断言