【问题标题】:Flutter app not initializing Firebase instanceFlutter 应用程序未初始化 Firebase 实例
【发布时间】:2020-10-04 19:19:35
【问题描述】:

我正在创建一个在 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(),
    );
  }
}

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

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)

我的代码有什么问题?

编辑:

新的 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(),
    );
  }
}

新的错误输出:

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

【问题讨论】:

    标签: flutter firebase-authentication


    【解决方案1】:

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

    final FirebaseAuth _auth = FirebaseAuth.instance
    

    由于尚未调用initializeApp(),因此失败并抛出异常。您应该考虑在 main 期间调用initializeApp(),如here 所示。该帖子提供了几种选择。就个人而言,我会使用main()

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

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

    【讨论】:

    • 我已经删除了 final FirebaseAuth _auth = FirebaseAuth.instance 行,现在没有抛出异常,但是永远不会调用函数 _checkUserStatusGoogle() async
    • 我不建议删除该行。我只建议将 initializeApp 调用移到 main 中,这样您就可以在 MyApp 中的任何位置安全地调用 FirebaseAuth.instance。
    • 我已发布编辑 main.dart 的新代码以及新的错误输出。
    • 已编辑答案。缺少一行。
    • 是的,感谢您的更新。错误消失了,但 initstate() 没有执行,那里缺少什么?
    猜你喜欢
    • 1970-01-01
    • 2020-08-23
    • 2022-10-16
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 2023-04-07
    • 2021-09-19
    • 2022-12-01
    相关资源
    最近更新 更多