将图像保存到Firebase存储中后,StreamProvider太快返回null

时间:2020-06-26 11:36:46

标签: firebase flutter dart

我正在将产品添加到列表中,并与每个产品一起保存图片。 要在每个产品旁边显示图像,图像链接通过StreamProvider来提供。

仅在添加带有图像的新产品并且导航器弹出列表之后,该图像将不会显示在新产品旁边,但是如果我保存项目或注销并再次登录,则图像现在显示。我相信发生的事情是流太快并且在正确保存图像之前返回null,因为几秒钟后,我可以看到流停止返回null并返回新图像的正确链接(从print( )语句。

我正在努力想办法以某种方式延迟流或在流不再发送null并发送图像链接时调用更新。

小部件结尾:

class _ProductTileState extends State<ProductTile> {
  @override
  Widget build(BuildContext context) {
    var _imageLocation = Provider.of<String>(context);

    return Padding(
      padding: EdgeInsets.only(top: 8.0),
      child: Card(
        margin: EdgeInsets.fromLTRB(20, 6, 20, 0),
        child: ListTile(
          leading: Builder(builder: (context) {
            if (_imageLocation != null) {
              return Image.network(_imageLocation ?? "");
            } else {
              return CircularProgressIndicator();
            }
          }),

StreamProvider初始化

return Scaffold(
      body: ListView.builder(
        itemCount: products.length,
        itemBuilder: (context, index) {
          return StreamProvider<String>.value(
            initialData: '',
            value: ImageDatabaseService().imageLocation(products[index]),
            catchError: (_, __) => null,
            child: ProductTile(product: products[index]),
          );
        },
      ),

流的来源:

class ImageDatabaseService {
  Stream<String> imageLocation(Product product) {
    StorageReference ref = FirebaseStorage.instance
        .ref()
        .child('images/' + product.kaizenID + '.png');
    print("sending, ${product.kaizenID} from ImageDatabaseService");

    return ref.getDownloadURL().asStream().map((downloadUrl) => downloadUrl);
  }
}

1 个答案:

答案 0 :(得分:1)

你没事

您需要考虑的是,图像上传是耗时的常规,包括网络延迟,服务器端图像处理等

生活在这个世界上有一种正确的方法-显示进度指示以显示用户您执行了某些操作(直到您收到图像链接)

这样做,用户会很高兴

ps会毫不犹豫地在评论中与我联系,如果您还有其他信息请关注您的问题