Flutter-Firebase auth onAuthStateChanged不显示仪表板



我是Flutter的新手,在实现Firebase身份验证时遇到了一些问题。

所以,我有一个MaterialApp小部件,我已经注册了一些路线。我有一个包装器StreamBuilder,它侦听Firebase onAuthStateChanged事件,每次我有新的用户值时,MaterialApp都会接收到该新值。

我的问题是,我无法找到将用户导航到登录屏幕(如果没有当前用户(或仪表板(如果当前用户有效(的最佳方式。你能帮我吗?我在网上找到的每个解决方案都没有实现路由,相反,它们都返回了一个小部件。有没有办法通过路线做到这一点?

我的主要类代码如下:

void main() async {
// Catch all exceptions and print them to log.
FlutterError.onError = (FlutterErrorDetails details) {
logger.e("", details.exception, details.stack);
};
// Initialize main engines.
WidgetsFlutterBinding.ensureInitialized();
await EasyLocalization.ensureInitialized();
// Start main app.
runApp(
EasyLocalization(
supportedLocales: [
Locale('en', 'US'),
Locale('el', 'GR')
],
path: 'assets/translations',
fallbackLocale: Locale('en', 'US'),
useFallbackTranslations: true,
child: App(),
),
);
}
class App extends StatelessWidget {
// Future to initialize firebase.
final Future<FirebaseApp> _initialization = Firebase.initializeApp(
options: FirebaseOptions(
apiKey: "*****************",
authDomain: "*****************",
projectId: "*****************",
storageBucket: "*****************",
messagingSenderId: "*****************",
appId: "*****************",
measurementId: "*****************")
);
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: _initialization,
builder: (context, snapshot) {
// Check for errors
if (snapshot.hasError) {
logger.e("Error while retrieving firebase credentials.", snapshot.error);
return CircularProgressIndicator();
}
// Once complete, show your application
if (snapshot.connectionState == ConnectionState.done) {
return StreamBuilder<User?>(
stream: Authentication.onAuthStateChanged,
builder: (context, snapshot) {
// Extract user from snapshot.
final User? user = snapshot.data;
return StreamProvider<TreatUser?>(
create: (_) => TreatUser.streamUser(context, user?.uid),
initialData: null,
child: MaterialApp(
title: "[Dashboard]",
theme: Themes.mainTheme(context),
darkTheme: Themes.mainThemeDark(context),
themeMode: ThemeMode.light,
debugShowCheckedModeBanner: true,
localizationsDelegates: context.localizationDelegates,
supportedLocales: context.supportedLocales,
locale: context.locale,
routes: {
AppRoutes.login: (context) => LoginScreen(),
AppRoutes.passReset: (context) => ResetPassScreen(),
AppRoutes.dashboard: (context) => DashboardScreen(),
AppRoutes.user_profile: (context) => UserProfile(),
AppRoutes.items: (context) => ItemsScreen(),
},
initialRoute: user != null ? AppRoutes.dashboard : AppRoutes.login,
),
);
},
);
}
logger.d("Firebase not connected yet. Waiting.");
// Otherwise, show something whilst waiting for initialization to complete
return CircularProgressIndicator();
},
);
}
}

提前感谢您的帮助和时间!

当Material应用程序下有多个脚手架时(在身份验证过程之前(,就会发生这种情况。因此authStateChanges被另一个替换,并且没有响应。

解决方案是在initialRoute或home参数中使用FirebaseAuth.currentUser。

登录后,手动按下仪表板并删除所有以前的屏幕。

同样,您也可以在注销时执行此操作。

最新更新