每次刷新应用程序时都会触发 Flutter web Firebase onAuthStateChanges
Flutter web Firebase onAuthStateChanges gets triggered every time I refresh the app
我正在使用 flutter web 开发一个网络应用程序。
每次我刷新页面时,都会触发 onAuthStateChanges 并执行只有在 auth 状态发生变化时才应触发的功能。
这种行为是故意的吗?
为了订阅 onAuthStateChanges,我用一个有状态的小部件包装了我的主小部件并听取了 onAuthStateChanges,如此处建议:
Flutter Stream Builder Triggered when Navigator Pop or Push is Called
以下是我的代码:
我的包装器:
/// Wrapper for stateful functionality to provide onInit calls in stateles widget
class StatefulWrapper extends StatefulWidget {
final Function onInit;
final Widget child;
const StatefulWrapper({@required this.onInit, @required this.child});
@override
_StatefulWrapperState createState() => _StatefulWrapperState();
}
class _StatefulWrapperState extends State<StatefulWrapper> {
@override
void initState() {
if (widget.onInit != null) {
widget.onInit();
}
super.initState();
}
@override
Widget build(BuildContext context) {
return widget.child;
}
}
我的小部件在 main.dart:
Widget build(BuildContext context) {
var router = MyRouter.Router();
var authenticationService = locator<AuthenticationService>();
var sharedPreferences = locator<SharedPreferencesService>();
return StatefulWrapper(
onInit: () {
authenticationService.listenToAuthChanges();
},
child: FutureBuilder(
future: sharedPreferences.getSharedPreferences('ruolo'),
builder: (context, snapshot) {
return MaterialApp(
builder: ExtendedNavigator<MyRouter.Router>(
initialRoute: MyRouter.Routes.startupView,
guards: [AuthGuard(), AdminGuard()],
router: router,
navigatorKey: locator<NavigationService>().navigatorKey,
),
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
onGenerateRoute: router.onGenerateRoute,
);
}),
);
}
这是来自身份验证服务的方法:
void listenToAuthChanges() {
FirebaseAuth.instance.authStateChanges().listen((firebaseUser) async {
if (firebaseUser == null) {
navigationService.navigateTo(Routes.login);
} else {
navigationService.replaceWith(Routes.home);
}
});
}
当我在浏览器中刷新我的页面时,会触发此函数的侦听器,如果我没有登录,它会导航到登录,否则在主页上。
这是故意的吗?对我来说,监听器应该只在它监听的内容发生变化时触发。
应用加载时,Firebase 会检查用户的身份验证状态。在该过程的开始是使用空值调用任何活动的身份验证状态侦听器。如果用户可以通过身份验证,它就会调用带有用户配置文件对象的侦听器。
所以您所看到的确实在按预期工作。
我正在使用 flutter web 开发一个网络应用程序。
每次我刷新页面时,都会触发 onAuthStateChanges 并执行只有在 auth 状态发生变化时才应触发的功能。
这种行为是故意的吗?
为了订阅 onAuthStateChanges,我用一个有状态的小部件包装了我的主小部件并听取了 onAuthStateChanges,如此处建议: Flutter Stream Builder Triggered when Navigator Pop or Push is Called
以下是我的代码:
我的包装器:
/// Wrapper for stateful functionality to provide onInit calls in stateles widget
class StatefulWrapper extends StatefulWidget {
final Function onInit;
final Widget child;
const StatefulWrapper({@required this.onInit, @required this.child});
@override
_StatefulWrapperState createState() => _StatefulWrapperState();
}
class _StatefulWrapperState extends State<StatefulWrapper> {
@override
void initState() {
if (widget.onInit != null) {
widget.onInit();
}
super.initState();
}
@override
Widget build(BuildContext context) {
return widget.child;
}
}
我的小部件在 main.dart:
Widget build(BuildContext context) {
var router = MyRouter.Router();
var authenticationService = locator<AuthenticationService>();
var sharedPreferences = locator<SharedPreferencesService>();
return StatefulWrapper(
onInit: () {
authenticationService.listenToAuthChanges();
},
child: FutureBuilder(
future: sharedPreferences.getSharedPreferences('ruolo'),
builder: (context, snapshot) {
return MaterialApp(
builder: ExtendedNavigator<MyRouter.Router>(
initialRoute: MyRouter.Routes.startupView,
guards: [AuthGuard(), AdminGuard()],
router: router,
navigatorKey: locator<NavigationService>().navigatorKey,
),
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
onGenerateRoute: router.onGenerateRoute,
);
}),
);
}
这是来自身份验证服务的方法:
void listenToAuthChanges() {
FirebaseAuth.instance.authStateChanges().listen((firebaseUser) async {
if (firebaseUser == null) {
navigationService.navigateTo(Routes.login);
} else {
navigationService.replaceWith(Routes.home);
}
});
}
当我在浏览器中刷新我的页面时,会触发此函数的侦听器,如果我没有登录,它会导航到登录,否则在主页上。
这是故意的吗?对我来说,监听器应该只在它监听的内容发生变化时触发。
应用加载时,Firebase 会检查用户的身份验证状态。在该过程的开始是使用空值调用任何活动的身份验证状态侦听器。如果用户可以通过身份验证,它就会调用带有用户配置文件对象的侦听器。
所以您所看到的确实在按预期工作。