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

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

У меня есть файл службы dart (первоначально из учебников TheNetNinja), который предоставляет поток и обернул файл main.dart потоком. поставщик. Как я понимаю, в provider 4.0.1 больше нельзя использовать .value and supply the value, как показано ниже:

class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
  return StreamProvider<User>.value(
    value: AuthService().user,
     child: MaterialApp(
     debugShowCheckedModeBanner: false,
     title: 'Flutter Brewzz',
     home: Wrapper(),
   ),
  );
}

}

, но перейти на что-то подобное, используя create instead of value, как ниже:

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 опущена для краткости. Любые предложения, пожалуйста? Спасибо

...