firebase - Flutter Firebase 身份验证:StreamBuilder 中的 authStateChanges() 方法无法从 LoginScreen 更改为 Dashboard
问题描述
我在文件中使用小部件StreamBuilder
的home
属性,以便在提供的包的帮助下在 WelcomeScreen(包含登录和注册按钮)和 DashboardScreen 之间导航。但每当我登录或注册时,它只会停留在该屏幕上,直到我手动热重载应用程序。我必须热重新加载应用程序才能从登录屏幕到仪表板。Firebase 身份验证工作正常。我可以看到用户在 firebase 控制台中注册。但是屏幕不会自动改变。此外,登录或注册代码后没有方法。MaterialApp()
main.dart
authStateChanges()
firebase_auth
Navigator.push()
主要飞镖:
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:banquet_owner_app/screens/welcome_screen.dart';
import 'package:banquet_owner_app/screens/dashboard.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: StreamBuilder(
stream: FirebaseAuth.instance.authStateChanges(),
builder: (context, userSnapshot) {
if (userSnapshot.hasData) {
return Dashboard();
}
return WelcomeScreen();
},
),
);
}
}
解决方案
您需要获取流的状态,然后检查它是否有数据
这是怎么做
home: StreamBuilder(
stream: FirebaseAuth.instance.authStateChanges(),
builder: (context, userSnapshot) {
if (userSnapshot.connectionState == ConnectionState.waiting) {
//loading screen
}
if (userSnapshot.connectionState == ConnectionState.done) {
//state is loaded check if snapshot has data
if (userSnapshot.hasData) {
return Dashboard();
}else{
return WelcomeScreen();
}
},
推荐阅读
- php - Laravel 会话 Cookie 过期更改
- c - strcmp 函数在另一个函数中返回值
- celery - Apache Airflow:将airflow.cfg 指向postgres 后,它仍然尝试在MySQL 上运行
- android - 应用程序退出而不是进入下一个活动
- c - 如何在C中的冒泡排序函数中保持while循环
- c# - RestSharp C# HTTP POST Oauth 1
- javascript - 试图从数字列表中提取数组值,但值返回无效的数组长度
- mongodb - 在 MongoDB 中获取 groupby 值的总和
- python - 使用 pandas 从由另一列分组的单列绘制三重条形图
- python - 如何将密钥对值添加到打开的 csv 文件中?