[英]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();
}
},
)
并且您不要使用StreamController
或initState
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.