【问题标题】:Flutter: Make sure to call FirebaseApp.initializeApp(Context) firstFlutter:确保首先调用 FirebaseApp.initializeApp(Context)
【发布时间】:2020-02-04 15:11:16
【问题描述】:

我正在编写一个 FLUTTER 应用程序,并且我正在尝试将图像上传到 Firebase 存储。这是我为重现错误而创建的一个简单的测试应用程序。

import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart' show rootBundle;
import 'package:path_provider/path_provider.dart';
import 'package:firebase_storage/firebase_storage.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  File image;

  Future<File> getImageFileFromAssets(String path) async {
    final byteData = await rootBundle.load('assets/$path');

    final file = File('${(await getTemporaryDirectory()).path}/$path');
    await file.writeAsBytes(byteData.buffer
        .asUint8List(byteData.offsetInBytes, byteData.lengthInBytes));

    return file;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Test App'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Container(
              height: 300,
              width: 450,
              child: image == null ? null : Image.file(image),
            ),
            RaisedButton(
              child: Text('Submit'),
              onPressed: () async {
                final fileName = 'imageName';
                final firebaseStorageRef =
                    FirebaseStorage.instance.ref().child('userFolder');
                final uploadTask =
                    firebaseStorageRef.child(fileName).putFile(image);
                await uploadTask.onComplete;
              },
            ),
            RaisedButton(
              child: Text('Load immagine'),
              onPressed: () async {
                image = await getImageFileFromAssets('test.jpg');
                setState(() {});
              },
            ),
          ],
        ),
      ),
    );
  }
}

正如您所见,当我单击 Load Image 按钮时,我从资产中获取图像并将其存储在 File 对象中,它工作正常。然后,当我想使用 Submit 按钮将该图像上传到 Firebase 的存储空间时,我收到此错误:

E/MethodChannel#plugins.flutter.io/firebase_storage(19436): Failed to handle method call
E/MethodChannel#plugins.flutter.io/firebase_storage(19436): java.lang.IllegalStateException: Default FirebaseApp is not initialized in this process com.example.test_project. Make sure to call FirebaseApp.initializeApp(Context) first.
E/MethodChannel#plugins.flutter.io/firebase_storage(19436):     at com.google.firebase.FirebaseApp.getInstance(com.google.firebase:firebase-common@@17.0.0:234)
E/MethodChannel#plugins.flutter.io/firebase_storage(19436):     at com.google.firebase.storage.FirebaseStorage.getInstance(com.google.firebase:firebase-storage@@17.0.0:86)
E/MethodChannel#plugins.flutter.io/firebase_storage(19436):     at io.flutter.plugins.firebase.storage.FirebaseStoragePlugin.onMethodCall(FirebaseStoragePlugin.java:57)
E/MethodChannel#plugins.flutter.io/firebase_storage(19436):     at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:222)
E/MethodChannel#plugins.flutter.io/firebase_storage(19436):     at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(DartMessenger.java:96)
E/MethodChannel#plugins.flutter.io/firebase_storage(19436):     at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(FlutterJNI.java:656)
E/MethodChannel#plugins.flutter.io/firebase_storage(19436):     at android.os.MessageQueue.nativePollOnce(Native Method)
E/MethodChannel#plugins.flutter.io/firebase_storage(19436):     at android.os.MessageQueue.next(MessageQueue.java:326)
E/MethodChannel#plugins.flutter.io/firebase_storage(19436):     at android.os.Looper.loop(Looper.java:160)
E/MethodChannel#plugins.flutter.io/firebase_storage(19436):     at android.app.ActivityThread.main(ActivityThread.java:6669)
E/MethodChannel#plugins.flutter.io/firebase_storage(19436):     at java.lang.reflect.Method.invoke(Native Method)
E/MethodChannel#plugins.flutter.io/firebase_storage(19436):     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
E/MethodChannel#plugins.flutter.io/firebase_storage(19436):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
E/flutter (19436): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: PlatformException(error, Default FirebaseApp is not initialized in this process com.example.test_project. Make sure to call FirebaseApp.initializeApp(Context) first., null)
E/flutter (19436): #0      StandardMethodCodec.decodeEnvelope 
package:flutter/…/services/message_codecs.dart:569
E/flutter (19436): #1      MethodChannel.invokeMethod 
package:flutter/…/services/platform_channel.dart:316
E/flutter (19436): <asynchronous suspension>
E/flutter (19436): #2      _StorageFileUploadTask._platformStart 
package:firebase_storage/src/upload_task.dart:130
E/flutter (19436): #3      StorageUploadTask._start 
package:firebase_storage/src/upload_task.dart:35
E/flutter (19436): <asynchronous suspension>
E/flutter (19436): #4      StorageReference.putFile 
package:firebase_storage/src/storage_reference.dart:65
E/flutter (19436): #5      _MyHomePageState.build.<anonymous closure> 
package:test_project/main.dart:60
E/flutter (19436): <asynchronous suspension>
E/flutter (19436): #6      _InkResponseState._handleTap 
package:flutter/…/material/ink_well.dart:654
E/flutter (19436): #7      _InkResponseState.build.<anonymous closure> 
package:flutter/…/material/ink_well.dart:729
E/flutter (19436): #8      GestureRecognizer.invokeCallback 
package:flutter/…/gestures/recognizer.dart:182
E/flutter (19436): #9      TapGestureRecognizer._checkUp 
package:flutter/…/gestures/tap.dart:365
E/flutter (19436): #10     TapGestureRecognizer.handlePrimaryPointer 
package:flutter/…/gestures/tap.dart:275
E/flutter (19436): #11     PrimaryPointerGestureRecognizer.handleEvent 
package:flutter/…/gestures/recognizer.dart:455
E/flutter (19436): #12     PointerRouter._dispatch 
package:flutter/…/gestures/pointer_router.dart:75
E/flutter (19436): #13     PointerRouter.route 
package:flutter/…/gestures/pointer_router.dart:102
E/flutter (19436): #14     GestureBinding.handleEvent 
package:flutter/…/gestures/binding.dart:218
E/flutter (19436): #15     GestureBinding.dispatchEvent 
package:flutter/…/gestures/binding.dart:198
E/flutter (19436): #16     GestureBinding._handlePointerEvent 
package:flutter/…/gestures/binding.dart:156
E/flutter (19436): #17     GestureBinding._flushPointerEventQueue 
package:flutter/…/gestures/binding.dart:102
E/flutter (19436): #18     GestureBinding._handlePointerDataPacket 
package:flutter/…/gestures/binding.dart:86
E/flutter (19436): #19     _rootRunUnary  (dart:async/zone.dart:1136:13)
E/flutter (19436): #20     _CustomZone.runUnary  (dart:async/zone.dart:1029:19)
E/flutter (19436): #21     _CustomZone.runUnaryGuarded  (dart:async/zone.dart:931:7)
E/flutter (19436): #22     _invoke1  (dart:ui/hooks.dart:263:10)
E/flutter (19436): #23     _dispatchPointerDataPacket  (dart:ui/hooks.dart:172:5)
E/flutter (19436):

