【问题标题】:StreamBuilder using StreamController from Firestore snapshotsStreamBuilder 使用 Firestore 快照中的 StreamController
【发布时间】:2019-07-23 12:01:10
【问题描述】:

我正在尝试将 Firestore 快照()加载到 StreamController 中,以便可以提供给 StreamBuilder,以便可以在应用程序中构建新闻源。

但得到错误:

在 null 上调用了 getter 'stream'。

调用了方法“add” 空。

这是我的代码:

StreamController<QuerySnapshot> _localStreamController = StreamController<QuerySnapshot>();

  @override
  void initState() {
    super.initState();

Firestore.instance.collection(‘info’).snapshots().listen((QuerySnapshot querySnapshot) {

//      if(userAdded == null) {
        _localStreamController.add(querySnapshot);
//      }

    });
...
child: StreamBuilder(
stream: _localStreamController.stream,
builder: (context, snapshot) {

有人知道解决方案吗? 谢谢!

【问题讨论】:

  • 为什么不直接使用-stream: Firestore.instance.collection(‘info’).snapshots()
  • @anmol.majhail 感谢您的回复!不能直接使用,因为这将导致在每个新事件上重建。我发现这也会导致Navigator.push 出现问题,因为Navigator.push 可能在StreamBuilder 重建时被调用。所以导致 Widget 树问题
  • Streams 就是为了这个目的——对每个事件执行操作。使用future 而不是流。如果您想获取一次数据。
  • @anmol.majhail 我想要流式传输并自动获取新数据。但是如果用户点击必须取消流来导航

标签: firebase dart flutter stream google-cloud-firestore


【解决方案1】:

你需要初始化流 替换这一行:

StreamController<QuerySnapshot> _localStreamController = StreamController<QuerySnapshot>();

与:

StreamController<QuerySnapshot> _localStreamController = StreamController.broadcast();

然后在您的构建器中,您将需要考虑尚未加载的数据。因此,显示加载屏幕或其他内容可能很有用。像这样的:

if (!snapshot.hasData || snapshot.data.documents.length == 0) {
            return Center(child: const Text('Loading ...'));
          }

【讨论】:

  • 我们如何在空安全中定义它?谢谢。
猜你喜欢
  • 2019-03-26
  • 2020-10-26
  • 2021-10-21
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 2019-09-19
  • 2021-08-08
  • 2021-06-17
相关资源
最近更新 更多