firebase - 持久化用户身份验证 Flutter Firebase

我在 Flutter 中使用 Firebase Auth 和谷歌登录。我可以登录,但是当我关闭应用程序(杀死它)时,我必须重新注册。那么有没有办法保持用户身份验证直到用户特别注销? 这是我的身份验证类(class)

import 'package:firebase_auth/firebase_auth.dart';
import 'package:google_sign_in/google_sign_in.dart';

class Auth {
  FirebaseAuth _firebaseAuth;
  FirebaseUser _user;

  Auth() {
    this._firebaseAuth = FirebaseAuth.instance;
  }

  Future<bool> isLoggedIn() async {
    this._user = await _firebaseAuth.currentUser();
    if (this._user == null) {
      return false;
    }
    return true;
  }

  Future<bool> authenticateWithGoogle() async {
    final googleSignIn = GoogleSignIn();
    final GoogleSignInAccount googleUser = await googleSignIn.signIn();
    final GoogleSignInAuthentication googleAuth =
    await googleUser.authentication;
    this._user = await _firebaseAuth.signInWithGoogle(
      accessToken: googleAuth.accessToken,
      idToken: googleAuth.idToken,
    );
    if (this._user == null) {
      return false;
    }
    return true;
    // do something with signed-in user
  }
}

这是我调用身份验证检查的起始页面。

import 'package:flutter/material.dart';
import 'auth.dart';
import 'login_screen.dart';
import 'chat_screen.dart';

class Splash extends StatefulWidget {

  @override
  _Splash createState() => _Splash();
}

class _Splash extends State<Splash> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: CircularProgressIndicator(
          value: null,
        ),
      ),
    );
  }

  @override
  void initState() {
    super.initState();
    _handleStartScreen();
  }

  Future<void> _handleStartScreen() async {
    Auth _auth = Auth();
    if (await _auth.isLoggedIn()) {
      Navigator.of(context).pushReplacementNamed("/chat");
    }
    Navigator.pushReplacement(context, MaterialPageRoute(builder: (BuildContext context) => LoginScreen(auth: _auth,)));
  }
}

最佳答案

我相信你的问题是路由。在我的应用程序中,我使用 FirebaseAuth 并且它可以按照您所说的那样工作,并且我不会保留任何登录 token 。但是,我不知道为什么您使用 getUser 的方法不起作用。

尝试调整您的代码以使用 onAuthStateChanged。编辑:截至 2022 年,使用 Flutter 3,我注意到它使用 userChanges 效果更好。

基本上,在您的 MaterialApp 上,创建一个 StreamBuilder 监听 _auth.userChanges() 并根据 Auth 状态选择您的页面。

我将复制并粘贴我的应用程序的部分内容,以便您有所了解:

[...]

final FirebaseAuth _auth = FirebaseAuth.instance;

Future<void> main() async {
  FirebaseApp.configure(
    name: '...',
    options:
      Platform.isIOS
        ? const FirebaseOptions(...)
        : const FirebaseOptions(...),
    );
  
  [...]  

  runApp(new MaterialApp(
    title: '...',
    home: await getLandingPage(),
    theme: ThemeData(...),
  ));
}

Future<Widget> getLandingPage() async {
  return StreamBuilder<FirebaseUser>(
    stream: _auth.userChanges(),
    builder: (BuildContext context, snapshot) {
      if (snapshot.hasData && (!snapshot.data!.isAnonymous)) {
        return HomePage();
      }
      
      return AccountLoginPage();
    },
  );
}

https://stackoverflow.com/questions/54469191/

相关文章:

android - flutter Assets 错误 : EXCEPTION CAUGHT BY

dart - Flutter:禁用应用程序的屏幕截图

dart - 如何在继续 flutter 之前等待 future 的对象?

flutter - Hummingbird(现在是 Flutter for web)计划发布。我应该

dart - 如何在 Flutter 中清除 AnimatedList 中的所有项目

flutter - 使用 FadeInImage Flutter 正确拟合图像

dart - Flutter - 关闭小部件时 BLoC 流实例会导致内存泄漏吗?

dart - ListView.builder 在 flutter 中逐项滚动

dart - Flutter - 在 BottomNavigationBar 中显示一个 Popup

android - Flutter 随机崩溃并删除 Flutter 文件