我正在寻找一种方法来根据登录状态在应用程序启动时显示不同的屏幕。例如,我定义了以下路由:
/家
/登录
/设置
自然,我会检查用户是否已经在main()
方法中登录,然后将我的MaterialApp的initialRoute
设置为/ login或/ home。成功登录后,我可以调用Navigator.pushReplacement
导航到/ home,并从堆栈中删除登录屏幕。不幸的是,我总是必须为/
定义路由或设置MaterialApp的home
属性。因此,如果将/
设置为空白的Container()
,则此Container将位于导航堆栈中,并且用户可以返回到该空白屏幕。
我想到的两个选择是:
将MaterialApp的home属性设置为HomeScreen或LoginScreen
如果用户尚未登录,则在HomeScreen的build()
方法中返回LoginScreen。
这两个选项都是可行的,但随后我必须提出一些重载逻辑并重新设置状态,以更新home属性或HomeScreen。
有什么想法在Flutter中处理此类案件的正确方法是什么?
最佳答案
也许,你可以做到这一点。假设您有一个带有异步方法isLogged
的Auth类。
class Auth {
final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
Future<bool> isLogged() async {
try {
final FirebaseUser user = await _firebaseAuth.currentUser();
return user != null;
} catch (e) {
return false;
}
}
}
您可以使用
myApp
构造函数传递initialRoute
,并根据登录状态决定初始路由。然后,您可以将myApp
的实例传递给runApp
:警告:如果出现错误,请在
WidgetsFlutterBinding.ensureInitialized();
之前添加void main() async {
。检查此问题#40253。void main() async {
WidgetsFlutterBinding.ensureInitialized();
final Auth _auth = Auth();
final bool isLogged = await _auth.isLogged();
final MyApp myApp = MyApp(
initialRoute: isLogged ? '/home' : '/',
);
runApp(myApp);
}
之后,您必须修改
myApp
类以在构造函数中传递初始路由:class MyApp extends StatelessWidget {
final String initialRoute;
MyApp({this.initialRoute});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Dynamic Route Demo',
initialRoute: initialRoute,
routes: {
'/': (context) => LoginPage(),
'/home': (context) => HomePage(),
'/settings': (context) => SettingsPage(),
},
);
}
}
希望这可以帮助。
关于navigation - Flutter-根据登录状态以不同的路线启动应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53194574/