每次刷新应用程序时都会触发 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 会检查用户的身份验证状态。在该过程的开始是使用空值调用任何活动的身份验证状态侦听器。如果用户可以通过身份验证,它就会调用带有用户配置文件对象的侦听器。

所以您所看到的确实在按预期工作。