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

标签 navigation flutter

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


/家
/登录
/设置


自然,我会检查用户是否已经在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/

相关文章:

android - 构建.gradle : The option 'android.enableR8' is deprecated and should not be used anymore

Flutter 在重新创建 Widget 时重置 StatefulWidget 状态

android-studio - ChangeNotifierProvider没有被调用

html - 简单的导航栏(初学者)

jquery - 使用 CSS 导航翻转并应用 jQuery

css - 将我的导航菜单链接居中

ios - 如何在 iOS 中使用 flutter_blue?

css - 当检查输入时,如何将 css 应用到父级的同级元素?

css - 使用css(导航菜单)在同一行显示多个div

flutter - flutter 重启应用程序或重定向到第一个小部件