从 StreamBuilder BloC firestore Flutter 获取数据时出错

Posted

技术标签:

【中文标题】从 StreamBuilder BloC firestore Flutter 获取数据时出错【英文标题】:Error when getting data from StreamBuilder BloC firestore Flutter 【发布时间】:2020-07-30 12:48:01 【问题描述】:

我在 Flutter 中的 APP 出现问题...我尝试从 Bloc 和 Repositore 和 Firestore 获取数据,它显示在我的 GridView 中,但出现此错误:

我的用户界面代码:

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 代码,它具有来自我的回购的 PhotoDish 列表的流:

class DishBloc extends Bloc 
  RepositoryFirestore _repository = RepositoryFirestore();

  PhotoDishRepo _repo = FirestoreDishProvider();
  Stream<List<PhotoDish>> get streamPhotoDish => _repo.streamPhotoDish;

我的回购代码调用了从 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);
      );
  

【问题讨论】:

【参考方案1】:

我认为您只是想在将列表映射到小部件的末尾添加 .ToList() 方法。

Map 仅将您的数据转换为小部件,它返回单个小部件,而 gridview 子参数需要小部件列表,因此您必须将其转换为列表。

children: snapshot.data
                    .map((photo)=>buildItemPhoto(photo)).toList(), //convert to list
              );

【讨论】:

是的,维伦,这……这太疯狂了

以上是关于从 StreamBuilder BloC firestore Flutter 获取数据时出错的主要内容,如果未能解决你的问题,请参考以下文章

使用 streamBuilder 实现 Flutter BLoC

Flutter Bloc A 在 Bloc B 中添加流,但此流不会通过 StreamBuilder 在 UI 中呈现

Flutter BLoC:构建()方法中 StreamBuilder 中的 Navigator.pop

如何通过使用flutter bloc从fire存储中使用依赖注入来处理错误`The getter was called on null`

ReactNative进阶(二十九):BloC模式

如何在flutter中从streambuilder导航到其他页面?