Je veux utiliser le package de fournisseur (4.0) dans mon projet de flottement, mais j'obtiens l'erreur/avertissement "J'ai essayé d'utiliser le fournisseur avec un sous-type de Listenable/Stream".
Ma constellation:
J'ai une classe Api()
qui contient la fonctionnalité CRUD de base pour firebase-cloudstorage.
J'ai une classe EventService()
- qui utilise la classe Api()
- avec un paramètre concret.
Pour ma vue, j'ai une classe ViewModel appelée EventOverviewModel
qui utilise EventService.
Ma configuration de fournisseur ressemble à ceci:
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 = [];
Tout semble fonctionner dans l'application mais j'obtiens quand même le "J'ai essayé d'utiliser le fournisseur avec un sous-type de Listenable/Stream".
Comment changer mon code pour ne plus recevoir ce message d'erreur?
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 ...
Essayez de changer
List<SingleChildWidget> independentServices = [
Provider<EventService>(create: (_) => EventService(api: Api('events')))
];
à:
List<SingleChildWidget> independentServices = [
ListenableProvider<EventService>(create: (_) => EventService(api: Api('events')))
];
Et
List<SingleChildWidget> dependentServices = [
ProxyProvider<EventService, EventOverviewModel>(
update: (_, srvc, __) => EventOverviewModel(eventService: srvc),
)
];
à:
List<SingleChildWidget> dependentServices = [
ListenableProxyProvider<EventService, EventOverviewModel>(
update: (_, srvc, __) => EventOverviewModel(eventService: srvc),
)
];
Je suppose que EventService ou EventOverviewModel étendent ou mélangent ChangeNotifier
et quelque part dans votre code, vous êtes écoute pour les changements de valeurs de Provider<EventService>
Et ProxyProvider<EventOverviewModel>
, mais ces modifications ne seront jamais diffusées/reçues à moins que vos fournisseurs ne soient "écoutables".
Donc, si vos modèles étendent/mixin ChangeNotifier
, et qu'ils appellent notifyListeners()
, les fournisseurs de ces modèles doivent être "Listenable".
ListenableProvider
ListenableProxyProvider