流中是否可以包含.getDownloadURL()字符串,以便可以在小部件树中的多个位置访问它,并且只要更改它就可以始终保持最新状态?
目前,我正在尝试设置streambuilder:

  return Scaffold(
      body: ListView.builder(
        itemCount: products.length,
        itemBuilder: (context, index) {
          return StreamBuilder<String>(
              stream: ImageDatabaseService().getImageLocation(products[index]),
              builder: (context, snapshot) {
                return ProductTile(product: products[index]);
              });
        },
该流来自ImageDataseService类:
class ImageDatabaseService {
  String _imageLocation;
  StorageReference ref;

  void init() {}

  Stream<String> getImageLocation(Product product) {
    ref = FirebaseStorage.instance
        .ref()
        .child('images/' + product.kaizenID + '.png');
    return getURL();
  }

  Future<String> getURL() async {
    await ref.getDownloadURL().then((location) {
      return location;
    });
  }
}
问题是ImageDatabaseService需要返回流字符串时会返回Future字符串,但是在小部件末端我只需要一个String
香港专业教育学院一直在寻找这些论坛和网络,但没有遇到任何有用的东西。

最佳答案

将您的ImageDatabaseService类更改为;

class ImageDatabaseService {
  StorageReference ref;
  void init() {}
  Stream<String> get imageLocation(Product product) {
    ref = FirebaseStorage.instance
        .ref()
        .child('images/' + product.kaizenID + '.png');
    return ref.getDownloadURL()
        .asStream().map((downloadUrl)
    => downloadUrl;
  }
}
它将在StreamBuilder中以snapshot.data返回一个字符串。
不要忘记将流更改为;
stream: ImageDatabaseService().imageLocation(products[index]),
不要忘记添加条件来检查构建器中的连接状态。
if(snapshot.ConnectionState == ConnectionState.active){
  return ProductTile(product: products[index]);
} else{
  return Center(child: CircularProgressIndicator(),);
}

关于firebase - Flutter Firebase存储图像检索流,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62563741/

10-12 06:28