繁体   English   中英

Flutter web 页面刷新后 firebase 中的持久性问题 session 身份验证

[英]Flutter web issue with persistence session in firebase auth after page refresh

我最近将 Flutter SDK 升级到 v3.0.5 并为 Flutter web 构建了一个登录界面,使用 Email 将其与 Firebase 身份验证连接起来。登录、注销和注册都成功地工作(即路由到正确的页面)。

但是在登录时,在调试期间刷新 web 页面/热重载时,session 丢失并且页面路由回登录页面。

我尝试使用这两种方法检查当前用户是否为 null:

方法一:

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    User? user = FirebaseAuth.instance.currentUser;

    return MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        scaffoldBackgroundColor: Colors.white,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: user == null ? LoginPage() : HomePage(),
    );
  }
}

方法二:

class _LoginPageState extends State<LoginPage> {
  TextEditingController? emailText = TextEditingController();
  TextEditingController? passwordText = TextEditingController();
  User? user = FirebaseAuth.instance.currentUser;

  @override
  void initState() {
    super.initState();
    FirebaseAuth.instance.authStateChanges().listen((user) {
      if (user != null) {
        Navigator.push(
            context,
            MaterialPageRoute(
              builder: (context) => HomePage(),
            ));
      }
    });
  }

还尝试使用 Firebase 持久化 session 方法,我不确定这是否是从 onPressed 按钮调用它的正确方法:

      ElevatedButton(
        child: Text('Login'),
        onPressed: () async {
          try {
            await FirebaseAuth.instance
                .signInWithEmailAndPassword(
                    email: emailText!.text,
                    password: passwordText!.text)
                .then((value) async {
              await FirebaseAuth.instance
                  .setPersistence(Persistence.SESSION)
                  .then((_) async {
                Navigator.push(
                    context,
                    MaterialPageRoute(
                      builder: (context) => HomePage(),
                    ));
              });
            });
          } on FirebaseAuthException catch (e) {
            print(e.message.toString());
          } catch (e) {
            print(e.toString());
          }
        },
      ),

然而,以上都不起作用。

此外,我还遇到了 Firebase.initializeApp 刷新后抛出异常,相关

“FirebaseError: Firebase: No Firebase App '[DEFAULT]' 已创建

  • 调用 Firebase App.initializeApp()(应用程序/无应用程序)。

错误1 错误 2

Firebase 的安装与 main.dart 和 index.html 文档中提到的步骤类似。

注意:我在去年从事的上一个项目中复制了相同的代码,该项目运行良好,没有任何问题。

您是否尝试过将软件包更新到最新版本?

根据这个答案,这些版本解决了这个问题: firebase_core: ^1.20.0 firebase_auth: ^3.6.0 cloud_firestore: ^3.4.1

对我有用的一个修复是确保在调试时使用:

flutter run -d chrome --web-port=50000 (或任何你喜欢的端口)。

默认情况下,web 应用程序将在运行之间清除所有数据,添加一个端口将停止此操作。 (也许端口是随机生成的,数据被键控到那个端口)

您还应该确保它不是异步问题并使用:

final user = await FirebaseAuth.instance.authStateChanges().first;

而不是仅仅尝试获取可能没有机会填充的用户属性 ( FirebaseAuth.instance.currentUser )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM