我有一个名为myData
的Map(),其中包含多个列表。我想使用流填充Map
中的列表之一。对于此StreamBuilder,它将无法正常工作,因为它需要返回,并且我想使用List.add()
功能。
Map<String, List<Widget>> myData = {
'list1': [],
'list2': [],
'list3': [],
'list4': []
};
如何从FireStore中获取信息,但是将其添加到列表中而不是返回数据?
就像这样,但这行不通。
StreamBuilder<QuerySnapshot>(
stream: // my snapshot from firestore,
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
snapshot.data.documents.map((DocumentSnapshot doc) {
myData['list1'].add(Text(doc['color']));
});
},
),
任何帮助将不胜感激!
答案 0 :(得分:1)
StreamBuilder不适合此任务。即使您设法做到这一点(实际上是有一种方法:))-它可能会被更高级别的小部件重建而没有新数据,并且最终将在列表中出现重复项。
小部件中的所有WidgetBuilders和build
方法仅用于显示UI
您需要订阅流。如果要使用窗口小部件来执行此操作,则需要创建一个扩展StatefulWidget
的自定义窗口小部件。 StatefulWidget
状态具有生命周期方法(initState
和dispose
),因此可以正确管理StreamSubscription
。
这是示例代码:
class StreamReader extends StatefulWidget {
@override
_StreamReaderState createState() => _StreamReaderState();
}
class _StreamReaderState extends State<StreamReader> {
StreamSubscription _subscription;
@override
void initState() {
super.initState();
_subscription = myStream.listen((data) {
// do whatever you want with stream data event here
});
}
@override
void dispose() {
_subscription?.cancel(); // don't forget to close subscription
super.dispose();
}
@override
Widget build(BuildContext context) {
// return your widgets here
}
}