Skip to content

Commit 57f7f9d

Browse files
authored
feat: Riverpod 3.0 in flame_riverpod (#3789)
fix #3773.
1 parent 9ac53a6 commit 57f7f9d

File tree

10 files changed

+30
-61
lines changed

10 files changed

+30
-61
lines changed

packages/flame_devtools/lib/widgets/component_tree_model.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'package:flame/devtools.dart';
33
import 'package:flame_devtools/repository.dart';
44
import 'package:flutter/material.dart';
55
import 'package:flutter_riverpod/flutter_riverpod.dart';
6+
import 'package:flutter_riverpod/legacy.dart';
67

78
final selectedTreeNodeProvider = StateProvider<TreeNode<ComponentTreeNode>?>(
89
(_) => null,

packages/flame_devtools/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ dependencies:
1414
flame: ^1.34.0
1515
flutter:
1616
sdk: flutter
17-
flutter_riverpod: ^2.6.1
17+
flutter_riverpod: ^3.0.3
1818

1919
dev_dependencies:
2020
flame_lint: ^1.4.2

packages/flame_riverpod/example/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ dependencies:
1010
flame_riverpod: ^5.4.21
1111
flutter:
1212
sdk: flutter
13-
flutter_riverpod: ^2.5.1
13+
flutter_riverpod: ^3.0.3
1414

1515
dev_dependencies:
1616
flame_lint: ^1.4.2

packages/flame_riverpod/lib/src/consumer.dart

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,23 @@ import 'package:flame/game.dart';
44
import 'package:flame_riverpod/src/widget.dart';
55
import 'package:flutter/cupertino.dart';
66
import 'package:flutter_riverpod/flutter_riverpod.dart';
7+
import 'package:flutter_riverpod/misc.dart';
78

8-
class ComponentRef implements WidgetRef {
9+
class ComponentRef {
910
ComponentRef({required this.game});
1011

1112
RiverpodGameMixin? game;
1213

13-
@override
1414
BuildContext get context => game!.buildContext!;
1515

1616
RiverpodAwareGameWidgetState? get _container {
1717
return game?.widgetKey?.currentState;
1818
}
1919

20-
@override
2120
Res watch<Res>(ProviderListenable<Res> target) {
2221
return _container!.watch(target);
2322
}
2423

25-
@override
2624
void listen<T>(
2725
ProviderListenable<T> provider,
2826
void Function(T? previous, T value) listener, {
@@ -31,27 +29,22 @@ class ComponentRef implements WidgetRef {
3129
_container!.listen(provider, listener, onError: onError);
3230
}
3331

34-
@override
3532
bool exists(ProviderBase<Object?> provider) {
3633
return _container!.exists(provider);
3734
}
3835

39-
@override
4036
T read<T>(ProviderListenable<T> provider) {
4137
return _container!.read(provider);
4238
}
4339

44-
@override
4540
T refresh<T>(Refreshable<T> provider) {
4641
return _container!.refresh(provider);
4742
}
4843

49-
@override
5044
void invalidate(ProviderOrFamily provider) {
5145
_container!.invalidate(provider);
5246
}
5347

54-
@override
5548
ProviderSubscription<T> listenManual<T>(
5649
ProviderListenable<T> provider,
5750
void Function(T? previous, T next) listener, {

packages/flame_riverpod/lib/src/widget.dart

Lines changed: 19 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import 'package:riverpod/src/framework.dart';
1111
/// access to Riverpod [Provider]s.
1212
///
1313
/// The corresponding [State] object ([RiverpodAwareGameWidgetState]) assumes
14-
/// responsibilities associated with [ConsumerStatefulElement] in
14+
/// responsibilities associated with ConsumerStatefulElement in
1515
/// `flutter_riverpod`.
1616
class RiverpodAwareGameWidget<T extends Game> extends GameWidget<T> {
1717
RiverpodAwareGameWidget({
@@ -36,8 +36,7 @@ class RiverpodAwareGameWidget<T extends Game> extends GameWidget<T> {
3636
GameWidgetState<T> createState() => RiverpodAwareGameWidgetState<T>();
3737
}
3838

39-
class RiverpodAwareGameWidgetState<T extends Game> extends GameWidgetState<T>
40-
implements WidgetRef {
39+
class RiverpodAwareGameWidgetState<T extends Game> extends GameWidgetState<T> {
4140
RiverpodGameMixin get game => widget.game! as RiverpodGameMixin;
4241

4342
bool _isForceBuilding = false;
@@ -49,7 +48,7 @@ class RiverpodAwareGameWidgetState<T extends Game> extends GameWidgetState<T>
4948
Map<ProviderListenable<Object?>, ProviderSubscription<Object?>>?
5049
_oldDependencies;
5150
final _listeners = <ProviderSubscription<Object?>>[];
52-
List<_ListenManual<Object?>>? _manualListeners;
51+
List<ProviderSubscription<Object?>>? _manualListeners;
5352

5453
/// Rebuilds the [RiverpodAwareGameWidget] by calling [setState].
5554
/// As it is undesirable to call [setState] while the widget may be building,
@@ -146,7 +145,6 @@ class RiverpodAwareGameWidgetState<T extends Game> extends GameWidgetState<T>
146145
}
147146
}
148147

149-
@override
150148
Res watch<Res>(ProviderListenable<Res> target) {
151149
_assertNotDisposed();
152150
return _dependencies.putIfAbsent(target, () {
@@ -167,7 +165,6 @@ class RiverpodAwareGameWidgetState<T extends Game> extends GameWidgetState<T>
167165
as Res;
168166
}
169167

170-
@override
171168
void listen<U>(
172169
ProviderListenable<U> provider,
173170
void Function(U? previous, U value) listener, {
@@ -186,31 +183,26 @@ class RiverpodAwareGameWidgetState<T extends Game> extends GameWidgetState<T>
186183
_listeners.add(sub);
187184
}
188185

189-
@override
190186
bool exists(ProviderBase<Object?> provider) {
191187
_assertNotDisposed();
192188
return ProviderScope.containerOf(context, listen: false).exists(provider);
193189
}
194190

195-
@override
196191
Res read<Res>(ProviderListenable<Res> provider) {
197192
_assertNotDisposed();
198193
return ProviderScope.containerOf(context, listen: false).read(provider);
199194
}
200195

201-
@override
202196
S refresh<S>(Refreshable<S> provider) {
203197
_assertNotDisposed();
204198
return ProviderScope.containerOf(context, listen: false).refresh(provider);
205199
}
206200

207-
@override
208201
void invalidate(ProviderOrFamily provider) {
209202
_assertNotDisposed();
210203
_container.invalidate(provider);
211204
}
212205

213-
@override
214206
ProviderSubscription<Res> listenManual<Res>(
215207
ProviderListenable<Res> provider,
216208
void Function(Res? previous, Res next) listener, {
@@ -224,43 +216,25 @@ class RiverpodAwareGameWidgetState<T extends Game> extends GameWidgetState<T>
224216
// be used inside initState.
225217
final container = ProviderScope.containerOf(context, listen: false);
226218

227-
final sub = _ListenManual(
228-
container,
229-
container.listen(
230-
provider,
231-
listener,
232-
onError: onError,
233-
fireImmediately: fireImmediately,
234-
),
235-
this,
219+
final sub = container.listen<Res>(
220+
provider,
221+
listener,
222+
onError: onError,
223+
fireImmediately: fireImmediately,
224+
// ignore: invalid_use_of_internal_member, from riverpod
236225
);
237-
listeners.add(sub);
238-
239-
return sub;
240-
}
241-
}
242226

243-
class _ListenManual<T> extends ProviderSubscription<T> {
244-
_ListenManual(super.source, this._subscription, this._element);
227+
// Hook-up on onClose to avoid memory leaks.
228+
final previousOnClose = sub.impl.onClose;
229+
sub.impl.onClose = () {
230+
previousOnClose?.call();
231+
// If the subscription is closed, we remove it from the manual listeners
232+
// so that it doesn't leak.
233+
_manualListeners?.remove(sub);
234+
};
245235

246-
final ProviderSubscription<T> _subscription;
247-
final RiverpodAwareGameWidgetState _element;
236+
listeners.add(sub);
248237

249-
@override
250-
void close() {
251-
if (!closed) {
252-
_subscription.close();
253-
_element._manualListeners?.remove(this);
254-
}
255-
super.close();
238+
return sub;
256239
}
257-
258-
@override
259-
T read() => _subscription.read();
260-
261-
@override
262-
bool get closed => _subscription.closed;
263-
264-
@override
265-
Node get source => _subscription.source;
266240
}

packages/flame_riverpod/pubspec.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ dependencies:
1919
flame: ^1.34.0
2020
flutter:
2121
sdk: flutter
22-
flutter_riverpod: ^2.5.1
23-
riverpod: ^2.5.1
22+
flutter_riverpod: ^3.0.3
23+
riverpod: ^3.0.3
2424

2525
dev_dependencies:
2626
flame_lint: ^1.4.2

packages/flame_studio/lib/src/core/component_tree.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import 'package:flame/components.dart';
22
import 'package:flame/game.dart';
33
import 'package:flame_studio/src/core/game_controller.dart';
44
import 'package:flutter/foundation.dart';
5-
import 'package:flutter_riverpod/flutter_riverpod.dart';
5+
import 'package:flutter_riverpod/legacy.dart';
66

77
final componentTreeProvider =
88
StateNotifierProvider<ComponentTreeObserver, ComponentTreeState>((ref) {

packages/flame_studio/lib/src/core/game_controller.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import 'package:flame/game.dart';
22
import 'package:flutter/widgets.dart';
3-
import 'package:flutter_riverpod/flutter_riverpod.dart';
3+
import 'package:flutter_riverpod/legacy.dart';
44

55
final gameControllerProvider =
66
StateNotifierProvider<_GameController, _GameState>(

packages/flame_studio/lib/src/widgets/left_panel.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import 'package:flame_studio/src/core/theme.dart';
22
import 'package:flame_studio/src/widgets/panels/hierarchy_view.dart';
33
import 'package:flutter/widgets.dart';
44
import 'package:flutter_riverpod/flutter_riverpod.dart';
5+
import 'package:flutter_riverpod/legacy.dart';
56

67
class LeftPanel extends ConsumerWidget {
78
const LeftPanel({super.key});

packages/flame_studio/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ dependencies:
1818
flame: ^1.34.0
1919
flutter:
2020
sdk: flutter
21-
flutter_riverpod: ^2.3.6
21+
flutter_riverpod: ^3.0.3
2222
meta: ^1.12.0
2323

2424
dev_dependencies:

0 commit comments

Comments
 (0)