Использование `Provider` в Firebase Auth не работает - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь реализовать проверку подлинности Firebase в своем приложении Flutter с помощью provider. Сначала я проверяю, вошел ли пользователь в систему. Если да, я отправляю его на экран home . Иначе я отправляю его на экран Логин .

Пожалуйста, проверьте мой код ниже.

main.dart

import 'package:flutter/material.dart';
import 'package:customer/services/auth.dart';
import 'package:provider/provider.dart';

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

class MyApp extends StatelessWidget {
    // This widget is the root of your application.
    @override
    Widget build(BuildContext context) {
        return ChangeNotifierProvider(
            child: MaterialApp(
                title: 'Customer App',

                home: AuthWrapper(), 
                routes: {
                    '/account': (context) => AccountPage(),
                },
            ), create: (BuildContext context) {
                AuthService();
            },
        );
    }
}

auth.dart

import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';

class AuthService with ChangeNotifier{

  final FirebaseAuth _auth = FirebaseAuth.instance;
  FirebaseUser _user=null;

//Sign in with username and password
  Future signInWithEmail(String email, String password) async {
    FirebaseUser user;

    try {
      AuthResult result = await _auth.signInWithEmailAndPassword(
          email: email, password: password);
          user = result.user;

      if (user != null) {
        print("Sign in success: " + user.email);
        _user = user;
      } else {
        print("sign in failed");
        _user = null;
      }
    } catch (e) {
      print(e.toString());
    }
    finally{
      notifyListeners();
    }
  }

//Get the current user
  FirebaseUser getCurrentUser()  {
    return _user;
  }

}

auth_wrapper.dart

import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:customer/pages/home.dart';
import 'package:customer/pages/login.dart';
import 'package:customer/services/auth.dart';
import 'package:provider/provider.dart';

class AuthWrapper extends StatelessWidget {
  AuthWrapper() {}

  @override
  Widget build(BuildContext context) {
    var currentUser =Provider.of<AuthService>(context, listen: false).getCurrentUser();

    if (currentUser == null) {
      return LoginPage();
    } else {
      return HomePage();
    }
  }
}

К сожалению, когда я запускаю это приложение, я получаю следующую ошибку.

I/flutter ( 3364): The following ProviderNotFoundException was thrown building AuthWrapper(dirty):
I/flutter ( 3364): Error: Could not find the correct Provider<AuthService> above this AuthWrapper Widget
I/flutter ( 3364):
I/flutter ( 3364): To fix, please:
I/flutter ( 3364):
I/flutter ( 3364):   * Ensure the Provider<AuthService> is an ancestor to this AuthWrapper Widget
I/flutter ( 3364):   * Provide types to Provider<AuthService>
I/flutter ( 3364):   * Provide types to Consumer<AuthService>
I/flutter ( 3364):   * Provide types to Provider.of<AuthService>()
I/flutter ( 3364):   * Ensure the correct `context` is being used.
I/flutter ( 3364):
I/flutter ( 3364): If none of these solutions work, please file a bug at:
I/flutter ( 3364): https://github.com/rrousselGit/provider/issues
I/flutter ( 3364):
I/flutter ( 3364): The relevant error-causing widget was:
[38;5;248mI/flutter ( 3364):   AuthWrapper[39;49m
I/flutter ( 3364):
I/flutter ( 3364): When the exception was thrown, this was the stack:
[38;5;248mI/flutter ( 3364): #0      Provider.of[39;49m
[38;5;248mI/flutter ( 3364): #1      AuthWrapper.build[39;49m
[38;5;244mI/flutter ( 3364): #2      StatelessElement.build[39;49m
[38;5;244mI/flutter ( 3364): #3      ComponentElement.performRebuild[39;49m
[38;5;244mI/flutter ( 3364): #4      Element.rebuild[39;49m
[38;5;244mI/flutter ( 3364): #5      ComponentElement._firstBuild[39;49m
[38;5;244mI/flutter ( 3364): #6      ComponentElement.mount[39;49m
[38;5;244mI/flutter ( 3364): #7      Element.inflateWidget[39;49m
[38;5;244mI/flutter ( 3364): #8      Element.updateChild[39;49m
[38;5;244mI/flutter ( 3364): #9      SingleChildRenderObjectElement.mount[3

Я недавно пытаюсь provider скороговорка, что здесь на самом деле происходит?

1 Ответ

3 голосов
/ 21 февраля 2020

Вы можете сделать следующее.

  • Измените create: (BuildContext context) на create: (_). В настоящее время вы не используете BuildContext, поэтому его можно изменить на _, что просто чище code
  • Во-вторых, не похоже, что ваша функция возвращает значение для создания (я могу ошибаться в этом). Вот почему функциональная реализация работает лучше.

Примеры из пакета провайдера

 ChangeNotifierProvider(create: (_) => Counter()),

Ваш код меняется

Так что измените это

create: (BuildContext context) {
             AuthService();
},

К этому

create: (_) => AuthService();

Ссылки

Если кто-нибудь может объяснить процесс этого лучше, помогите.

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