Saltar al contenido

Deja de escuchar actualizaciones de instantáneas en Cloud Firestore en Flutter

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)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *