Мониторинг статуса авторизации из Firebase с использованием StreamProvider 4.0.3 во флаттере - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь автоматически войти в систему, если пользователь явно не вышел из приложения. Я использую firebase для аутентификации, а пакет провайдера из паба для отслеживания изменений статуса аутентификации.

У меня есть файл службы dart (первоначально из учебников TheNetNinja), который предоставляет поток и оборачивает файл main.dart потоком. поставщик.

class FoodMart extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
  return StreamProvider(
    create: (_) => AuthService().user,
    child: MaterialApp(
      title: 'Flutter Demo',
      onGenerateRoute: Router.generateRoute,
      home: Landing(),
    ),
  );
}
}

Я закрыл и снова открыл приложение, но по-прежнему не перенаправляю на домашнюю страницу. Я делаю это неправильно? Когда я перезагружаюсь в горячем режиме, меня перенаправляют на домашнюю страницу, но только тогда. Вот реализация класса AuthService.dart:

import 'dart:async';

import 'package:firebase_auth/firebase_auth.dart';
import 'package:food_mart/models/users.dart';
import 'package:food_mart/services/database.dart';

class AuthService {

FirebaseAuth _mAuth = FirebaseAuth.instance;

Stream<User> get user {
  return _mAuth.onAuthStateChanged.map(_mapUserFromFirebase);
}

User _mapUserFromFirebase(FirebaseUser firebaseUser) {
  return firebaseUser != null ? User(userId: firebaseUser.uid) : null;
}

Future createUser(String email, String pwd, String role) async{
  try {
    AuthResult result = await _mAuth.createUserWithEmailAndPassword(email: email, password: pwd);
    FirebaseUser firebaseUser = result.user;

    await DatabaseService(userId: firebaseUser.uid).setUserData(email: email, role: role);
    return _mapUserFromFirebase(firebaseUser);
  } catch(e){
    print(e.toString());
    return e;
  }
}

Future loginUser(String email, String pwd) async{
  try {
    AuthResult authResult = await _mAuth.signInWithEmailAndPassword(email: email, password: pwd);
    FirebaseUser firebaseUser = authResult.user;
    return _mapUserFromFirebase(firebaseUser);
  } catch(e){
    print(e.toString());
    return null;
  }
}

Future signOut() async {
  try {
    return await _mAuth.signOut();
  } catch(e){
    print(e.toString());
    return null;
  }
}

}

Модель User была опущена для краткости. Пожалуйста, помогите :) Спасибо заранее!

...