Flutter 应用程序未初始化 Firebase 实例

mva*_*sco 1 firebase-authentication flutter

我正在创建一个在 Firebase 中使用 Google 身份验证的 Flutter 应用程序。

用户可以使用 Google 登录,但是当用户再次启动应用程序时,我需要让用户保持登录状态。

这是我的 main.dart 代码

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

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

class MyApp extends StatelessWidget {

  final FirebaseAuth _auth = FirebaseAuth.instance;

  Future<void> _checkUserStatusGoogle() async {
    await Firebase.initializeApp();
    _auth
        .authStateChanges()
        .listen((User user) {
      if (user == null) {
        print('User is currently signed out!');
      } else {
        print('User is signed in!');
      }
    });
  }


  @override
  void initState() {

      Firebase.initializeApp().whenComplete(() {
        _checkUserStatusGoogle().then((value) {
          print('Check done done');

    });
  });
  }


  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter Login',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: LoginPage(),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

使用此代码启动应用程序时出现错误:

E/flutter (15566): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: [core/no-app] No Firebase App '[DEFAULT]' has been created - call Firebase.initializeApp()
E/flutter (15566): #0      MethodChannelFirebase.app (package:firebase_core_platform_interface/src/method_channel/method_channel_firebase.dart:118:5)
E/flutter (15566): #1      Firebase.app (package:firebase_core/src/firebase.dart:52:41)
E/flutter (15566): #2      FirebaseAuth.instance (package:firebase_auth/src/firebase_auth.dart:37:47)
E/flutter (15566): #3      new MyApp (package:flutter_faro_turnos/main.dart:10:43)
E/flutter (15566): #4      main (package:flutter_faro_turnos/main.dart:6:23)
E/flutter (15566): #5      _runMainZoned.<anonymous closure>.<anonymous closure> (dart:ui/hooks.dart:233:25)
E/flutter (15566): #6      _rootRun (dart:async/zone.dart:1190:13)
E/flutter (15566): #7      _CustomZone.run (dart:async/zone.dart:1093:19)
E/flutter (15566): #8      _runZoned (dart:async/zone.dart:1630:10)
E/flutter (15566): #9      runZonedGuarded (dart:async/zone.dart:1618:12)
E/flutter (15566): #10     _runMainZoned.<anonymous closure> (dart:ui/hooks.dart:225:5)
E/flutter (15566): #11     _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:301:19)
E/flutter (15566): #12     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)
Run Code Online (Sandbox Code Playgroud)

我的代码有什么问题?

编辑:

新的 main.dart 代码:

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

void main() async {
  await Firebase.initializeApp();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  
  final FirebaseAuth _auth = FirebaseAuth.instance;


  Future<void> _checkUserStatusGoogle() async {
    print('User is currently signed out!');
    FirebaseAuth.instance
        .authStateChanges()
        .listen((User user) {
      if (user == null) {
        print('User is currently signed out!');
      } else {
        print('User is signed in!');
      }
    });
  }


  @override
  void initState() {

    print ("estoy en initstate");

      Firebase.initializeApp().whenComplete(() {
        _checkUserStatusGoogle().then((value) {
          print('Check done done');

    });
  });
  }


  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter Login',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: LoginPage(),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

新的错误输出:

E/flutter (18393): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: ServicesBinding.defaultBinaryMessenger was accessed before the binding was initialized.
E/flutter (18393): If you're running an application and need to access the binary messenger before `runApp()` has been called (for example, during plugin initialization), then you need to explicitly call the `WidgetsFlutterBinding.ensureInitialized()` first.
E/flutter (18393): If you're running a test, you can call the `TestWidgetsFlutterBinding.ensureInitialized()` as the first line in your test's `main()` method to initialize the binding.
E/flutter (18393): #0      defaultBinaryMessenger.<anonymous closure> (package:flutter/src/services/binary_messenger.dart:93:7)
E/flutter (18393): #1      defaultBinaryMessenger (package:flutter/src/services/binary_messenger.dart:106:4)
E/flutter (18393): #2      MethodChannel.binaryMessenger (package:flutter/src/services/platform_channel.dart:145:62)
E/flutter (18393): #3      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:151:35)
E/flutter (18393): #4      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:334:12)
E/flutter (18393): #5      MethodChannel.invokeListMethod (package:flutter/src/services/platform_channel.dart:347:40)
E/flutter (18393): #6      MethodChannelFirebase._initializeCore (package:firebase_core_platform_interface/src/method_channel/method_channel_firebase.dart:30:36)
E/flutter (18393): #7      MethodChannelFirebase.initializeApp (package:firebase_core_platform_interface/src/method_channel/method_channel_firebase.dart:75:13)
E/flutter (18393): #8      Firebase.initializeApp (package:firebase_core/src/firebase.dart:43:25)
E/flutter (18393): #9      main (package:flutter_faro_turnos/main.dart:7:18)
E/flutter (18393): #10     _runMainZoned.<anonymous closure>.<anonymous closure> (dart:ui/hooks.dart:233:25)
E/flutter (18393): #11     _rootRun (dart:async/zone.dart:1190:13)
E/flutter (18393): #12     _CustomZone.run (dart:async/zone.dart:1093:19)
E/flutter (18393): #13     _runZoned (dart:async/zone.dart:1630:10)
E/flutter (18393): #14     runZonedGuarded (dart:async/zone.dart:1618:12)
E/flutter (18393): #15     _runMainZoned.<anonymous closure> (dart:ui/hooks.dart:225:5)
E/flutter (18393): #16     _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:301:19)
E/flutter (18393): #17     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)
E/flutter (18393): 
V/FA      (18393): Inactivity, disconnecting from the service
Run Code Online (Sandbox Code Playgroud)

Dou*_*son 9

这行代码在 MyApp 的构建过程中执行,在调用其任何方法之前:

final FirebaseAuth _auth = FirebaseAuth.instance
Run Code Online (Sandbox Code Playgroud)

由于initializeApp()还没有被调用,这会失败并抛出异常。你应该考虑调用initializeApp()过程中的主要替代,如图所示这里。该帖子提供了几种选择。就个人而言,我会使用main().

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}
Run Code Online (Sandbox Code Playgroud)

您只需要在initializeApp()应用程序启动时调用一次,因此您还应该删除代码中的其他调用。