1

在颤振之外,当我实施Firebase身份验证时,我总是使用由firebase提供的onAuthStateChanged侦听器来确定用户是否已登录并进行相应响应。使用onAuthStateChanged与颤动的Firebase登录

我想用flutter做类似的事情,但我可以找到访问Firebase的onAuthStateChanged的方法。我正在使用firebase_auth和google_signin Flutter插件。我正在使用firebase_auth Flutter插件附带的示例代码。以下是示例代码。我可以用google登录成功登录,但这个例子太简单了,因为我想让观察者/侦听者检测用户的登录/注销状态。

有没有办法通过使用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))); 
       }), 
     ], 
    ), 
    ); 
    } 
} 

这里是链接到扑包装问题: https://github.com/flutter/plugins/tree/master/packages/firebase_auth https://github.com/flutter/plugins/tree/master/packages/google_sign_in

回答

2

Firebase for Flutter Codelab具有使用谷歌标志和火力地堡AUTH一个更深入的例子。

final step之后,您最终得到此_ensureLoggedIn函数用于检查用户是否已登录,如果不是,请启动登录流程。

Future<Null> _ensureLoggedIn() async { 
    GoogleSignInAccount user = googleSignIn.currentUser; 
    if (user == null) 
    user = await googleSignIn.signInSilently(); 
    if (user == null) { 
    user = await googleSignIn.signIn(); 
    analytics.logLogin(); 
    } 
    if (auth.currentUser == null) { 
    GoogleSignInAuthentication credentials = 
    await googleSignIn.currentUser.authentication; 
    await auth.signInWithGoogle(
     idToken: credentials.idToken, 
     accessToken: credentials.accessToken, 
    ); 
    } 
} 

您可以修改此功能来检查这些东西当你的应用程序启动,并有条件地显示预身份验证和身份验证后用户喜欢的东西不同的看法:

final auth = FirebaseAuth.instance; 

class MyApp extends StatelessWidget { 
    @override 
    Widget build(BuildContext context) { 
    return new MaterialApp(
     title: 'MyApp', 
     home: (_checkLogin() == true ? new PostAuthScaffold() : new PreAuthScaffold()) 
    ); 
    } 
} 

bool _checkLogin() { 
    GoogleSignInAccount user = googleSignIn.currentUser; 
    return !(user == null && auth.currentUser == null); 
} 
+0

喜@FrederickCook - 感谢你的答案,我希望它能解决我的问题,但是当我调试你的_checkLogin()函数时,我发现auth.currentUser会始终返回一个Future ,即使在我从未登录过的设备上。所以_checkLogin ()将始终返回true,在您的情况下它可能会始终显示PostAuthScaffold()小部件。或者你有不同的体验吗? –