Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 如何检查应用程序中是否有用户登录_Flutter_Authentication_Dart_Firebase Authentication_Flutter Futurebuilder - Fatal编程技术网

Flutter 如何检查应用程序中是否有用户登录

Flutter 如何检查应用程序中是否有用户登录,flutter,authentication,dart,firebase-authentication,flutter-futurebuilder,Flutter,Authentication,Dart,Firebase Authentication,Flutter Futurebuilder,2019年,我设法检查了用户是否登录到该应用程序。不幸的是,从那时起,情况发生了很大变化。我试着搜索关于扑火的教程和指南。但是,我找不到。我对流、未来和提供者感到非常困惑。我也不知道他们之间的区别 我的旧代码(不再有效): Future main()异步{ runApp( 变更通知提供者( 子项:MyApp(), 创建:(构建上下文){ 返回AuthService(); }, ), ); } 类MyApp扩展了无状态小部件{ //此小部件是应用程序的根。 @凌驾 小部件构建(构建上下文){ Sy

2019年,我设法检查了用户是否登录到该应用程序。不幸的是,从那时起,情况发生了很大变化。我试着搜索关于扑火的教程和指南。但是,我找不到。我对
未来
提供者
感到非常困惑。我也不知道他们之间的区别

我的旧代码(不再有效):

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();
            }
          },
        )
    );
  }
}