flutter - 如何拦截 Navigator.pop 并有条件地阻止导航返回?

标签 flutter dart

我正在寻找一种拦截导航的方法返回 有条件的。

用户/服务器可以修改应用程序的全局状态,如身份验证,导致页面导航到登录表单,但是当用户导航到屏幕 A 然后按 返回按钮 两次,用户仍然能够看到应该仅可用于登录 session 的小部件。

我已经尝试了所有我能想到的:

  • MaterialApp中的onGenerateRoute,但按下后退按钮时未触发
  • WillPop 是一个解决方案,但所有顶级小部件都必须包含在其中,我需要记住将身份验证状态传递给所有小部件,它不是真正可扩展的解决方案,但可以工作
  • navigatorObservers收到有关 Navigator.pop 事件的通知似乎无法阻止导航

  • 理想情况下,希望在每个小部件(如 back_button_interceptor)上使用钩子(Hook)来避免第 3 方依赖。

    它也应该适用于无状态小部件,其中 dispose()方法不可用。

    有没有办法获得类似单类/故障点“导航拦截器”的东西,它会返回真/假并能够根据条件修改飞行中的路线?

    最佳答案

    查看 WillPopScope 的实现,它利用了 ModalRoute 的 addScopedWillPopCallback() 函数。

    https://api.flutter.dev/flutter/widgets/ModalRoute/addScopedWillPopCallback.html

    如果您使用 onGenerateRoute 实现了路由器,则应该可以为您推送的每条路由添加通用检查。也许您甚至可以创建一个继承自包含该逻辑的 MaterialPageRoute 的自定义 Route 类。

    如果我正确理解了您的问题,我觉得拦截向后导航是错误的方法。当使用 Navigator.pushNamedAndRemoveUntil() 导航回登录屏幕时,我宁愿尝试从导航堆栈中删除未经授权的页面

    关于flutter - 如何拦截 Navigator.pop 并有条件地阻止导航返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61910377/

    相关文章:

    list - 在 Dart 中合并两个对象列表

    flutter - 'Response<dynamic>'实例flutter Api消费

    dart - 如何更改颜色滚动溢出指示器?

    dart - Dart 自定义元素中的extendTag

    flutter - 在我的文本中像变量一样使用sharedPreferences

    firebase - 如何在Flutter上使用Singleton Firebase服务?

    dart - 为什么我在polymer.dart 元素上遇到类型错误?

    dart - 如何正确覆盖MapBase的运算符[]

    dart - Flutter:检测键盘打开和关闭

    ruby-on-rails - HttpRequest.setRequestHeader在Dart上生成DOM异常11