Verhindern Sie den Flatterfehler "Versucht, Provider mit einem Subtyp von Listenable / Stream zu verwenden"


9

Ich möchte das Provider-Paket (4.0) in meinem Flatterprojekt verwenden, erhalte jedoch den Fehler / die Warnung "Versucht, Provider mit einem Subtyp von Listenable / Stream zu verwenden".

Meine Konstitution:

Ich habe eine Api()Klasse, die Basis-CRUD-Funktionalität für Firebase-Cloud-Speicher enthält.

Ich habe eine EventService()Klasse, die die Api()Klasse mit einem konkreten Parameter verwendet.

Für meine Ansicht habe ich eine ViewModel-Klasse namens, EventOverviewModeldie den EventService verwendet.

Meine Provider-Konfiguration sieht folgendermaßen aus:

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 = [];

Alles scheint in der Anwendung zu funktionieren, aber ich bekomme trotzdem den "Versucht, Provider mit einem Subtyp von Listenable / Stream zu verwenden".

Wie soll ich meinen Code so ändern, dass diese Fehlermeldung nicht mehr angezeigt wird?

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 ...

Antworten:


6

Versuchen Sie es zu ändern

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

zu:

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

Und

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

zu:

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

Ich vermute , Event oder EventOverviewModel verlängern oder mixin ChangeNotifierund irgendwo in Ihrem Code , den Sie hören für Änderungen in den Werten von Provider<EventService>und ProxyProvider<EventOverviewModel>, aber diese Änderungen werden nie übertragen / empfangen , wenn Ihr Anbieter ist „Listenable “.

Wenn Ihre Modelle erweitert / gemischt ChangeNotifierwerden und sie anrufen notifyListeners(), müssen die Anbieter dieser Modelle "hörbar" sein.

ListenableProvider
ListenableProxyProvider

Vielen Dank, Bruder. Beachten Sie auch, dass in der Dokumentation die Verwendung von ChangeNotifierProxyProvider anstelle von ListenableProxyProvider empfohlen wird. Beide müssen einen Erstellungsparameter erstellen, der den Anfangszustand von EventOverviewModel zurückgibt
Ahmed D. Sherif,
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.