fix: Resolve breaking changes from Riverpod affecting flame_riverpod (#3080)

Changes to how support for manual listeners is implemented in
flutter_riverpod 2.5.1 (released 4 days ago) have affected
flame_riverpod - specifically, the implementation of
ProviderSubscription.

This PR updates the implementation of manual listeners in flame_riverpod
in the same manner that flutter_riverpod has.
This commit is contained in:
markvideon
2024-03-15 17:27:24 +10:30
committed by GitHub
parent 17da92b2d1
commit e3aaa7c21d
2 changed files with 14 additions and 6 deletions

View File

@ -9,7 +9,7 @@ dependencies:
flame_riverpod: ^5.3.0 flame_riverpod: ^5.3.0
flutter: flutter:
sdk: flutter sdk: flutter
flutter_riverpod: ^2.1.3 flutter_riverpod: ^2.5.1
dev_dependencies: dev_dependencies:
flame_lint: ^0.2.0 flame_lint: ^0.2.0

View File

@ -219,8 +219,13 @@ class RiverpodAwareGameWidgetState<T extends Game> extends GameWidgetState<T>
_assertNotDisposed(); _assertNotDisposed();
final listeners = _manualListeners ??= []; final listeners = _manualListeners ??= [];
// Reading the container using "listen:false" to guarantee that this can
// be used inside initState.
final container = ProviderScope.containerOf(context, listen: false);
final sub = _ListenManual( final sub = _ListenManual(
ProviderScope.containerOf(context, listen: false).listen( container,
container.listen(
provider, provider,
listener, listener,
onError: onError, onError: onError,
@ -234,17 +239,20 @@ class RiverpodAwareGameWidgetState<T extends Game> extends GameWidgetState<T>
} }
} }
class _ListenManual<T> implements ProviderSubscription<T> { class _ListenManual<T> extends ProviderSubscription<T> {
_ListenManual(this._subscription, this._element); _ListenManual(super.source, this._subscription, this._element);
final ProviderSubscription<T> _subscription; final ProviderSubscription<T> _subscription;
final RiverpodAwareGameWidgetState _element; final RiverpodAwareGameWidgetState _element;
@override @override
void close() { void close() {
if (!closed) {
_subscription.close(); _subscription.close();
_element._manualListeners?.remove(this); _element._manualListeners?.remove(this);
} }
super.close();
}
@override @override
T read() => _subscription.read(); T read() => _subscription.read();