我正在使用Firebase Auth和谷歌登录Flatter.我可以登录,但是当我关闭应用程序(杀死它)时,我必须重新注册.那么,有没有一种方法可以持续进行用户身份验证,直到用户明确注销?

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
  }
}

这是我的起始页,其中调用了auth check.

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,它可以按照你说的那样工作,我不保留任何登录令牌.然而,我不知道为什么你使用getUser的方法不起作用.

试着将代码调整为onAuthStateChanged.

基本上,在您的MaterialApp上,创建StreamBuilder侦听_auth.onAuthStateChanged,并根据身份验证状态 Select 您的页面.

我将复制并粘贴我的应用程序的部分内容,这样你就可以有一个 idea :

[...]

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.onAuthStateChanged,
    builder: (BuildContext context, snapshot) {
      if (snapshot.hasData && (!snapshot.data.isAnonymous)) {
        return HomePage();
      }

      return AccountLoginPage();
    },
  );
}

Flutter相关问答推荐

如何将图像从顶部和底部半向外设置为飘动

自动测试Flutter应用程序进行QA的最佳方法是什么?

我怎样才能判断一个字符串值是否为空(&Q;&Q;)?

DART 3.3:为什么扩展类型不起作用?

CLI数据库连接后将SHA-1密钥添加到Firebase项目

如何将 colored颜色 阴影作为默认容器 colored颜色 应用于自定义窗口小工具?

GitHub Actions工作流secret中的特殊字符未被保留

如何在flutter中使用youtube_explod_start加载下一页

带有附加图像的ListTile

Riverpod 2.0-如何使用FutureOr和AutoDisposeSyncNotificationer处理api状态代码?

如何将小部件代码移动到另一个文件以获得更好的可读性

如何修改来自合并 list 的 Android list 权限?

如何动态获取任何小部件的像素?

模块是使用不兼容的 kotlin 版本编译的.其元数据的二进制版本是1.8.0,预期版本是1.6

Flutter应用无法上传到Microsoft Store

Flutter - firebase_auth_web 5.4.0 依赖于 intl ^0.17.0 但我必须使用更高版本 (intl ^0.18.0)

如何使用 riverpod_annotation 创建非自动处置提供程序?

我可以定义一次 sharedPreferences 并在需要数据显示到 flutter 应用程序时调用它吗?

如何从 Flutter Slider Widget 中移除发光效果?

改变步进器的线条 colored颜色 Flutter