我正在制作一个登录屏幕,在登录屏幕中,我检查数据库中的数据,以了解每次打开应用程序时是否登录的用户。 如果用户登录,应用程序将切换到主屏幕。
我遇到问题,我登录了登录屏幕,然后应用程序切换到了主屏幕。但我的应用程序并不位于主屏幕中,它正在继续推送新的主屏幕并循环此推送操作。
我的代码:
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/