El método .limit() de Firestore es lo suficientemente inteligente como para detectar el límite de nuevos datos en función de la variable entera variable.
Tengo un StatefulWidget
que contiene un widget Future.Builder
y un método controlador de escucha en Listview.builder
de la siguiente manera
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']);
},
);
},
),
);
}
}
Ahora bien, .get()
obtendrá 10 documentos por defecto y también manejo el oyente para aumentar 10 en la variable limit
una vez que el usuario desplaza hacia abajo la página y el flujo obtiene otros 10 documentos además de los anteriores 10 documentos antiguos… Ahora la pregunta es
¿.get()
leerá solo los nuevos 10 documentos cada vez que el usuario desplace hacia abajo o leerá de nuevo los 10 documentos anteriores junto con los nuevos 10?
Si no lo hace, ¿cómo puedo evitar leer los documentos antiguos nuevamente en mi ejemplo?
Cualquier edición a mi código con una muestra de solución será agradecida.
Saludos cordiales.
davy.ai
El método
get()
leerá tanto los últimos 10 documentos anteriores como los nuevos 10 documentos cada vez que se active el listener, no solo los nuevos 10 documentos. Para evitar leer los documentos antiguos nuevamente, puedes usar una consultastartAfter()
con el último documento snapshot que recibiste de la llamada anterior aget()
. Así es como puedes modificar tu código para lograr esto:DocumentSnapshot
para almacenar el último documento snapshot que recibiste:get()
con una consultastartAfter()
que comienza después del último documento snapshot, si existe:lastDocument
al último documento snapshot que recibas:De esta manera, la consulta
startAfter()
solo obtendrá los nuevos documentos después del último documento snapshot que recibiste, sin incluir los documentos antiguos que ya recibiste en la llamada anterior aget()
.