firebase - 带有 flutter_firebase 的 StreamBuilder 在第二个小部件构建时具有空值(图像消失)
问题描述
我设法streambuilder
在页面上显示来自firestore的图像,但问题是snapshot.data
如果我返回最后一页并返回,图像就会消失(我得到一个空值)。
这是我的代码。如何使快照数据持久存在,以便图像保持在那里并且在小部件重建时不会消失?
Container(child: Column(
children: [
Text(' Certifications',
Container(child: StreamBuilder(
stream: certificates,
builder: (context, snapshot) {
return !snapshot.hasData
? Center(child: Container(
child: Center(child: Text(
'No images yet'))))
: Container(
child: GridView.builder(
itemCount: snapshot.data.documents.length,
itemBuilder: (context, index) {
url = snapshot.data.documents[index].get('url');
return Container(child: FadeInImage
.memoryNetwork(fit: BoxFit.cover,
placeholder: kTransparentImage,
image: url),
),
);
}),
);
}),
),
解决方案
流是异步的。这意味着StreamBuilder
不获取旧快照,仅获取新的未来快照。这是你的问题。
当您的小部件重新构建时,它正在订阅一个已经有事件的流。是的,您会认为快照中的数据应该是最后一个事件值,但事实并非如此。直到null
有新事件被推送到您的certificates
流中。
因此,一种解决方案是让正在加载您的证书的服务存储初始 API 请求的值,并使其可供您在 StreamBuilder 的initialData
属性中使用。
我会这样构造它:
StreamBuilder(
stream: certificateService.stream,
initialData: certificateService.value, // <-----
builder: ...
)
希望这能为您指明正确的方向。
推荐阅读
- python - 如何从 django.contrib.gis.gdal.GDALRaster 对象创建 gdal.Dataset 或 xarray.Dataset 对象?
- python - 读取泡菜文件时出错 - 权限错误
- java - 在 Spring Boot 中自定义异常返回空消息
- reactjs - React FluentUI 组件未更新
- anylogic - AnyLogic 校准相对约束
- ssh - gitlab 和 ssh 密钥有什么问题
- php - 使用 Wordpress 主题功能更新帖子的自定义分类
- javascript - 如何在 Django 中处理可靠的下拉菜单
- date - 在 Java 8 中解析几种格式的日期
- c# - 登录成功后 ASP.NET Core MVC AzureAD 运行代码