每次刷新应用程序时都会触发Flutter Web Firebase onAuthStateChanges

时间:2020-09-10 17:05:01

标签: firebase flutter firebase-authentication flutter-web

我正在使用Flutter Web开发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,
            );
          }),
    );
  }

这是来自authenticationService的方法:

  void listenToAuthChanges() {
    FirebaseAuth.instance.authStateChanges().listen((firebaseUser) async {
      if (firebaseUser == null) {
        navigationService.navigateTo(Routes.login);
      } else {
         navigationService.replaceWith(Routes.home);
      }
    });
  }

发生的事情是,当我在浏览器中刷新页面时,此函数的侦听器被触发,并且如果我没有登录,它将导航到登录名,否则返回首页。

这是故意的吗?对我而言,仅当听众的声音发生变化时,听众才应触发。

1 个答案:

答案 0 :(得分:1)

应用加载后,Firebase会检查用户的身份验证状态。在该过程开始时,将调用具有空值的任何活动身份验证侦听器。如果用户可以通过身份验证,则它将使用用户配置文件对象调用侦听器。

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

相关问题