Flutter-根据登录状态以不同的路线启动应用

chr*_*rkl 6 navigation flutter

我正在寻找一种方法来根据登录状态在应用程序启动时显示不同的屏幕。例如,我定义了以下路由:

  • /家
  • /登录
  • /设置

当然,我会检查用户是否已经在main()方法中登录,然后将initialRouteMaterialApp的设置为/ login或/ home。成功登录后,我可以调用Navigator.pushReplacement导航到/ home,并从堆栈中删除登录屏幕。不幸的是,我总是必须为MaterialApp 定义路线/或设置其home属性。因此,如果我将其设置/为blank Container(),则此Container将位于导航堆栈中,并且用户可以返回到该空白屏幕。

我想到的两个选择是:

  • 将MaterialApp的home属性设置为HomeScreen或LoginScreen
  • build()如果用户尚未登录,则返回HomeScreen 方法中的LoginScreen

这两个选项都是可行的,但随后我必须提出一些重载逻辑并重新设置状态,以更新home属性或HomeScreen。

有什么想法在Flutter中处理此类案件的正确方法是什么?

Tim*_*gus 23

也许,你可以这样做。假设您有一个带有异步方法的 Auth 类isLogged

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;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

您可以使用myApp构造函数传递initialRoute,并根据登录状态决定初始路由。然后,您可以将 的实例传递myApprunApp

警告:如果出现错误,请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);
}
Run Code Online (Sandbox Code Playgroud)

之后,您必须修改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(),
      },
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。