android - Navigator.push() 永远循环

标签 android ios flutter dart

我正在制作一个登录屏幕,在登录屏幕中,我检查数据库中的数据,以了解每次打开应用程序时是否登录的用户。 如果用户登录,应用程序将切换到主屏幕。

我遇到问题,我登录了登录屏幕,然后应用程序切换到了主屏幕。但我的应用程序并不位于主屏幕中,它正在继续推送新的主屏幕并循环此推送操作。

我的代码:

goToHomeIfAvailable() async {
    // Go to HomeScreen if available
    if (await this._databaseProvider.tokenTableIsEmpty() == false) {
      print('Logged');
      Navigator.push(
        context,
        MaterialPageRoute(builder: (context) => HomeScreen()),
      );
    }
  }

@override
  Widget build(BuildContext context) {
    // In first times user open app=> create DB and go to HomeScreen if available
    _databaseProvider.openOrCreate().then((_) async {
      await goToHomeIfAvailable();
    });

    /* Return a widget bellow */
}

DatabaseProvider.dart:

class DatabaseProvider {
  String _path = 'O2_DB.db';
  Database _database;
  Map _tableName = {'token': 'token_tbl'};

  Future openOrCreate() async {
    this._database = await openDatabase(this._path, version: 1,
        onCreate: (Database db, version) async {
      await db.execute('CREATE TABLE IF NOT EXISTS ' +
          this._tableName['token'] +
          ' (token_id integer primary key autoincrement, token text)');
    });
  }
}

最佳答案

构建在应用程序生命周期中被多次调用 - 最好始终将我们的逻辑放在构建方法之外。它的正常行为。

在您的情况下 - 由于每次调用方法时都会调用构建 - goToHomeIfAvailable() 被调用,因此多次 push

goToHomeIfAvailable() 从构建中移出到 initState() 将解决该问题。

关于android - Navigator.push() 永远循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57962212/

相关文章:

ios - 如何获得从 awakeFromNib 到 mainViewController.m 的对象高度?

flutter - 如何从小部件包装中生成文本?

android - flutter moor - 仅更新指定的列而无需自定义查询

java - Android Studio SDK 路径错误

java - 启用 GPS 提供商时关闭对话框

android - Scaffold 主体中的有状态小部件

ios - 在 Swift 中,如何导入名称中带有破折号的目标?

ios - 如果我在iTC中添加IAP,目前没有IAP的上线应用会受到影响吗?

Flutter/Dart 在运行时导入文件

android - Android ListView 中的弹出菜单问题