【问题标题】:State updated in Flutter UI not reflected in Firebase Firestore realtimeFlutter UI 中更新的状态未实时反映在 Firebase Firestore 中
【发布时间】:2021-03-26 14:27:17
【问题描述】:

这里有一个对象流,我从 Firestore 返回并显示在我的 UI 中。我的StreamBuilder 正在正确地从我的数据库中返回数据并在 UI 中正确显示我的对象,但是当我的PlannerItemContainer 被点击并且布尔值@987654323 时,我试图在这里完成两种方式的绑定@ 更改,它会在 UI 和 Firestore 中更新。

现在,当我更新布尔值时,更改会按预期实时反映在 UI 中,但是当我尝试从 UI 更改布尔值时,新值不会反映在 Firestore 中。

我的诊断是,因为 PlannerItemContainer 保持自己的状态,所以我的 StreamBuilder 不会在发生更改时收到通知。

我的两个问题是:1.) 我的想法是否走在正确的轨道上,以及 2.) 如果有,我需要将通知功能从我的 PlannerItemContainer 传递到 StreamBuilder,这将通知它PlannerItemContainer 发生了更改,以便对 Firestore 进行实时更新??

   StreamBuilder(
      stream: userProvider.watchHealthPlannerItems(),
      builder: (BuildContext context, AsyncSnapshot snapshot) {
        plannerController.add(snapshot.data);

        return Timetable<HealthPlannerItem>(
          eventBuilder: (HealthPlannerItem item) {
            return Row(
              children: [
                Expanded(
                  child: PlannerItemContainer(item),
                ),
              ],
            );
          },
        );
      },
    );

流传递给StreamBuilder

 Stream<List<HealthPlannerItem>> watchHealthPlannerItems() {
    return FirebaseFirestore.instance
        .collection('organizations')
        .doc(this.organizationId)
        .collection('apps')
        .doc(this.appId)
        .collection('clients')
        .doc(this.user.id)
        .collection('healthplanner')
        .snapshots()
        .map((snapshot) {
      return snapshot.docs.map((doc) {
        Map<String, dynamic> healthPlannerData = doc.data();
        HealthPlannerItem healthPlannerItem =
            HealthPlannerItem.fromJson(healthPlannerData);
        return healthPlannerItem;
      }).toList();
    });
  }

PlannerItemContainer 小部件:

class PlannerItemContainer extends StatefulWidget {
  final HealthPlannerItem item;

  PlannerItemContainer(this.item);
  @override
  _PlannerItemContainerState createState() => _PlannerItemContainerState();
}

class _PlannerItemContainerState extends State<PlannerItemContainer> {

  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        setState(() => widget.item.isChecked = !widget.item.isChecked);
      },
      child: widget.item.isChecked
          ? _buildCheckedItemContainer(widget.item)
          : _buildUncheckedItemContainer(widget.item),
    );
  }
}

【问题讨论】:

    标签: firebase flutter google-cloud-firestore stream-builder


    【解决方案1】:

    我没有完全关注所有内容,但快速扫描显示您正在尝试更改 setState 中的不可变(最终)变量“item”。您可以将项目移动到您的状态对象中,并且它可以在那里是可变的。希望这能让你摆脱困境。

    【讨论】:

      猜你喜欢
      • 2021-11-25
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 2019-10-12
      • 1970-01-01
      • 2021-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多