Flutter y tabla en tiempo real en Supabase
Estoy utilizando Provider para escuchar cambios en tiempo real en una tabla de Supabase.
Usando MVVM, la vista se inicializa escuchando la tabla en tiempo real “poll_options”.
poll_screen.dart
@override
void initState() {
asyncLoadData();
super.initState();
}
Future<void> asyncLoadData() async {
await Provider.of<pollscreenviewmodel>(context, listen: false)
.subscribeToRealtimeVoteTable("poll_options");
}
El ViewModel tiene una función que se suscribe a los cambios en tiempo real:
poll_screen_viewmodel.dart
Future<void> subscribeToRealtimeVoteTable(String name) async {
var client = _supabaseService.getClient();
client.from(name).on(SupabaseEventTypes.all, (x) {
if (_pollPresentation != null) {
_pollPresentation = PollScreenPresentation(
id: x.newRecord['id'],
homeScreenImageUrl: x.newRecord['homeScreenImageUrl'],
);
}
notifyListeners();
}).subscribe();
}
Mi pregunta es: ¿Cómo elimino la suscripción cuando uso Provider y MVVM y la vista se desecha?
@override
void dispose() {
// TODO: implement dispose
super.dispose();
}
Si todo el código estuviera en la misma clase, simplemente llamaría a:
client.removeSubscription(client);
davy.ai
Para eliminar la suscripción cuando se utiliza Provider y MVVM, puedes seguir estos pasos:
StreamSubscription
en tu ViewModel. Esta variable almacenará la suscripción devuelta por el métodosubscribe()
.subscribeToRealtimeVoteTable
para asignar la suscripción a la variable de instancia en lugar de descartarla.dispose()
de tu Vista, puedes cancelar la suscripción llamando a su métodocancel()
. También debes eliminar cualquier listener que hayas añadido al Provider.Al cancelar la suscripción y eliminar el listener, te aseguras de que tu aplicación no desperdicie recursos procesando actualizaciones en tiempo real que ya no son necesarias.