firebase - 使用 StreamProvder 获取用户身份验证更改
问题描述
我正在使用Wrapper
Class 结合Firebase Streams
将用户重定向到LogInPage
或HomePage
。
下面是main.dart
和Wrapper
类。
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return StreamProvider<Users>.value(
value: AuthenticationService(FirebaseAuth.instance).user,
child: MaterialApp(
title: 'Flutter Demo',
debugShowCheckedModeBanner: false,
home: Wrapper(),
),
);
}
}
class Wrapper extends StatelessWidget {
@override
Widget build(BuildContext context) {
final user = Provider.of<Users>(context);
print(user == null ? "null id" : "${user.userId}");
return user == null
? LoginPage()
: HomePage();
}
}
下面是我Authentication Class
和我调用authentication method
.
onTap: () async {
dynamic user = await _auth.verifySMS(
widget.verificationId,
code,
context,
);
if (user == null) {
showDialog(
context: context,
builder: (BuildContext context) {
return CustomDialogBox(
title: "Error",
descriptions: "Can not Login now.",
text: "Try Again",
);
});
}
},
class AuthenticationService {
final FirebaseAuth _firebaseAuth;
AuthenticationService(this._firebaseAuth);
// Getting user from firebase
Users _getUserFromFirebase(User user) {
return user != null
? Users(
userId: user.uid,
)
: null;
}
// Stream<User> get authStateChanges => _firebaseAuth.idTokenChanges();
Stream<Users> get user {
return _firebaseAuth.authStateChanges().map(_getUserFromFirebase);
}
// authentication methods which returns _getUserFromFirebase.
}
验证成功后,我可以userId
从Wrapper Class
. 但我得到的不是第二张图片。一旦我重新启动我的应用程序,我就会被重定向到主页。
解决方案
Firebase Socket 连接不适用于模拟器。不知道为什么。如果您在真实设备上进行测试,您可能会得到预期的结果。
推荐阅读
- r - 匹配特殊字符前的字符串
- php - Cron 运行时无法打开输入文件
- node.js - 部署只有一个用户的 Web 应用程序
- python - 经理不可用;'auth.User' 已替换为 'account.Account'
- lua - 为什么lua require不会搜索当前目录?
- r - 带有数据集输入的 R 闪亮仪表板信息框
- r - R 如何从理货中制作词云?
- c++ - 在 Visual Studio 中使用 tesseract 库获取链接器错误
- opencv - 我在人脸识别程序中遇到了一个错误。(-215:断言失败)函数'cv::CascadeClassifier::detectMultiScale'中的!empty()
- mysql - 创建带有时间戳的 CSV 文件的 SQL 查询