Firstore 中的 .limit() 方法足够智能,可以根据不断变化的 int 变量检测新的数据限制
is .limit() Method from Firstore is smart enough to detect new data limit depends on the changing int variable
我有 StatefulWidget
,其中包含 Future.Bulder Widget
和 Listview.builder 中的侦听器控制器方法,就像这样
class Messages extends StatefulWidget {
const Messages({Key? key,}) : super(key: key);
@override
_MessagesState createState() => _MessagesState();
}
class _MessagesState extends State<Messages> {
int limit = 10 ;
@override
void initState() {
controller!.addListener(listener);
super.initState();
}
listener(){
if (controller!.offset >= controller!.position.maxScrollExtent && !controller!.position.outOfRange) {
setState(() {
limit = limit+10;
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: FutureBuilder(
future: FirebaseFirestore.instance.collection("users").limit(limit).get(),
builder: (context , AsyncSnapshot<QuerySnapshot> messages ) {
if (!messages.hasData) {
return Center(
child: circulearProgress(),);
}
return ListView.builder(
controller: controller,
itemCount: messages.data!.docs.length ,
itemBuilder: (context , int index){
DocumentSnapshot documentSnapshot = messages.data!.docs [index] ;
return Text(documentSnapshot['textMessage']);
);
}
)
);
}
}
好的,现在 .get() 将默认获取 10 个文档,我还处理监听器以增加 10 以限制变量,一旦用户滚动到向下页面然后流式获取除之前的旧 10 个文档之外的其他 10 个文档..现在的问题是
.get() 会在用户每次向下滚动时只读取新的 10 个文档,还是会再次读取旧的前 10 个文档和新的 10 个文档??
如果不是,如何避免在同一个示例中再次阅读旧文档 ..
任何使用解决方案示例对我的代码进行的编辑将不胜感激..
此致
回答你的问题-
Will .get() read only the new 10 docs every time that user scrolls down OR will it read again the old previous 10 docs with new 10 ones?
是的,它将读取以前的文档和新的 10 个文档。此处您将增加限制并根据新限制获取数据,因此它将获取 limit() 方法中指定的文档数。因此,每次增加限制时,它都会获取前一组文档以及新的 10 个文档。
如果你想要分页,比如获取前 10 个文档,然后只获取接下来的 10 组文档,那么我建议你使用 limit
方法和 startAfterDocument
方法并将现有文档作为 startAfterDocument
参数传递。您可以找到有关限制和使用 startAfterDocument
here.
的更多信息
要详细了解 Firestore 中的分页,您可以查看 this video。
我有 StatefulWidget
,其中包含 Future.Bulder Widget
和 Listview.builder 中的侦听器控制器方法,就像这样
class Messages extends StatefulWidget {
const Messages({Key? key,}) : super(key: key);
@override
_MessagesState createState() => _MessagesState();
}
class _MessagesState extends State<Messages> {
int limit = 10 ;
@override
void initState() {
controller!.addListener(listener);
super.initState();
}
listener(){
if (controller!.offset >= controller!.position.maxScrollExtent && !controller!.position.outOfRange) {
setState(() {
limit = limit+10;
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: FutureBuilder(
future: FirebaseFirestore.instance.collection("users").limit(limit).get(),
builder: (context , AsyncSnapshot<QuerySnapshot> messages ) {
if (!messages.hasData) {
return Center(
child: circulearProgress(),);
}
return ListView.builder(
controller: controller,
itemCount: messages.data!.docs.length ,
itemBuilder: (context , int index){
DocumentSnapshot documentSnapshot = messages.data!.docs [index] ;
return Text(documentSnapshot['textMessage']);
);
}
)
);
}
}
好的,现在 .get() 将默认获取 10 个文档,我还处理监听器以增加 10 以限制变量,一旦用户滚动到向下页面然后流式获取除之前的旧 10 个文档之外的其他 10 个文档..现在的问题是
.get() 会在用户每次向下滚动时只读取新的 10 个文档,还是会再次读取旧的前 10 个文档和新的 10 个文档??
如果不是,如何避免在同一个示例中再次阅读旧文档 ..
任何使用解决方案示例对我的代码进行的编辑将不胜感激..
此致
回答你的问题-
Will .get() read only the new 10 docs every time that user scrolls down OR will it read again the old previous 10 docs with new 10 ones?
是的,它将读取以前的文档和新的 10 个文档。此处您将增加限制并根据新限制获取数据,因此它将获取 limit() 方法中指定的文档数。因此,每次增加限制时,它都会获取前一组文档以及新的 10 个文档。
如果你想要分页,比如获取前 10 个文档,然后只获取接下来的 10 组文档,那么我建议你使用 limit
方法和 startAfterDocument
方法并将现有文档作为 startAfterDocument
参数传递。您可以找到有关限制和使用 startAfterDocument
here.
要详细了解 Firestore 中的分页,您可以查看 this video。