gpt4 book ai didi

google-cloud-firestore - Flutter Firestore 分页

转载 作者:IT老高 更新时间:2023-10-28 12:37:48 26 4
gpt4 key购买 nike

我正在尝试使用 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);
});
});

但是控制台这么说。

The following assertion was thrown while handling a gesture: type 'DocumentSnapshot' is not a subtype of type '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(

);
}
}

最佳答案

这里有错误:

     Firestore.instance.collection('user').where('name', isEqualTo: 'Tom').orderBy('age').startAfter(_lastDocument).limit(1).getDocuments().then((snapshot) {
snapshot.documents.forEach((snap) {
print(snap.data);
});
});

startAfter 方法需要一个 List 值参数,而您正在传递一个 DocumentSnapshot

Takes a list of [values], creates and returns a new [Query] that starts after the provided fields relative to the order of the 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);
});
});

关于google-cloud-firestore - Flutter Firestore 分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51717407/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com