Flutter 如何检查应用程序中是否有用户登录
2019年,我设法检查了用户是否登录到该应用程序。不幸的是,从那时起,情况发生了很大变化。我试着搜索关于扑火的教程和指南。但是,我找不到。我对Flutter 如何检查应用程序中是否有用户登录,flutter,authentication,dart,firebase-authentication,flutter-futurebuilder,Flutter,Authentication,Dart,Firebase Authentication,Flutter Futurebuilder,2019年,我设法检查了用户是否登录到该应用程序。不幸的是,从那时起,情况发生了很大变化。我试着搜索关于扑火的教程和指南。但是,我找不到。我对流、未来和提供者感到非常困惑。我也不知道他们之间的区别 我的旧代码(不再有效): Future main()异步{ runApp( 变更通知提供者( 子项:MyApp(), 创建:(构建上下文){ 返回AuthService(); }, ), ); } 类MyApp扩展了无状态小部件{ //此小部件是应用程序的根。 @凌驾 小部件构建(构建上下文){ Sy
流
、未来
和提供者
感到非常困惑。我也不知道他们之间的区别
我的旧代码(不再有效):
Future main()异步{
runApp(
变更通知提供者(
子项:MyApp(),
创建:(构建上下文){
返回AuthService();
},
),
);
}
类MyApp扩展了无状态小部件{
//此小部件是应用程序的根。
@凌驾
小部件构建(构建上下文){
SystemChrome.setPreferredOrientations([DeviceOrientation.GraphitoUp,DeviceOrientation.GraphitoUp]);
返回材料PP(
debugShowCheckedModeBanner:false,
标题:“TestApp”,
主题:主题数据(原始样本:颜色。蓝色),
家:未来建设者(
future:Provider.of(context.getUser(),
生成器:(上下文,异步快照){
if(snapshot.connectionState==connectionState.done){
//将错误记录到控制台
如果(snapshot.error!=null){
打印(“错误”);
返回文本(snapshot.error.toString());
}
//重定向到正确的页面
返回snapshot.hasData?主页():LoginPage();
}否则{
//显示加载指示器
返回加载循环();
}
},
),
);
}
}
使用ChangeNotifier类AuthService{
final FirebaseAuth _auth=FirebaseAuth.instance;
未来的getUser(){
返回_auth.currentUser();
}
将来注销()异步{
var result=FirebaseAuth.instance.signOut();
notifyListeners();
返回结果;
}
未来登录用户({String email,String password})异步{
试一试{
var result=await FirebaseAuth.instance
.使用电子邮件和密码登录(电子邮件:电子邮件,密码:密码);
notifyListeners();
返回result.user;
}捕获(e){
抛出新的AuthException(e.code,e.message);
}
}
}
如何检查用户是否已登录?提前感谢您的帮助。创建一个全局firebase用户实例,并在第一个屏幕(如启动屏幕)上检查当前用户是否为空,然后根据结果导航到您选择的屏幕。这是我的代码,你可以稍微修改一下再试试
Future<void> tryAutoLogin() async {
firebaseUser = firebaseAuth.currentUser;
if (firebaseUser == null) return;
Response<AppUser> userDataResponse =
await DatabaseInterface.getUserData(firebaseUser?.uid);
if (userDataResponse.success) {
appUser = userDataResponse.data;
await appUser?.cacheAppUserData();
} else
return;
}
Future tryAutoLogin()异步{
firebaseUser=firebaseAuth.currentUser;
if(firebaseUser==null)返回;
响应userDataResponse=
等待DatabaseInterface.getUserData(firebaseUser?.uid);
if(userDataResponse.success){
appUser=userDataResponse.data;
等待appUser?.cacheAppUserData();
}否则
返回;
}
这适用于
Firebase Auth使您能够通过流
实时订阅此状态。调用后,流
立即提供用户当前身份验证状态的事件,然后在身份验证状态更改时提供后续事件。要订阅这些更改,请在FirebaseAuth实例上调用authStateChanges()
方法:
import'package:firebase_auth/firebase_auth.dart'作为auth;
进口“包装:颤振/材料.省道”;
导入“menu.dart”;
导入“login.dart”;
导入“dart:async”;
导入“包:flifter/services.dart”;
导入“包:firebase_core/firebase_core.dart”;
Future main()异步{
WidgetsFlutterBinding.ensureInitialized();
等待Firebase.initializeApp();
runApp(
MyApp()
);
}
类MyApp扩展了无状态小部件{
//此小部件是应用程序的根。
@凌驾
小部件构建(构建上下文){
SystemChrome.setPreferredOrientations([DeviceOrientation.GraphitoUp,DeviceOrientation.GraphitoUp]);
返回材料PP(
debugShowCheckedModeBanner:false,
标题:“TestApp”,
主题:主题数据(原始样本:颜色。蓝色),
主页:
StreamBuilder(
流:auth.FirebaseAuth.instance.authStateChanges(),
生成器:(BuildContext上下文,异步快照){
if(snapshot.hasData){
打印(“数据存在”);
返回主页();
}
否则{
返回登录页面();
}
},
)
);
}
}
您检查过文档了吗?是的。但我还是不明白。authStateChanges、idTokenChanges和userChanges之间有什么区别?
Future<void> tryAutoLogin() async {
firebaseUser = firebaseAuth.currentUser;
if (firebaseUser == null) return;
Response<AppUser> userDataResponse =
await DatabaseInterface.getUserData(firebaseUser?.uid);
if (userDataResponse.success) {
appUser = userDataResponse.data;
await appUser?.cacheAppUserData();
} else
return;
}
import 'package:firebase_auth/firebase_auth.dart' as auth;
import 'package:flutter/material.dart';
import 'menu.dart';
import 'login.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:firebase_core/firebase_core.dart';
Future main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(
MyApp()
);
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp, DeviceOrientation.portraitUp]);
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'TestApp',
theme: ThemeData(primarySwatch: Colors.blue),
home:
StreamBuilder<auth.User>(
stream: auth.FirebaseAuth.instance.authStateChanges(),
builder: (BuildContext context, AsyncSnapshot<auth.User> snapshot) {
if(snapshot.hasData) {
print("data exists");
return HomePage();
}
else {
return LoginPage();
}
},
)
);
}
}