如何使用Flutter串流数据并将其添加到Build Function之外的列表中

时间:2019-07-28 17:34:41

标签: flutter dart google-cloud-firestore

我有一个名为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']));
    });
  },
),

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

StreamBuilder不适合此任务。即使您设法做到这一点(实际上是有一种方法:))-它可能会被更高级别的小部件重建而没有新数据,并且最终将在列表中出现重复项。

小部件中的所有WidgetBuilders和build方法仅用于显示UI

您需要订阅流。如果要使用窗口小部件来执行此操作,则需要创建一个扩展StatefulWidget的自定义窗口小部件。 StatefulWidget状态具有生命周期方法(initStatedispose),因此可以正确管理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
  }
}