我正在尝试使用进行分页Firestore,我阅读了文档,并在Swift
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); }); });
但是控制台这样说。
处理手势时引发了以下断言:类型’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( ); } }
这里有一个错误:
startAfter方法需要一个List值参数,而您正在传递DocumentSnapshot。
startAfter
DocumentSnapshot
获取[值]的列表,创建并返回一个新的[Query],该查询在相对于查询顺序的所提供字段之后开始。
您可以尝试这样的事情:
Firestore.instance.collection('user').where('name', isEqualTo: 'Tom').orderBy('age').startAfter([{'name': 'Tom'}]).limit(1).getDocuments().then((snapshot) { snapshot.documents.forEach((snap) { print(snap.data); }); });