Исключение Firebase, создающее потребителя // [core/no-app] Не создано приложение Firebase ‘[DEFAULT]’ — вызов Firebase.initializeApp()

#firebase #flutter #dart

#firebase #flutter #dart

Вопрос:

Я застрял в середине этой ошибки и даже не могу придумать, как ее исправить. Я пытался разными способами вставить Firebase.initializeApp(); в свой код, но мне не удалось сделать это правильно. У меня уже есть пакеты в моем pubspec.yaml, включая ядро Firebase, Auth, облачный Firestore… Я считаю, что мой менеджер пользователей верен, но должен ли я вызывать инициализацию firebase в нем? Я помещаю инициализировать Firebase на свой основной, вот так:

 Future<void> main() async {
  runApp(MyApp());
  Firebase.initializeApp();
}
  

Это было исключением:

 ════════ Exception caught by widgets library ═══════════════════════════════════════════════════════
The following FirebaseException was thrown building Consumer<UserManager>(dirty, dependencies: [_InheritedProviderScope<UserManager>]):
[core/no-app] No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp()

The relevant error-causing widget was: 
  Consumer<UserManager> file:///C:/Users/adrie/Documents/renata_osorio_nails/lib/screens/login/login_screen.dart:40:22
When the exception was thrown, this was the stack: 
#0      MethodChannelFirebase.app (package:firebase_core_platform_interface/src/method_channel/method_channel_firebase.dart:118:5)
#1      Firebase.app (package:firebase_core/src/firebase.dart:52:41)
#2      FirebaseAuth.instance (package:firebase_auth/src/firebase_auth.dart:37:47)
#3      new UserManager (package:renata_osorio_nails/models/user_manager.dart:11:42)
#4      MyApp.build.<anonymous closure> (package:renata_osorio_nails/main.dart:20:22)
...
════════════════════════════════════════════════════════════════════════════════════════════════════
  

И мой код на экране входа в систему выглядит следующим образом:

 import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'package:renata_osorio_nails/helpers/validators.dart';
import 'package:provider/provider.dart';
import 'package:renata_osorio_nails/models/user_manager.dart';
import 'package:renata_osorio_nails/models/user.dart';

class LoginScreen extends StatelessWidget {

  final TextEditingController emailController = TextEditingController();
  final TextEditingController passController = TextEditingController();
//Controladores de texto

  final GlobalKey<FormState> formKey = GlobalKey<FormState>();
  //Chave de formulário
  final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
//Chave Snackbar

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: scaffoldKey,
      appBar: AppBar(
        title: const Text('Entrar'),
        centerTitle: true,
        actions: [FlatButton(
          onPressed: (){
            Navigator.of(context).pushReplacementNamed('/signup');
          },
          textColor: Colors.white,
          child: const Text('CRIAR CONTA',
          style: TextStyle(fontSize: 14),),
        )],
      ),
      body: Center(
        child: Card(
            margin: const EdgeInsets.symmetric(horizontal: 16),
            child: Form(
              key: formKey,
              child: Consumer<UserManager>(
                builder: (_, userManager, child){
                  return ListView(
                    padding: const EdgeInsets.all(16),
                    shrinkWrap: true,
                    children: [
                      TextFormField(
                        controller: emailController,
                        enabled: !userManager.loading,
                        decoration: const InputDecoration(hintText: 'E-mail'),
                        keyboardType: TextInputType.emailAddress,
                        autocorrect: false,
                        validator: (email) {
                          if(!emailValid(email))
                            return 'E-mail inválido';
                          return null;
                        },
                      ),
                      const SizedBox(
                        height: 16,
                      ),
                      TextFormField(
                        controller: passController,
                        enabled: !userManager.loading,
                        decoration: const InputDecoration(hintText: 'Senha'),
                        autocorrect: false,
                        obscureText: true,
                        validator: (pass) {
                          if (pass.isEmpty || pass.length < 8)
                            return 'Senha inválida';
                          return null;
                        },
                      ),
                      Align(
                        alignment: Alignment.centerRight,
                        child: FlatButton(
                          onPressed: () {},
                          padding: EdgeInsets.zero,
                          child: const Text('Esqueci minha senha'),
                        ),
                      ),
                      const SizedBox(
                        height: 16,
                      ),
                      SizedBox(
                        height: 44,
                        child: RaisedButton(
                          onPressed: userManager.loading ? null : () {
                            if(formKey.currentState.validate()){
                              context.read()<UserManager>().signIn(
                                  user: AppUser(
                                    email: emailController.text,
                                    password: passController.text,
                                  ),
                                  onFail: (e){
                                    scaffoldKey.currentState.showSnackBar(
                                        SnackBar(
                                          content: Text ('Falha ao entrar: $e'),
                                          backgroundColor: Colors.red,
                                        )
                                    );
                                  },
                                  onSuccess: (){
                                    //TODO: Fechar a tela de login
                                  }
                              );}},
                          color: Theme.of(context).primaryColor,
                          disabledColor: Theme.of(context).primaryColor.
                              withAlpha(100),
                          textColor: Colors.white,
                          child: userManager.loading ?
                          CircularProgressIndicator(
                            valueColor: AlwaysStoppedAnimation(Colors.white),
                          ) :
                          const Text(
                            'Entrar',
                            style: TextStyle(fontSize: 18),
                          ),
                        ),
                      ),
                    ],
                  );
                },
              ),
            )),
      ),
    );
  }
}
  

Как я могу это исправить?

Комментарии:

1. Пожалуйста, отредактируйте вопрос, чтобы показать код, который вы пробовали, который работает не так, как вы ожидаете. Если вы сделали что-то не так Firebase.initializeApp , мы не можем увидеть, что это такое.

Ответ №1:

Вы проверили, выполняется ли строка? Если это не так, попробуйте поместить строку перед runApp() вызовом или в initState() метод вашего виджета.