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()小部件。或者你有不同的體驗嗎? –