我正在将产品添加到列表中,并与每个产品一起保存图片。 要在每个产品旁边显示图像,图像链接通过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);
}
}
答案 0 :(得分:1)
你没事
您需要考虑的是,图像上传是耗时的常规,包括网络延迟,服务器端图像处理等
生活在这个世界上有一种正确的方法-显示进度指示以显示用户您执行了某些操作(直到您收到图像链接)
这样做,用户会很高兴
ps会毫不犹豫地在评论中与我联系,如果您还有其他信息请关注您的问题