【问题标题】:How to setState() in StreamBuilder()?如何在 StreamBuilder() 中设置状态()?
【发布时间】:2021-10-25 16:13:36
【问题描述】:
  return ListView(
      children:
          snapshot.data!.docs.map((DocumentSnapshot document) {
    Map<String, dynamic> data =
        document.data()! as Map<String, dynamic>;
    // setState(() {
    //   allCalWorkout += data['totalCal'];
    // });
    return Container(
      margin: EdgeInsets.all(20),
      child: ListTile(
          onTap: () {},
          title: Text(data['nameWorkout']),
          subtitle: Text(
              'set: ${data['set']} calories:${data['totalCal']}'),
          trailing: IconButton(
              onPressed: () async {
                // print(document.id);
                await delWorkout(document.id);
                setState(() {
                  _workout = getAllWorkout();
                });
              },
              icon: Icon(Icons.delete, color: Colors.red))),
    );
  }).toList());

我想将 firebase 名称中的所有卡路里加起来为“totalCal”,以及如何存储总变量以传递到另一个页面。

【问题讨论】:

    标签: firebase flutter google-cloud-firestore


    【解决方案1】:
     sum = data['totalCal'].fold(0, (sum, element) => sum + element['totalCal']!);
          print('sum2 = $sum2');
    

    我不知道它是否有效,但如果你使用 fold 方法,那么你可以总结价值

    【讨论】:

    • 有错误“NoSuchMethodError: 'fold' 动态调用 null。接收方: 200 参数:[0,Instance of '(dynamic, dynamic) => dynamic']
    • fold 可以在列表中使用。我认为如果您在列表中插入数据,那么您可以使用 fold
    【解决方案2】:

    根据documentation,StreamBuilder 将侦听更改以设置其状态,因此状态由发生的新事件管理:

    小部件重建由每次交互使用 State.setState 安排,但在其他方面与流的时间解耦。

    FlutterFire documentation 包含一个示例,说明如何侦听 Firestore 中可用于更新小部件的事件。同一文档页面有一个guide,说明如何使用update 方法更新Firestore 文档中的值(在这种情况下,您的totalCal 量是由添加所有卡路里产生的)。我按照示例进行了操作,可以确认它有效。

    至于如何在视图之间保留totalCal 值,您可以将此变量存储在导入到所有视图中的库文件中,然后在计算所有卡路里的总和后设置该值将在任何地方更新它。您可以查看此related question 了解更多详情。

    【讨论】:

      猜你喜欢
      • 2018-03-19
      • 2021-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-08
      • 2018-11-29
      • 2021-02-11
      • 2014-05-12
      相关资源
      最近更新 更多