【问题标题】:Navigator push same screen multiple times导航器多次推送同一个屏幕
【发布时间】:2019-09-18 11:31:35
【问题描述】:

我需要在应用启动时自动推送新屏幕(如果用户登录或退出)。

我使用scoped_model 进行身份验证,因此当用户价值在模型中发生变化时需要导航。

我在这里遵循 Brian Egan 的建议:https://github.com/brianegan/scoped_model/issues/43#issuecomment-442444143

class LoginScreenState extends State<LoginScreen> {

  @override
  void didChangeDependencies() {
    ScopedModel.of<AuthModel>(context).addListener(_navigationListener);
    super.didChangeDependencies();
  }

  @override
  void dispose() {
    ScopedModel.of<AuthModel>(context)
        .removeListener(_navigationListener);
    super.dispose();
  }


  void _navigationListener() {

switch (ScopedModel.of<AuthModel>(context).AuthStatus) {
  case AuthStatus.NotAuth:
    Navigator.of(context).pushNamed(‘/Login’);
    break;
  case AuthStatus.Auth:
    Navigator.of(context).pushNamed(‘/Main’);
    break;
  case AuthStatus.Register:
    Navigator.of(context).pushNamed(‘/Register’);
    break;

  }

AuthStatus 是 Enum。我更改了Model 中的值。

这是正确的推送路线,但有问题:

同一条路线多次推送。例如,同一个登录页面至少被推送 5 次。

如何阻止 Navigator 多次推送同一屏幕?

谢谢!

【问题讨论】:

  • 我也有同样的问题,请问您解决了吗?

标签: dart flutter navigation flutter-navigation scoped-model


【解决方案1】:

在 Brian Egan 的示例中,他在 _navigationListener 方法中进行了布尔测试。他的评论是:

// 每次模型变化时都会运行这个函数!我们将使用它来 // 检查导航布尔值。如果设置为 true,我们将推送一个新屏幕! // // 如果没有,我们什么都不做。

因此,需要在您的代码中使用类似的布尔值,以便仅导航一次,尽管该方法被调用了多少次。

【讨论】:

    猜你喜欢
    • 2014-12-07
    • 2018-12-30
    • 1970-01-01
    • 2021-10-23
    • 2020-07-22
    • 1970-01-01
    • 2020-09-14
    • 2017-02-12
    • 2018-05-05
    相关资源
    最近更新 更多