繁体   English   中英

StreamBuilder 使用 Firestore 快照中的 StreamController

[英]StreamBuilder using StreamController from Firestore snapshots

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

但得到错误:

在 null 上调用了 getter 'stream'。

在 null 上调用了方法“添加”。

这是我的代码:

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) {

有谁知道解决方案? 谢谢!

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

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

和:

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

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

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

解决方案#1:

您需要初始化 stream 替换此行

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

和:

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

因为在从 firebase 请求数据之前, broadcast()需要监听数据,所以你需要在initSatat中添加监听器,它会是这样的:

  @override
  void initState() {
    // this doesn't have to do any thing  
    _localStreamController.stream.listen((event)=>print(event));
    Firestore.instance.collection('info').snapshots().listen((QuerySnapshot querySnapshot) =>
    _localStreamController.add(querySnapshot));
    super.initState();

  }

你的 stream 构建器看起来像这样:

StreamBuilder(
  stream: _localStreamController.stream,
  builder: (context, snapshot) {
    if (snapshot.hasData) {
      return ...
    } else {
     return CircularProgressIndicator();
    }
  },
)

解决方案#2:

您可以直接在 Stream 构建器中丢失 controller 和 stream 数据,这不是最佳实践。 它会是这样的:

StreamBuilder(
  stream: Firestore.instance.collection('info').snapshots(), // <= change
  builder: (context, snapshot) {
    if (snapshot.hasData) {
      return ...
    } else {
     return CircularProgressIndicator();
    }
  },
)

并且您不要使用StreamControllerinitState

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM