如何使用 Flutter 流式传输数据并添加到构建函数之外的列表

Ant*_*tte 2 dart flutter google-cloud-firestore

我有一个名为 Map() 的函数myData,它包含多个列表。我想使用 Stream 来填充Map. 对于这个 StreamBuilder 将无法工作,因为它需要返回并且我想使用List.add()功能。

Map<String, List<Widget>> myData = {
  'list1': [],
  'list2': [],
  'list3': [],
  'list4': []
};
Run Code Online (Sandbox Code Playgroud)

如何从 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']));
    });
  },
),
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激!

Mik*_*kin 5

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

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

您需要订阅流。如果您想使用小部件来完成此操作,那么您需要创建一个扩展的自定义小部件StatefulWidgetStatefulWidget状态具有生命周期方法(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
  }
}
Run Code Online (Sandbox Code Playgroud)