Evite el error de aleteo "Intentó usar el proveedor con un subtipo de escucha / transmisión"

9

Quiero usar el paquete del proveedor (4.0) en mi proyecto de flutter pero aparece el error / advertencia "Intenté usar el proveedor con un subtipo de escucha / transmisión".

Mi constelación:

Tengo una Api()clase que contiene la funcionalidad CRUD base para firebase-cloudstorage.

Tengo una EventService()clase que usa la Api()clase con un parámetro concreto.

En mi opinión, tengo una clase ViewModel llamada EventOverviewModelque usa EventService.

La configuración de mi proveedor se ve así:

List<SingleChildWidget> providers = [
  ...independentServices,
  ...dependentServices,
  ...uiConsumableProviders,
];

// Services die unabhängig von anderen sind
List<SingleChildWidget> independentServices = [
  Provider<EventService>(create: (_) => EventService(api: Api('events')))
];

// Services die von anderen Services abhängig sind
List<SingleChildWidget> dependentServices = [
  ProxyProvider<EventService, EventOverviewModel>(
    update: (_, srvc, __) => EventOverviewModel(eventService: srvc),
  )
];

List<SingleChildWidget> uiConsumableProviders = [];

Todo parece funcionar en la aplicación, pero de todos modos aparece el "Probado para usar el proveedor con un subtipo de Listenable / Stream".

¿Cómo debo cambiar mi código para no recibir más este mensaje de error?

Running Gradle task 'assembleDebug'...
I/flutter (16553): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter (16553): The following assertion was thrown building NumericProxyProvider<EventService, Void, Void, Void,
I/flutter (16553): Void, Void, EventOverviewModel>(dirty, dependencies: [InheritedProvider<EventService>], state:
I/flutter (16553): _ProxyProviderState<EventOverviewModel>#8d38d):
I/flutter (16553): Tried to use Provider with a subtype of Listenable/Stream (EventOverviewModel).
I/flutter (16553): 
I/flutter (16553): This is likely a mistake, as Provider will not automatically update dependents
I/flutter (16553): when EventOverviewModel is updated. Instead, consider changing Provider for more specific
I/flutter (16553): implementation that handles the update mechanism, such as:
I/flutter (16553): 
I/flutter (16553): - ListenableProvider
I/flutter (16553): - ChangeNotifierProvider
I/flutter (16553): - ValueListenableProvider
I/flutter (16553): - StreamProvider
I/flutter (16553): 
I/flutter (16553): Alternatively, if you are making your own provider, consider using InheritedProvider.
I/flutter (16553): 
I/flutter (16553): If you think that this is not an error, you can disable this check by setting
I/flutter (16553): Provider.debugCheckInvalidValueType to `null` in your main file:
I/flutter (16553): 
I/flutter (16553): ```
I/flutter (16553): void main() {
I/flutter (16553):   Provider.debugCheckInvalidValueType = null;
I/flutter (16553): 
I/flutter (16553):   runApp(MyApp());
I/flutter (16553): }
I/flutter (16553): ```
I/flutter (16553): 
I/flutter (16553): 
I/flutter (16553): The relevant error-causing widget was:
I/flutter (16553):   NumericProxyProvider<EventService, Void, Void, Void, Void, Void, EventOverviewModel>
I/flutter (16553):   file:///E:/Dev/flutter/.pub-cache/hosted/pub.dartlang.org/provider-3.2.0/lib/src/proxy_provider.dart:232:12
I/flutter (16553): 
I/flutter (16553): When the exception was thrown, this was the stack:
I/flutter (16553): #0      Provider.debugCheckInvalidValueType.<anonymous closure>.<anonymous ...
rubiktubik
fuente

Respuestas:

6

Intenta cambiar

List<SingleChildWidget> independentServices = [
  Provider<EventService>(create: (_) => EventService(api: Api('events')))
];

a:

List<SingleChildWidget> independentServices = [
  ListenableProvider<EventService>(create: (_) => EventService(api: Api('events')))
];

Y

List<SingleChildWidget> dependentServices = [
  ProxyProvider<EventService, EventOverviewModel>(
    update: (_, srvc, __) => EventOverviewModel(eventService: srvc),
  )
];

a:

List<SingleChildWidget> dependentServices = [
  ListenableProxyProvider<EventService, EventOverviewModel>(
    update: (_, srvc, __) => EventOverviewModel(eventService: srvc),
  )
];

Supongo que EventService o EventOverviewModel se extienden o mezclan ChangeNotifiery en algún lugar de su código está escuchando cambios en los valores de Provider<EventService>y ProxyProvider<EventOverviewModel>, pero esos cambios nunca serán transmitidos / recibidos a menos que sus proveedores sean "escuchables".

Entonces, si sus modelos se extienden / mezclan ChangeNotifier, y están llamando notifyListeners(), los proveedores de esos modelos deben ser "escuchables".

ListenableProvider
ListenableProxyProvider
Panadero
fuente
gracias hermano también tenga en cuenta que la documentación recomienda usar ChangeNotifierProxyProvider en lugar de ListenableProxyProvider y ambos necesitan crear un parámetro que devuelva el estado inicial EventOverviewModel
Ahmed D. Sherif