从 StreamBuilder BloC firestore Flutter 获取数据时出错
Error when getting data from StreamBuilder BloC firestore Flutter
我的 APP 在 Flutter 中一直有问题...我试图从 Bloc 和 Repositore 以及 Firestore 获取数据并将其显示在我的 GridView 中,但出现此错误:
我的UI代码:
Widget bodyGallery2() => SafeArea(
child: Scaffold(
body: Stack(
children: <Widget>[
StreamBuilder<List<PhotoDish>>(
stream: _dishBloc.streamPhotoDish,
builder: (context, snapshot) {
if (!snapshot.hasData) {
return CircularProgressIndicator();
}
print(snapshot.toString());
return GridView.count(
crossAxisCount: 1,
crossAxisSpacing: 4.0,
mainAxisSpacing: 8.0,
childAspectRatio: 3/2,
children: snapshot.data
.map((photo)=>buildItemPhoto(photo)),
);
}
)
]
),
),
);
Widget buildItemPhoto(PhotoDish listphoto){
return Text(listphoto.idDish+":::PhotoDish");
}
我的 Bloc 代码,它有来自我的 Repo 的 PhotoDish 列表流:
class DishBloc extends Bloc{
RepositoryFirestore _repository = RepositoryFirestore();
PhotoDishRepo _repo = FirestoreDishProvider();
Stream<List<PhotoDish>> get streamPhotoDish => _repo.streamPhotoDish;
我的 Repo 代码调用了从 firebase 获取数据的调用,它在 StreamController 中设置:
abstract class PhotoDishRepo {
Stream<List<PhotoDish>> get streamPhotoDish;
}
class FirestoreDishProvider implements PhotoDishRepo{
StreamController<List<PhotoDish>> _streamController = BehaviorSubject<List<PhotoDish>>();
Firestore _firestore = Firestore.instance;
List<PhotoDish> _listPhotoDish = List();
FirestoreDishProvider() {
_firestore
.collection(Constants.namePhotoDishCollection)
.snapshots()
.listen((QuerySnapshot snapshot){
snapshot.documents.forEach((obj){
_listPhotoDish.add(PhotoDish(
date: DateTime.now(),
id: obj.data["id"],
idDish: obj.data["idDish"],
idUser: obj.data["idUser"],
photo: obj.data["photo"],
));
});
print("TOTALL:::"+_listPhotoDish.length.toString());
_streamController.add(_listPhotoDish);
});
}
我认为您只是错过了在将列表映射到小部件的末尾添加 .ToList() 方法。
Map 仅将您的数据转换为小部件,return 单个小部件,而 gridview 子参数需要小部件列表,因此您必须将其转换为列表。
children: snapshot.data
.map((photo)=>buildItemPhoto(photo)).toList(), //convert to list
);
我的 APP 在 Flutter 中一直有问题...我试图从 Bloc 和 Repositore 以及 Firestore 获取数据并将其显示在我的 GridView 中,但出现此错误:
我的UI代码:
Widget bodyGallery2() => SafeArea(
child: Scaffold(
body: Stack(
children: <Widget>[
StreamBuilder<List<PhotoDish>>(
stream: _dishBloc.streamPhotoDish,
builder: (context, snapshot) {
if (!snapshot.hasData) {
return CircularProgressIndicator();
}
print(snapshot.toString());
return GridView.count(
crossAxisCount: 1,
crossAxisSpacing: 4.0,
mainAxisSpacing: 8.0,
childAspectRatio: 3/2,
children: snapshot.data
.map((photo)=>buildItemPhoto(photo)),
);
}
)
]
),
),
);
Widget buildItemPhoto(PhotoDish listphoto){
return Text(listphoto.idDish+":::PhotoDish");
}
我的 Bloc 代码,它有来自我的 Repo 的 PhotoDish 列表流:
class DishBloc extends Bloc{
RepositoryFirestore _repository = RepositoryFirestore();
PhotoDishRepo _repo = FirestoreDishProvider();
Stream<List<PhotoDish>> get streamPhotoDish => _repo.streamPhotoDish;
我的 Repo 代码调用了从 firebase 获取数据的调用,它在 StreamController 中设置:
abstract class PhotoDishRepo {
Stream<List<PhotoDish>> get streamPhotoDish;
}
class FirestoreDishProvider implements PhotoDishRepo{
StreamController<List<PhotoDish>> _streamController = BehaviorSubject<List<PhotoDish>>();
Firestore _firestore = Firestore.instance;
List<PhotoDish> _listPhotoDish = List();
FirestoreDishProvider() {
_firestore
.collection(Constants.namePhotoDishCollection)
.snapshots()
.listen((QuerySnapshot snapshot){
snapshot.documents.forEach((obj){
_listPhotoDish.add(PhotoDish(
date: DateTime.now(),
id: obj.data["id"],
idDish: obj.data["idDish"],
idUser: obj.data["idUser"],
photo: obj.data["photo"],
));
});
print("TOTALL:::"+_listPhotoDish.length.toString());
_streamController.add(_listPhotoDish);
});
}
我认为您只是错过了在将列表映射到小部件的末尾添加 .ToList() 方法。
Map 仅将您的数据转换为小部件,return 单个小部件,而 gridview 子参数需要小部件列表,因此您必须将其转换为列表。
children: snapshot.data
.map((photo)=>buildItemPhoto(photo)).toList(), //convert to list
);