未来的构建者将永远获取抖动中的图像

时间:2020-08-30 10:08:39

标签: firebase flutter firebase-storage

这是_getImage方法,该方法从Firebase存储中检索图像的下载链接,然后从该下载字符串中检索。

Future<String> _getImage(String filePath) async {
    var _urlImage = await FirebaseStorage.instance
        .ref()
        .child(filePath)
        .getDownloadURL();

    return _urlImage;
}

现在这是将来的构建器,它将检索图像。 blogs [index] .pic1包含Firebase存储pic文件路径的引用,它是正确的。

FutureBuilder<String>(
    future: _getImage(blogs[index].pic1), // async work
    builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
    switch (snapshot.connectionState) {
      case ConnectionState.waiting: return Text('Image Loading....',style: TextStyle(fontSize: 10),);
      default:
        if (snapshot.hasError)
          return Text('Error: ${snapshot.error}');
        else
          return Image.network(snapshot.data.toString());
    }
  },
),

否,显示错误消息,但ConnectionState.waiting始终为true。 请帮忙。

这是控制台显示的内容

I/zygote64(20385): Background concurrent copying GC freed 546604(21MB) AllocSpace objects, 134(2MB) LOS objects, 24% free, 74MB/98MB, paused 70us total 509.383ms

2 个答案:

答案 0 :(得分:0)

future中的FutureBuilder参数应该是一个存储的变量,以便在FutureBuilder重建时不会每次都有新的未来。 将_getImage的结果存储在有状态的小部件中(例如,在initState中初始化),并将其传递给构建器。

答案 1 :(得分:0)

FutureBuilder<String>(
    future: _getImage(blogs[index].pic1),
    builder: (BuildContext context, AsyncSnapshot<Welcome> snapshot) {
      if (snapshot.hasData) {
        print("Success");
        return Text("Success!!!")
      } else if (!snapshot.hasData) {
         return Container(
            child: CircularProgressIndicator(),
          );
      } else if (snapshot.error) {
        print("error");
      } else {
        return Container(
            child: CircularProgressIndicator(),
          );
      }
    });

使用此方法,伙计