我正在尝试使用Firestore
分页,我阅读了文档,它在Swift
中实现为这样
let first = db.collection("cities")
.order(by: "population")
.limit(to: 25)
first.addSnapshotListener { (snapshot, error) in
guard let snapshot = snapshot else {
print("Error retrieving cities: \(error.debugDescription)")
return
}
guard let lastSnapshot = snapshot.documents.last else {
// The collection is empty.
return
}
// Construct a new query starting after this document,
// retrieving the next 25 cities.
let next = db.collection("cities")
.order(by: "population")
.start(afterDocument: lastSnapshot)
// Use the query for pagination.
// ...
}
只是为了练习,我尝试获取三个文档,如果点击按钮,获取一个以上的文档。
Firestore.instance.collection('user').where('name', isEqualTo: 'Tom').orderBy('age').limit(3).getDocuments().then((snapshot) {
_lastDocument = snapshot.documents.last;
snapshot.documents.forEach((snap) {
print(snap.data);
});
});
按下按钮后,尝试这样操作。
Firestore.instance.collection('user').where('name', isEqualTo: 'Tom').orderBy('age').startAfter(_lastDocument).limit(1).getDocuments().then((snapshot) {
snapshot.documents.forEach((snap) {
print(snap.data);
});
});
但是控制台是这么说的。
处理手势时引发了以下Assert:类型"DocumentSnapshot"不是类型"List [dynamic]"的子类型
为什么我必须通过列表?
有人知道怎么修吗?
- 更新**
我可以这样分页。
class PaginationExample extends StatefulWidget {
@override
_PaginationExampleState createState() => _PaginationExampleState();
}
class _PaginationExampleState extends State<PaginationExample> {
var _restaurants = <Restaurant>[];
var _nomore = false;
var _isFetching = false;
DocumentSnapshot _lastDocument;
ScrollController _controller;
void _fetchDocuments() async {
final QuerySnapshot querySnapshot = await Firestore.instance.collection('restaurants').orderBy('likes').limit(8).getDocuments();
// your logic here
}
Future<Null> _fetchFromLast() async {
final QuerySnapshot querySnapshot = await Firestore.instance.collection('restaurants').orderBy('likes').startAfter([_lastDocument['likes']]).limit(4).getDocuments();
if (querySnapshot.documents.length < 4) {
_nomore = true;
return;
}
_lastDocument = querySnapshot.documents.last;
for (final DocumentSnapshot snapshot in querySnapshot.documents) {
final Restaurant re = Restaurant(snapshot);
_restaurants.add(re);
}
setState(() {});
}
void _scrollListener() async {
if (_nomore) return;
if (_controller.position.pixels == _controller.position.maxScrollExtent && _isFetching == false) {
_isFetching = true;
await _fetchFromLast();
_isFetching = false;
}
}
@override
void initState() {
_fetchDocuments();
_controller = new ScrollController()..addListener(_scrollListener);
super.initState();
}
@override
Widget build(BuildContext context) {
return Container(
);
}
}
3条答案
按热度按时间a14dhokn1#
这里有一个错误:
startAfter
方法需要List值参数,而您传递的是DocumentSnapshot
。获取一个[values]列表,创建并返回一个新的[Query],该[Query]从相对于查询顺序的所提供字段之后开始。
你可以试试这样的方法:
hi3rlvi22#
使用此软件包paginate_firestore仅使用2个属性
itemBuilder
和query
分页例如,
hpxqektj3#
这对我提供实时分页很有效
定义函数以提取数据
处理分页的单独类
UI部分
我发现它不是开源的github repo