Флаттер: сначала вызовите FirebaseApp.initializeApp (Context) - PullRequest
0 голосов
/ 07 октября 2019

Я пишу приложение 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 объект, и он отлично работает. Затем, когда я хочу загрузить это изображение в хранилище Firebase с помощью кнопки Submit, я получаю эту ошибку:

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;
    }
  }
}

Может кто-нибудь сказатьмне что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 07 октября 2019

Для тех, кто пришел сюда, я решил проблему. Есть много вещей, которые нужно сделать, например, добавить свое приложение в проект Firebase и отредактировать некоторые файлы. Единственное, что нужно сделать, это лучше прочитать документы и выполнить все шаги: Добавить Firebase в ваше приложение Flutter

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