Navigator.push()永远循环

时间:2019-09-16 18:04:21

标签: android ios flutter dart

我正在创建一个LoginScreen,在LoginScreen中,每次打开应用程序时,我都会检查数据库中的数据以了解是否已登录的已知用户。 如果用户登录,则该应用程序将切换到HomeScreen。

我遇到问题,我已经登录LoginScreen,然后该应用程序切换到HomeScreen。但是我的应用程序不在HomeScreen中,而是继续推送新的HomeScreen并循环执行此推送操作。

我的代码:

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)');
    });
  }
}

1 个答案:

答案 0 :(得分:0)

在应用程序的生命周期中,Build被多次调用-最好始终将我们的逻辑置于build方法之外。它是正常行为。

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

goToHomeIfAvailable()的版本移出initState()将解决此问题。