Flutter中使用StreamBuilder时snapshot.data.length出现报错该如何解决?
报错原因
未给StreamBuilder指定泛型类型,Dart无法推断snapshot.data的实际类型,默认将其识别为Object?类型。Object类型本身不具备length属性,也不支持下标访问操作,因此你标注的三处调用都会触发语法报错。
解决方法
- 确认你的
imageUrlsController.stream的输出类型,按你的业务逻辑看是字符串类型的图片地址列表List<String>,给StreamBuilder加上泛型约束StreamBuilder<List<String>>即可让Dart正确识别snapshot.data的类型。 - 可选优化:使用
isNotEmpty替代长度不等于0的判断,代码更简洁易读。
修正后完整代码
Widget _galleryGrid() { return StreamBuilder<List<String>>( stream: imageUrlsController.stream, builder: (context, snapshot) { if (snapshot.hasData) { if (snapshot.data!.isNotEmpty) { return GridView.builder( gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2), itemCount: snapshot.data!.length, itemBuilder: (context, index) { return CachedNetworkImage( imageUrl: snapshot.data![index], fit: BoxFit.cover, placeholder: (context, url) => Container( alignment: Alignment.center, child: const CircularProgressIndicator() ) ); } ); } else { return const Center(child: Text('No images to display.')); } } else { return const Center(child: CircularProgressIndicator()); } } ); }
如果你的Stream输出的是其他集合类型,把泛型替换为对应的实际类型即可。
内容的提问来源于stack exchange,提问作者gs97ahn
相关产品推荐
相关产品推荐

