Solución:
Tu oyente es de tipo StreamSubscription
, por lo que puede llamar a algunos métodos útiles en su oyente, como cancel()
CollectionReference reference = Firestore.instance.collection('Events');
StreamSubscription<QuerySnapshot> streamSub = reference.snapshots().listen((querySnapshot) {
querySnapshot.documentChanges.forEach((change) {
// Do something with change
});
});
//somewhere
streamSub.cancel();
los listen
el método devuelve un Subscription
Esta clase se usa para cancelar la escucha.
Debe almacenar dentro de su estado ese objeto para cancelar la suscripción al momento de desecharlo.
Respuesta muy tardía, pero pensé que completaría las respuestas anteriores con una muestra de código, ya que podría ser útil para otros.
class EventsScreen extends StatefulWidget {
EventsScreen({Key key}) : super(key: key);
@override
_EventsScreenState createState() => _EventsScreenState();
}
class _EventsScreenState extends State<EventsScreen> {
StreamSubscription<QuerySnapshot> _eventsSubscription;
@override
void initState() {
// Initialise your stream subscription once
CollectionReference eventsReference = Firestore.instance.collection('Events');
_eventsSubscription = eventsReference.snapshots().listen((snapshot) => _onEventsSnapshot);
super.initState();
}
@override
Widget build(BuildContext context) {
// Build your widget here
return Container();
}
void _onEventsSnapshot(QuerySnapshot snapshot) {
// Remove the setState() call if you don't want to refresh your screen whenever you get a fresh snapshot
setState(() {
snapshot?.documentChanges?.forEach(
(docChange) => {
// If you need to do something for each document change, do it here.
},
);
// Anything you might do every time you get a fresh snapshot can be done here.
});
}
@override
void dispose() {
// Cancel your subscription when the screen is disposed
_eventsSubscription?.cancel();
super.dispose();
}
}
Este enfoque aprovecha el estado de StatefulWidget para manejar cambios en los documentos.
Un mejor enfoque sería utilizar un proveedor o el patrón BLoC para que la suscripción a su Firestore no se cree y maneje en la interfaz de usuario.
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)