Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import 'package:flame/devtools.dart';
import 'package:flame_devtools/repository.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_riverpod/legacy.dart';

final selectedTreeNodeProvider = StateProvider<TreeNode<ComponentTreeNode>?>(
(_) => null,
Expand Down
2 changes: 1 addition & 1 deletion packages/flame_devtools/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ dependencies:
flame: ^1.34.0
flutter:
sdk: flutter
flutter_riverpod: ^2.6.1
flutter_riverpod: ^3.0.3

dev_dependencies:
flame_lint: ^1.4.2
Expand Down
2 changes: 1 addition & 1 deletion packages/flame_riverpod/example/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ dependencies:
flame_riverpod: ^5.4.21
flutter:
sdk: flutter
flutter_riverpod: ^2.5.1
flutter_riverpod: ^3.0.3

dev_dependencies:
flame_lint: ^1.4.2
Expand Down
11 changes: 2 additions & 9 deletions packages/flame_riverpod/lib/src/consumer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,25 +4,23 @@ import 'package:flame/game.dart';
import 'package:flame_riverpod/src/widget.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_riverpod/misc.dart';

class ComponentRef implements WidgetRef {
class ComponentRef {
ComponentRef({required this.game});

RiverpodGameMixin? game;

@override
BuildContext get context => game!.buildContext!;

RiverpodAwareGameWidgetState? get _container {
return game?.widgetKey?.currentState;
}

@override
Res watch<Res>(ProviderListenable<Res> target) {
return _container!.watch(target);
}

@override
void listen<T>(
ProviderListenable<T> provider,
void Function(T? previous, T value) listener, {
Expand All @@ -31,27 +29,22 @@ class ComponentRef implements WidgetRef {
_container!.listen(provider, listener, onError: onError);
}

@override
bool exists(ProviderBase<Object?> provider) {
return _container!.exists(provider);
}

@override
T read<T>(ProviderListenable<T> provider) {
return _container!.read(provider);
}

@override
T refresh<T>(Refreshable<T> provider) {
return _container!.refresh(provider);
}

@override
void invalidate(ProviderOrFamily provider) {
_container!.invalidate(provider);
}

@override
ProviderSubscription<T> listenManual<T>(
ProviderListenable<T> provider,
void Function(T? previous, T next) listener, {
Expand Down
64 changes: 19 additions & 45 deletions packages/flame_riverpod/lib/src/widget.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import 'package:riverpod/src/framework.dart';
/// access to Riverpod [Provider]s.
///
/// The corresponding [State] object ([RiverpodAwareGameWidgetState]) assumes
/// responsibilities associated with [ConsumerStatefulElement] in
/// responsibilities associated with ConsumerStatefulElement in
/// `flutter_riverpod`.
class RiverpodAwareGameWidget<T extends Game> extends GameWidget<T> {
RiverpodAwareGameWidget({
Expand All @@ -36,8 +36,7 @@ class RiverpodAwareGameWidget<T extends Game> extends GameWidget<T> {
GameWidgetState<T> createState() => RiverpodAwareGameWidgetState<T>();
}

class RiverpodAwareGameWidgetState<T extends Game> extends GameWidgetState<T>
implements WidgetRef {
class RiverpodAwareGameWidgetState<T extends Game> extends GameWidgetState<T> {
RiverpodGameMixin get game => widget.game! as RiverpodGameMixin;

bool _isForceBuilding = false;
Expand All @@ -49,7 +48,7 @@ class RiverpodAwareGameWidgetState<T extends Game> extends GameWidgetState<T>
Map<ProviderListenable<Object?>, ProviderSubscription<Object?>>?
_oldDependencies;
final _listeners = <ProviderSubscription<Object?>>[];
List<_ListenManual<Object?>>? _manualListeners;
List<ProviderSubscription<Object?>>? _manualListeners;

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

@override
Res watch<Res>(ProviderListenable<Res> target) {
_assertNotDisposed();
return _dependencies.putIfAbsent(target, () {
Expand All @@ -167,7 +165,6 @@ class RiverpodAwareGameWidgetState<T extends Game> extends GameWidgetState<T>
as Res;
}

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

@override
bool exists(ProviderBase<Object?> provider) {
_assertNotDisposed();
return ProviderScope.containerOf(context, listen: false).exists(provider);
}

@override
Res read<Res>(ProviderListenable<Res> provider) {
_assertNotDisposed();
return ProviderScope.containerOf(context, listen: false).read(provider);
}

@override
S refresh<S>(Refreshable<S> provider) {
_assertNotDisposed();
return ProviderScope.containerOf(context, listen: false).refresh(provider);
}

@override
void invalidate(ProviderOrFamily provider) {
_assertNotDisposed();
_container.invalidate(provider);
}

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

final sub = _ListenManual(
container,
container.listen(
provider,
listener,
onError: onError,
fireImmediately: fireImmediately,
),
this,
final sub = container.listen<Res>(
provider,
listener,
onError: onError,
fireImmediately: fireImmediately,
// ignore: invalid_use_of_internal_member, from riverpod
);
listeners.add(sub);

return sub;
}
}

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

final ProviderSubscription<T> _subscription;
final RiverpodAwareGameWidgetState _element;
listeners.add(sub);

@override
void close() {
if (!closed) {
_subscription.close();
_element._manualListeners?.remove(this);
}
super.close();
return sub;
}

@override
T read() => _subscription.read();

@override
bool get closed => _subscription.closed;

@override
Node get source => _subscription.source;
}
4 changes: 2 additions & 2 deletions packages/flame_riverpod/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ dependencies:
flame: ^1.34.0
flutter:
sdk: flutter
flutter_riverpod: ^2.5.1
riverpod: ^2.5.1
flutter_riverpod: ^3.0.3
riverpod: ^3.0.3

dev_dependencies:
flame_lint: ^1.4.2
Expand Down
2 changes: 1 addition & 1 deletion packages/flame_studio/lib/src/core/component_tree.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import 'package:flame/components.dart';
import 'package:flame/game.dart';
import 'package:flame_studio/src/core/game_controller.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_riverpod/legacy.dart';

final componentTreeProvider =
StateNotifierProvider<ComponentTreeObserver, ComponentTreeState>((ref) {
Expand Down
2 changes: 1 addition & 1 deletion packages/flame_studio/lib/src/core/game_controller.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import 'package:flame/game.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_riverpod/legacy.dart';

final gameControllerProvider =
StateNotifierProvider<_GameController, _GameState>(
Expand Down
1 change: 1 addition & 0 deletions packages/flame_studio/lib/src/widgets/left_panel.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'package:flame_studio/src/core/theme.dart';
import 'package:flame_studio/src/widgets/panels/hierarchy_view.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_riverpod/legacy.dart';

class LeftPanel extends ConsumerWidget {
const LeftPanel({super.key});
Expand Down
2 changes: 1 addition & 1 deletion packages/flame_studio/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ dependencies:
flame: ^1.34.0
flutter:
sdk: flutter
flutter_riverpod: ^2.3.6
flutter_riverpod: ^3.0.3
meta: ^1.12.0

dev_dependencies:
Expand Down