简体   繁体   English

(Flutter Web) Firebase 存储无法与 firebase 插件一起使用

[英](Flutter Web) Firebase Storage not working with firebase plugin

I've recently added Flutter Web support for one of my projects which heavily uses Firebase services.我最近为我的一个项目添加了 Flutter Web 支持,该项目大量使用 Firebase 服务。 Everything seems to work fine except Firebase Storage which doesn't work.除了 Firebase 存储不起作用之外,一切似乎都运行良好。 I know that firebase_storage plugin currently doesn't work with Web so I tried instead with the regular firebase plugin but I can't get it to work.我知道firebase_storage插件目前不适用于 Web 所以我尝试使用常规的firebase插件,但我无法让它工作。

I sometimes get different "red screen"-errors, but everything is related to pages which uses Firebase Storage.我有时会收到不同的“红屏”错误,但一切都与使用 Firebase 存储的页面有关。 Here is one example of a red screen:这是红屏的一个示例:

在此处输入图像描述

Here are the 3 files in which I previously used firebase_storage with success (Android) and with the code that I tried to get to work with th firebase plugin.这是我之前成功使用firebase_storage的 3 个文件(Android)以及我尝试使用firebase插件的代码。

import 'package:firebase/firebase.dart' as fb;

// artiklar/images
final fb.StorageReference fbRefArtiklarImages =
    fb.app().storage().ref().child("artiklar").child("images");

// guider/categoryImages
final fb.StorageReference fbRefGuiderCategoryImages =
    fb.app().storage().ref().child("guider").child("categoryImages");
// guider/guideImages
final fb.StorageReference fbRefGuiderGuideImages =
    fb.app().storage().ref().child("guider").child("guideImages");

// kalender/images
final fb.StorageReference fbRefKalenderImages =
    fb.app().storage().ref().child("kalender").child("images");

// sidor/sidloggor
final fb.StorageReference fbRefSidorSidloggorImages =
    fb.app().storage().ref().child("sidor").child("sidloggor");
// sidor/sidcovers
final fb.StorageReference fbRefSidorSidcoversImages =
    fb.app().storage().ref().child("sidor").child("sidcovers");
// sidor/postImages/:sidaID/
final fb.StorageReference fbRefSidorPostImagesImages =
    fb.app().storage().ref().child("sidor").child("postImages");
// sidor/postImages/:sidaID/
final fb.StorageReference fbRefSidorKalenderImagesImages =
    fb.app().storage().ref().child("sidor").child("kalenderImages");

- -

import 'dart:io';
import 'package:firebase/firebase.dart' as fb;

class StorageService {
  //STORAGE REFERENCES
  final fb.Storage _storage = fb.app().storage("gs://astoria-site.appspot.com");

  //UPLOADS IMAGE TO FIREBASE
  fb.UploadTask _uploadTask;

  Future<void> uploadStorageImage(File imageFile, String filePath) async {
    _uploadTask = _storage.ref().child(filePath).put(imageFile);
    return;
  }

  //DELETES IMAGE IN FIREBASE
  Future<void> deleteStorageImage(String filePath) async {
    try {
      await _storage.ref().child(filePath).delete();
    } catch (e) {
      print(e.toString());
    }

    return;
  }
}

- -

import 'package:astoria/theme/colors.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:firebase/firebase.dart';
import 'package:flutter/material.dart';

class FirebaseStorageImage extends StatelessWidget {
  final String fileName;
  final StorageReference storageLocation;

  FirebaseStorageImage({
    @required this.fileName,
    @required this.storageLocation,
  });

  Future<String> _getImageURL() async {
    final StorageReference ref = storageLocation.child(fileName + ".jpg");

    try {
      var url = await ref.getDownloadURL();
      return url.toString();
    } catch (e) {
      return null;
    }
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: _getImageURL(),
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.done &&
            snapshot.hasData) {
          return Image(
            image: CachedNetworkImageProvider(snapshot.data),
            fit: BoxFit.cover,
          );
        } else if (snapshot.connectionState == ConnectionState.waiting) {
          //RETURN THIS WHILE WAITING FOR IMAGE
          return Container(color: lightGreyColor);
        } else {
          //RETURN THIS IF NO IMAGE WAS FOUND AT THAT LOCATION
          return Image(
            image: AssetImage("assets/images/placeholder.png"),
            fit: BoxFit.cover,
          );
        }
      },
    );
  }
}

You need to pass a string to the ref method for it to work.您需要将字符串传递给 ref 方法才能使其工作。 For ease, change ref to refFromURL , then pass your bucket URL as a string to it as follows;为方便起见,将ref更改为refFromURL ,然后将您的存储桶 URL 作为字符串传递给它,如下所示;

fb.app().storage().refFromURL("YOUR BUCKET URL HERE eg: 'gs://project-ID.appspot.com'")

Then you can safely add the remaining methods to it, such as;然后你可以放心地把剩下的方法加进去,比如; child() then put() or putString() . child()然后put()putString() Goodluck!!!祝你好运!!!

For those coming after me, here's a summary of achieving Firebase Storage image download for Flutter Web.对于那些追随我的人,这里是实现 Firebase 存储映像下载 Flutter Web 的总结。

Thanks to Learn Flutter Code for this nice little tutorial.感谢学习 Flutter 代码为这个漂亮的小教程。

Don't make Firebase Storage a dependency, just Firebase with:不要使 Firebase 存储成为依赖项,只需 Firebase 与:

import 'package:firebase/firebase.dart' as fb;

Then create a method:然后创建一个方法:

        Future<Uri> myDownloadURL() async {return await fb.storage().refFromURL('gs://<your storage reference>').child('$id.jpg').getDownloadURL();}

Call it from a FutureBuilder like so:从 FutureBuilder 调用它,如下所示:

        FutureBuilder<Uri>(
        future: myDownloadURL(),
        builder: (context, AsyncSnapshot<dynamic> snapshot) {
          if (snapshot.connectionState == ConnectionState.waiting) {
            return <Something as a placeholder>;
          }
          return CircleAvatar(
            radius: backgroundRadius * 2,
            child: Image.network(snapshot.data.toString()),
          );
        },
      )

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM