【发布时间】: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