Flutter-如何使用Firebase拥有动态主页?

时间:2018-07-15 11:09:12

标签: android firebase firebase-authentication flutter

我是Flutter和Firebase的新手,正在开发身份验证应用程序。 如果用户已经登录,如何使应用程序转到主页;如果没有用户登录,如何使应用程序转到LoginPage。 原谅我生锈的代码。

FirebaseAuth auth = Firebase.instance;
void main() {

  Future<bool> home() async {
    if (await auth.currentUser() == null) {
      return false;
    }
    return true;
  }

  runApp(
    new MaterialApp(
      title: 'DASH',
      home: home() == null ? LoginScreen() : HomeScreen(),
      theme: DashTheme.theme,
      color: DashTheme.white,
      routes: <String, WidgetBuilder>{
      // Set routes for using the Navigator.
       '/home': (BuildContext context) => new HomeScreen(),
       '/login': (BuildContext context) => new LoginScreen(),
      },
    ),
  );
}

4 个答案:

答案 0 :(得分:1)

我正在使用Future Builder

 Widget _getLandingPage() {
return FutureBuilder<FirebaseUser>(
  future: FirebaseAuth.instance.currentUser(),
  builder: (BuildContext context, AsyncSnapshot<FirebaseUser> snapshot){
    if (GlobalStore.state.userConfig != null && GlobalStore.state.userConfig.isDisplayIntroScreen == true) {
      return routes.buildPage('intro_screen', null);
    }

    if (snapshot.hasData) {
      return routes.buildPage('main', null);
    } else {
      return routes.buildPage('auth', null);
    }
  },);

home: _getLandingPage(),

答案 1 :(得分:0)

虽然我从没用Dart语言写过任何东西,但我可以看到您写了一些好的开始。如果我们看一下这一行:

home: home() == null ? LoginScreen() : HomeScreen(),

您正在检查home()是否已登录。但是,您正在检查方法的返回对象为null时返回值是否为Future<bool>。 (这意味着在这种情况下,条件始终为false)。

还要注意,此方法为async。这意味着您将不会真正知道该方法何时真正完成执行。 (这是 未来 中的一刻)。

也就是说,一旦应用启动,您应该显示初始页面。然后,您应该运行并检查future方法的返回值。根据文档(https://www.dartlang.org/tutorials/language/futures),可以这样完成:

// Call this after the initialization of your app and pages

final future = home();
future.then((isLoggedIn) => ); // Inside here you need to do a navigation to the homepage or loginpage

答案 2 :(得分:0)

需要对代码进行一些修改。

您可以执行以下操作,而不是在主要功能中检查当前用户,而是在 initState()功能中检查用户。

@override
  void initState()
  {
    super.initState();

    final FirebaseAuth _auth = FirebaseAuth.instance;
    if(_auth.currentUser() == null)
    {
       Navigator.of(context).pushNamedAndRemoveUntil("/LoginScreen" , (Route<dynamic> route) => false);
    }
    else
    {
      Navigator.of(context).pushNamedAndRemoveUntil("/HomeScreen" , (Route<dynamic> route) => false);
    }

  }
如果您不希望用户返回上一个场景或路线,则使用

pushNamedAndRemoveUntil

您可以阅读有关抖动here中的导航的信息。并使用您需要的那个。

答案 3 :(得分:0)

非常感谢您提供所有答案。 我正在检查答案,这就是我遇到的问题。 我不知道这是不是正确的做法,但它确实有效。 这是代码:


Widget _getLandingPage() {
return StreamBuilder<FirebaseUser>(
  stream: FirebaseAuth.instance.onAuthStateChanged,
  builder: (BuildContext context, snapshot) {
    if (snapshot.hasData) {
      if (snapshot.data.providerData.length == 1) {
        return snapshot.data.isEmailVerified ? HomeScreen() : VerifyEmailScreen();
      } else {
        return HomeScreen();
      }
    } else {
      return LoginScreen();
    }
  },
);

}

home: _getLandingPage(),