Как использовать onAuthStateChanged для Firebase Auth в Flutter? - PullRequest
0 голосов
/ 17 мая 2018
  1. Я использую аутентификацию firebase и вход в Google для обработки аутентификации.
  2. На данный момент я могу войти в свое приложение флаттера с помощью firebase_auth / google_sign_in.
  3. Яс помощью плагина firebase_auth.dart из: https://pub.dartlang.org/packages/firebase_auth
  4. Я использую onAuthStateChanged, чтобы определить, когда пользователь вошел в систему, и все работает нормально.
  5. Моя проблема: Когда я выхожу,onAuthStateChanged, похоже, не замечает

Вот мой код (сейчас «приложение» - это всего лишь несколько фиктивных страниц)

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

// ************** Begin Auth

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

Future<FirebaseUser> signInWithGoogle() async {
  // Attempt to get the currently authenticated user
  GoogleSignInAccount currentUser = _googleSignIn.currentUser;
  if (currentUser == null) {
    // Attempt to sign in without user interaction
    currentUser = await _googleSignIn.signInSilently();
  }
  if (currentUser == null) {
    // Force the user to interactively sign in
    currentUser = await _googleSignIn.signIn();
  }

  final GoogleSignInAuthentication auth = await currentUser.authentication;

  // Authenticate with firebase
  final FirebaseUser user = await _auth.signInWithGoogle(
    idToken: auth.idToken,
    accessToken: auth.accessToken,
  );

  assert(user != null);
  assert(!user.isAnonymous);

  return user;
}


Future<Null> signOutWithGoogle() async {
  debugPrint('in the SIGN OUT FUNCTION');
  await _auth.signOut();
  await _googleSignIn.signOut();

}

// ************** ENd Auth

void main() => runApp(new MyApp());


class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Demo',
      theme: new ThemeData(
        primarySwatch: Colors.yellow,
      ),
      home: new SplashPage(),
      routes: <String, WidgetBuilder>{
        '/login': (BuildContext context) => new LoginPage(),
        '/app': (BuildContext context) => new AppPage(),
      },
    );
  }
}

class SplashPage extends StatefulWidget {
  @override
  State createState() => new _SplashPageState();
}

class _SplashPageState extends State<SplashPage> {
  final FirebaseAuth _auth = FirebaseAuth.instance;



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

    _auth.onAuthStateChanged.firstWhere((user) => user != null).then((user) {
      debugPrint('AUTH STATE HAS CHANGED');
      debugPrint('user id: '+user.uid);
      Navigator.of(context).pushReplacementNamed('/app');
    });

    new Future.delayed(new Duration(seconds: 1)).then((_) => signInWithGoogle());
  }

  @override
  Widget build(BuildContext context) {
    return new Text('splash 123');
  }
}


class AppPage extends StatelessWidget {

  void _logout(){
    debugPrint('pressed logout button');
    signOutWithGoogle();
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('In Da App'),
        actions: <Widget>[
          new IconButton(icon: new Icon(Icons.list), onPressed: _logout),
        ],
      ),
      body: new Text('Welcome'),
    );
  }
}

class LoginPage extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      body: new Text('You gotta login'),
    );
  }
}

Почему onAuthStateChanged не обнаруживает, когдапользователь вышел из системы.Кроме того, вот снимок экрана моей консоли, когда я нажимаю кнопку выхода из системы.

enter image description here

на основе вывода консоли, я могу подтвердить, что код находится вфакт достижения функции выхода на основе моего debugPrint (), который у меня есть.Мне кажется любопытным, что консоль ведет журнал:

"Notifying auth state listeners." 

, а затем ведет журнал сразу после этого:

"Notified 0 auth state listeners."

1 Ответ

0 голосов
/ 22 мая 2018

Вы должны использовать StreamBuilder, чтобы убедиться, что ваш виджет получает уведомление.Если вы посмотрите на onAuthStateChanged, то на самом деле возвращается Stream<FirebaseUser>

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: new StreamBuilder(
        stream: _auth.onAuthStateChanged,
        builder: (context, snapshot) {
          // Simple case
          if (snapshot.hasData) {
            return AppPage();
          }

          return SplashPage();
        },
      ),
    );
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...