我是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(),
},
),
);
}
答案 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(),