【问题标题】:Set dynamic intitial route in flutter with firebase使用firebase在flutter中设置动态初始路由
【发布时间】:2020-08-26 17:40:15
【问题描述】:

我是 Flutter 和 Firebase 开发的新手,我有一个问题: 我有 2 条路线:SignInRoute 和 HomeRoute,当应用程序启动时,用户将被重定向到取决于 currentUser 的屏幕。 如果 CurrentUser != null => 将他重定向到 homeScreen 否则重定向到 SignInScreen。 如何将此逻辑添加到 main.dart。 这是我的代码,当我运行它时,它总是将 SignInScreen.routeName 作为初始路由:

import 'package:books_library_app/routes.dart';
import 'package:books_library_app/theme.dart';
import 'package:books_library_app/ui/views/home/home_view.dart';
import 'package:books_library_app/ui/views/auth/sign_in_view.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';


void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {

  FirebaseUser user;
  
  @override
  void initState() {
    super.initState();
    getCurrentUser();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter Demo',
      theme: theme(),
      initialRoute:
          (user != null) ? HomeView.routeName : SignInScreen.routeName,
      routes: routes,
    );
  }

  getCurrentUser() async {
    FirebaseUser currentUser;
    currentUser = await FirebaseAuth.instance.currentUser();
    setState(() {
      user = currentUser;
    });
  }
}

【问题讨论】:

  • 最直接的方法是创建一个默认登录页面,检查用户是否登录,然后将其转发到相应的页面。
  • 我之前试过这个,我创建了一个名为 Welcome 的屏幕 (statefullWidget) 并将其设置为初始路线,在这个小部件中我输入了我的逻辑,但问题是我无法导航到带有命名路线的屏幕,因为在欢迎屏幕中必须返回一个小部件。
  • “必须返回一个小部件”?您的逻辑的哪一部分需要返回一个小部件?

标签: firebase flutter dart firebase-authentication


【解决方案1】:

问题可能是因为让用户函数异步,所以首先在构建欢迎页面时,用户的初始值为 null,当它更新时,小部件已经构建,因此您可以做的一种方法是创建欢迎页面作为加载屏幕或应用的任何启动屏幕并在 getcurrentuser 函数中

 getCurrentUser() async {
    FirebaseUser currentUser;
    currentUser = await FirebaseAuth.instance.currentUser();
    if(currentuser==null){
//push to signin page
} 
else{
//push to home page
}
}

初始化函数

 void initState() {
    getCurrentUser();
     super.initState();
  }

谢谢,如果您仍然遇到一些问题,我希望它会帮助您告诉我

【讨论】:

  • 谢谢,我会尝试告诉你,我还有其他问题,我可以在加载屏幕中调用 getCurrentUser 吗?
  • 您的登录页面是 initstate 中的加载屏幕,您将调用此函数,一旦此函数完成,您将被导航到主页或登录页面,我将使用 initstate 函数更新答案
猜你喜欢
  • 2019-12-06
  • 2019-01-25
  • 2016-07-09
  • 1970-01-01
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多