[英]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()(应用程序/无应用程序)。
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.