【发布时间】:2021-02-19 09:00:57
【问题描述】:
我目前正在使用 FirebaseFirestore.instance.collection('cars').get() 从 Firebase 获取与汽车详细信息相关的数据。
我将所有 Car 实例保存在 List<Cars> _cars = [];
使用我在didChangeDependencies{}中执行的addCarsToList方法
Future<void> addCarsToList({BuildContext context, FilterBy filter}) async {
var lastDocTracker =
Provider.of<LastDocumentTracker>(context, listen: false);
try {
var dcs = filter != null
? await carsCollection.orderBy('dueDate').limit(5).where('readyToRepair', isEqualTo: false).get()
: await carsCollection.orderBy('dueDate').limit(5).get();
//print(dcs.docs.last.data());
for (int i = 0; i < dcs.docs.length; i++) {
Cars carValue = singleCar(dcs, i);
if (_cars.every((item) => item.carId != carValue.carId)) {
_cars.add(carValue);
notifyListeners();
}
}
lastDocTracker.changeLastDocument(dcs.docs.last);
} catch (e) {
print(e);
}
}
这里我使用 lastDocumentTracer 来跟踪最后一个文档来实现分页。
因此,为了实现分页,我使用滚动控制器并调用getMore 方法
Future<void> getMore(
BuildContext context, QueryDocumentSnapshot lastSnap) async {
print('getMore called');
var lastDocTracker =
Provider.of<LastDocumentTracker>(context, listen: false);
var dcs = await carsCollection
.orderBy('dueDate')
.startAfterDocument(lastSnap)
.limit(5)
.get();
if (dcs.docs.isNotEmpty)
for (int i = 0; i < dcs.docs.length; i++) {
Cars carValue = singleCar(dcs, i);
if (_cars.every((item) => item.carId != carValue.carId)) {
_cars.add(carValue);
notifyListeners();
}
}
if (dcs.docs.isNotEmpty) lastDocTracker.changeLastDocument(dcs.docs.last);
return;
}
我目前面临的问题是我有三个过滤器(All、Upcoming、Ready)。
全部表示来自 firebase 的所有汽车,没有任何过滤器。
即将上市表示未来即将上市的汽车。 (在 Firestore 中保存为 DateTime.millisecondsSinceEpoch)
Ready 表示准备修理的汽车(在 firestore 中保存为 bool) Have a look into the screenshot
我正在尝试使用 where((element) => isReadyToRepair) 通过汽车列表进行过滤并使用 setState 但不幸的是,我将其限制为 Firebase 中的 5 个项目,如果没有带有字段 isReadyToRepair = true 的汽车,那么我无法向下滚动并使用滚动控制器调用 getMore,因此它显示为空且未加载任何数据。
我需要你们的帮助。请帮我。如果我没有解释清楚,请告诉我。
【问题讨论】:
标签: firebase flutter dart google-cloud-firestore