数据库的规则是公开的:

rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write;
    }
  }
}

谁能告诉我我做错了什么?

【问题讨论】:

    标签: flutter firebase-storage


    【解决方案1】:

    根据文档只需更改您的主要方法:

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

    【讨论】:

    • 谢谢!我有这个,但我忘了等待!大声笑
    【解决方案2】:

    对于谁来这里,我解决了问题。有很多事情要做,例如将您的应用添加到您的 Firebase 项目并编辑一些文件。 唯一要做的就是更好地阅读文档并遵循所有步骤: Add Firebase to your Flutter app

    【讨论】:

    • 将代码从已经工作的项目复制到新应用程序,却忘记重新设置所有内容。谢谢!
    【解决方案3】:

    所有 Firebase 版本都已更新,现在您必须在使用任何 Firebase 产品之前调用 Firebase.initializeApp(),例如:

    首先,所有 Firebase 产品现在都依赖于 firebase_core 版本(0.5.0+),因此您需要将其添加到 pubspec.yaml 文件中:

    dependencies:
      flutter:
        sdk: flutter
      firebase_core : ^0.5.0
    

    然后你必须调用 Firebase.initializeApp():

    在 main.dart 中:

    Future<void> main() async {
      WidgetsFlutterBinding.ensureInitialized();
      await Firebase.initializeApp(); //Make sure you imported firebase_core
      runApp(MaterialApp(
        home: GettingStartedPage(),
      ));
    }
    

    【讨论】:

      【解决方案4】:

      导入'package:firebase_core/firebase_core.dart';

      【讨论】:

      • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
      • 所有 Firebase 版本都已更新,现在您必须在使用任何 Firebase 产品之前调用 Firebase.initializeApp(),例如:首先,所有 Firebase 产品现在都依赖于 firebase_core 版本(0.5.0+) ,因此您需要将其添加到 pubspec.yaml 文件中
      猜你喜欢
      • 1970-01-01
      • 2018-02-09
      • 2019-08-23
      • 2021-04-16
      • 2019-01-06
      • 2021-03-20
      • 1970-01-01
      相关资源
      最近更新 更多