【发布时间】:2024-05-20 18:45:01
【问题描述】:
我在应用程序中使用 Provider 和流 FirebaseAuth.instance.onAuthStateChanged 来决定在启动时重定向到哪里,但是虽然用户已经登录(从以前的启动),但应用程序在登录屏幕上启动并且几乎 1第二个稍后重定向到主页,它应该从第一刻开始。即使在飞行模式下也会发生这种情况。
我想知道有没有办法解决这个问题,即使不能一次显示主屏幕,我也不知道如何区分未登录的用户(null->登录屏幕) 和加载用户(null->加载屏幕)。
部分代码:
void main() {
WidgetsFlutterBinding.ensureInitialized();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
final FirebaseAuth _auth = FirebaseAuth.instance;
final DatabaseService db = DatabaseService();
@override
Widget build(BuildContext context) {
return StreamProvider<FirebaseUser>.value(
value: _auth.onAuthStateChanged,
child: Consumer<FirebaseUser>(
builder: (context, firebaseUser, child) {
return MultiProvider(
providers: [
if (firebaseUser != null)
ChangeNotifierProvider(create: (ctx) => CollectionState(firebaseUser)),
StreamProvider<List<Collection>>.value(value: db.streamCollections(firebaseUser)),
],
child: MaterialApp(
title: 'My App',
routes: {
'/': (ctx) => LandingPage(),
'/login': (ctx) => LoginPage(),
'/emailSignIn': (ctx) => EmailSignInPage(),
'/emailSignUp': (ctx) => EmailSignUpPage(),
'/emailUnverified': (ctx) => EmailUnverifiedPage(),
'/home': (ctx) => HomePage(),
'/settings': (ctx) => Settings(),
},
),
);
},
),
);
}
}
class LandingPage extends StatelessWidget {
final DatabaseService _db = DatabaseService();
@override
Widget build(BuildContext context) {
final user = Provider.of<FirebaseUser>(context);
final userCondition =
user == null ? 'null' : user.isEmailVerified ? 'verifiedUser' : 'unverifiedUser';
switch (userCondition) {
case 'null':
return LoginPage();
break;
case 'unverifiedUser':
return EmailUnverifiedPage();
break;
case 'verifiedUser':
return HomePage();
break;
}
}
}
代码稍微简化了一点,我使用一个服务作为身份验证实例,仅此而已。
【问题讨论】:
-
共享偏好
-
感谢您的回复冥想。你能再解释一下吗?
标签: flutter firebase-authentication