firebase存储如何显示图像

时间:2021-06-30 13:30:27

标签: firebase flutter firebase-storage

我正在尝试使用 url 和 Image.network() 从 firebase 存储中提取图像。

但不知何故我卡住了。

我使用了 firebase 存储文档中的这个例子:

   Future downloadURLExample() async {
   String downloadURL = await firebase_storage.FirebaseStorage.instance
      .ref('users/123/avatar.jpg')
      .getDownloadURL();

  // Within your widgets:
  // Image.network(downloadURL);
return downloadURL;

}

但我不知道如何将这个 String downloadURL 放入我的容器和 Image.network。

我尝试这样做:

Container(
 width: 200,
 height: 200,
 child: Image.network(downloadURL),
),

但它不起作用。我错过了什么?

2 个答案:

答案 0 :(得分:0)

// use firebase package as fb
import 'package:firebase/firebase.dart' as fb;
import 'package:flutter/material.dart';

class Example extends StatefulWidget {
  const Example({Key key}) : super(key: key);

  @override
  _ExampleState createState() => _ExampleState();
}

class _ExampleState extends State<Example> {
  //variable for the called photo uri
  Uri img;
  //
  downloadURLExample() {
    fb
        .storage()
        .refFromURL(
            'gs://******.appspot.com/users/123/avatar.jpg')
        .getDownloadURL()
        .then((value) => setState(() => img = value));
  }
  @override
  void initState() {
    //initialize method
    downloadURLExample();
    super.initState();
  }
  
  @override
  Widget build(BuildContext context) {
    return  img == null
          ? CircularProgressIndicator()
          : Container(
              width: 200,
              height: 200,
              child: Image.network(img.toString()),
          
    );
  }
}

答案 1 :(得分:0)

问题在于您试图获取不在构建方法的 scope 中的 downloadURL。您需要从 downloadURLExample 方法中获取下载 URL。

这是一个使用 FutureBuilder 的示例。

class MyStatefulWidget extends StatefulWidget {
  const MyStatefulWidget({Key key}) : super(key: key);

  @override
  State<MyStatefulWidget> createState() => _MyStatefulWidgetState();
}

class _MyStatefulWidgetState extends State<MyStatefulWidget> {
  Future<String> _downloadURLFuture;

  @override
  void initState() {
    super.initState();
    _downloadURLFuture = downloadURLExample();    
  }

  Future<String> downloadURLExample() async {
    String downloadURL = await firebase_storage.FirebaseStorage.instance.ref('users/123/avatar.jpg').getDownloadURL();
    return downloadURL;
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder<String>(
        future: _downloadURLFuture, 
        builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
          if (snapshot.hasData) {
            final String downloadURL = snapshot.data;
            return Image.network(
              downloadURL,
              loadingBuilder: (BuildContext context, Widget child, ImageChunkEvent loadingProgress) {
                return Center(
                  child: CircularProgressIndicator(),
                );                  
              },
            );
          } else {
            return Center(
              child: CircularProgressIndicator(),
            );
          }
        },
    );
  }
}