当前位置: 首页 > 知识库问答 >
问题:

使用onAuthStateChanged使用Flutter的Firebase登录

金霄
2023-03-14

在Flutter之外,当我实现firebase身份验证时,我总是使用firebase提供的onAuthStateChanged侦听器来确定用户是否登录并相应地响应。

我正在尝试使用flutter做一些类似的事情,但是我可以找到一种访问FireBase的onAuthStateChanged的方法。我正在使用firebaseauth和googlesignin Flutter插件。我正在处理包含在firebaseauth Flutter插件中的示例代码。下面是示例代码。我可以用google sign in成功登录,但是示例太简单了,因为我想要有一个观察器/监听器来检测用户的已登录/退出状态。

有没有一种方法可以通过观察者/监听器使用firebase_auth/google_signin flutter插件来检测用户的状态?

最终,我希望应用程序确定用户是否已登录(是/否)。如果不是,则显示一个登录屏幕,如果是,则显示我的主应用程序页面。

import 'dart:async';
import 'dart:io';

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

final FirebaseAuth _auth = FirebaseAuth.instance;
final GoogleSignIn _googleSignIn = new GoogleSignIn();

void main() {
  runApp(new MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Firebase Auth Demo',
      home: new MyHomePage(title: 'Firebase Auth Demo'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  Future<String> _message = new Future<String>.value('');

  Future<String> _testSignInAnonymously() async {
    final FirebaseUser user = await _auth.signInAnonymously();
    assert(user != null);
    assert(user == _auth.currentUser);
    assert(user.isAnonymous);
    assert(!user.isEmailVerified);
    assert(await user.getToken() != null);
    if (Platform.isIOS) {
      // Anonymous auth doesn't show up as a provider on iOS
      assert(user.providerData.isEmpty);
    } else if (Platform.isAndroid) {
      // Anonymous auth does show up as a provider on Android
      assert(user.providerData.length == 1);
      assert(user.providerData[0].providerId == 'firebase');
      assert(user.providerData[0].uid != null);
      assert(user.providerData[0].displayName == null);
      assert(user.providerData[0].photoUrl == null);
      assert(user.providerData[0].email == null);
    }
    return 'signInAnonymously succeeded: $user';
  }

  Future<String> _testSignInWithGoogle() async {
    final GoogleSignInAccount googleUser = await _googleSignIn.signIn();
    final GoogleSignInAuthentication googleAuth =
        await googleUser.authentication;
    final FirebaseUser user = await _auth.signInWithGoogle(
      accessToken: googleAuth.accessToken,
      idToken: googleAuth.idToken,
    );
    assert(user.email != null);
    assert(user.displayName != null);
    assert(!user.isAnonymous);
    assert(await user.getToken() != null);
    return 'signInWithGoogle succeeded: $user';
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text(widget.title),
      ),
      body: new Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: <Widget>[
          new MaterialButton(
              child: const Text('Test signInAnonymously'),
              onPressed: () {
                setState(() {
                  _message = _testSignInAnonymously();
                });
              }),
          new MaterialButton(
              child: const Text('Test signInWithGoogle'),
              onPressed: () {
                setState(() {
                  _message = _testSignInWithGoogle();
                });
              }),
          new FutureBuilder<String>(
              future: _message,
              builder: (_, AsyncSnapshot<String> snapshot) {
                return new Text(snapshot.data ?? '',
                    style: const TextStyle(
                        color: const Color.fromARGB(255, 0, 155, 0)));
              }),
        ],
      ),
    );
  }
}

以下是有关flutter包的链接:https://github.com/flutter/plugins/tree/master/packages/firebase_auth https://github.com/flutter/plugins/tree/master/packages/google_sign_in

共有1个答案

诸葛文博
2023-03-14
@override
Widget build(BuildContext context) {
  return MaterialApp(
      title: 'Your App Name',
      home: _getLandingPage()
  );
}

Widget _getLandingPage() {
  return StreamBuilder<FirebaseUser>(
    stream: FirebaseAuth.instance.onAuthStateChanged,
    builder: (BuildContext context, snapshot) {
      if (snapshot.hasData) {
        if (snapshot.data.providerData.length == 1) { // logged in using email and password
          return snapshot.data.isEmailVerified
              ? MainPage()
              : VerifyEmailPage(user: snapshot.data);
        } else { // logged in using other providers
          return MainPage();
        }
      } else {
        return LoginPage();
      }
    },
  );
}
@override
void initState() {
  super.initState();

  FirebaseAuth.instance.authStateChanges().listen((firebaseUser) {
    // do whatever you want based on the firebaseUser state
  });
}
void main() {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(App());
}

class App extends StatefulWidget {
  @override
  _AppState createState() => _AppState();
}

/// State is persistent and not rebuilt, therefore [Future] is only created once.
/// If [StatelessWidget] is used, in the event where [App] is rebuilt, that
/// would re-initialize FlutterFire and makes our app re-enter the
/// loading state, which is undesired.
class _AppState extends State<App> {
  final Future<FirebaseApp> _initFirebaseSdk = Firebase.initializeApp();
  final _navigatorKey = new GlobalKey<NavigatorState>();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      navigatorKey: _navigatorKey,
      theme: theme(),
      home: FutureBuilder(
          future: _initFirebaseSdk,
          builder: (_, snapshot) {
            if (snapshot.hasError) return ErrorScreen();

            if (snapshot.connectionState == ConnectionState.done) {
              // Assign listener after the SDK is initialized successfully
              FirebaseAuth.instance.authStateChanges().listen((User? user) {
                if (user == null)
                  _navigatorKey.currentState!
                      .pushReplacementNamed(LoginScreen.routeName);
                else
                  _navigatorKey.currentState!
                      .pushReplacementNamed(HomeScreen.routeName);
              });
            }

            return LoadingScreen();
          }),
      routes: routes,
    );
  }
}
 类似资料:
  • 我想在使用Firebase进行身份验证的Flutter应用程序中获取登录用户的电子邮件。 我可以通过以下方式获取当前用户 但是如果我用这个去取信 我得到以下错误: 在这种情况下,如何获取登录用户的电子邮件?

  • 有人知道如何使用firebase或任何其他服务为flutter拥有自定义用户名和密码登录吗?我不是在说电子邮件验证。用户只需用密码和登录名创建用户名。

  • 我最近才开始使用firebase工作,我似乎不知道如何让用户用电子邮件、用户名和密码注册,这样以后用户就可以只用用户名和密码登录,我可以用电子邮件和密码登录,但我不知道如何用用户名和密码登录,简单的解释是赞赏的,因为我是新的,谢谢!

  • 在本章中,我们将介绍如何在Firebase中设置Github身份验证,使用Github账号认证登录。 第1步 - 启用Github身份验证 打开Firebase信息中心,然后点击左侧菜单中的身份验证。 要打开可用方法的列表,需要在标签菜单中单击登录方法。 现在可以从列表中选择Github,启用它并保存。参考下图 - 第2步 - 创建Github应用程序 按照此链接创建GitHub应用程序。 需要将

  • 在本章中,我们将介绍如何在Firebase中设置Google身份验证。 第1步 - 启用Google身份验证 打开Firebase信息中心,然后点击左侧菜单中的身份验证。 要打开可用方法的列表,需要在标签菜单中单击登录方法。 现在可以从列表中选择Google,启用它并保存。参考下图 - 第2步 - 创建登录按钮 创建一个文件:,并将添加两个按钮。参考代码如下 - 第3步 - 登录和退出 在这一步中

  • 当使用signInWithEmailAndPassword()API在firebase中进行身份验证时,我无法获得有效的“当前”用户。 我使用用户名和密码登录应用程序 我一旦登录,用户就会被带到主页 我试图获取用户的UID,但是没有返回有效的用户。调用发生在异步函数中,如下所示: 当前用户为空。 知道是什么引起的吗?