mirror of
https://github.com/flame-engine/flame.git
synced 2025-10-31 00:48:47 +08:00
chore: Remove deprecations for v1.4.0 (#1978)
Just removes all the methods and classes that should be removed for v1.4.0
This commit is contained in:
3
.github/workflows/cicd.yml
vendored
3
.github/workflows/cicd.yml
vendored
@ -52,5 +52,6 @@ jobs:
|
|||||||
channel: 'stable'
|
channel: 'stable'
|
||||||
cache: true
|
cache: true
|
||||||
- uses: bluefireteam/melos-action@main
|
- uses: bluefireteam/melos-action@main
|
||||||
- uses: bluefireteam/spec-action@main
|
- run: melos run test # TODO(spydon): Remove once Spec is fixed.
|
||||||
|
#- uses: bluefireteam/spec-action@main
|
||||||
# END TESTING STAGE
|
# END TESTING STAGE
|
||||||
|
|||||||
@ -19,9 +19,6 @@ class OverlayManager {
|
|||||||
return UnmodifiableListView(_activeOverlays);
|
return UnmodifiableListView(_activeOverlays);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated('Use .activeOverlays instead. Will be removed in 1.4.0')
|
|
||||||
Set<String> get value => _activeOverlays.toSet();
|
|
||||||
|
|
||||||
/// Returns if the given [overlayName] is active
|
/// Returns if the given [overlayName] is active
|
||||||
bool isActive(String overlayName) => _activeOverlays.contains(overlayName);
|
bool isActive(String overlayName) => _activeOverlays.contains(overlayName);
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,3 @@
|
|||||||
export 'src/flame_bloc_game.dart';
|
|
||||||
|
|
||||||
export 'src/flame_bloc_listenable.dart';
|
export 'src/flame_bloc_listenable.dart';
|
||||||
export 'src/flame_bloc_listener.dart';
|
export 'src/flame_bloc_listener.dart';
|
||||||
export 'src/flame_bloc_provider.dart';
|
export 'src/flame_bloc_provider.dart';
|
||||||
|
|||||||
@ -1,143 +0,0 @@
|
|||||||
// ignore_for_file: deprecated_member_use_from_same_package
|
|
||||||
|
|
||||||
import 'dart:async';
|
|
||||||
|
|
||||||
import 'package:flame/components.dart';
|
|
||||||
import 'package:flame/game.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
||||||
|
|
||||||
/// Adds capabilities for a [Component] to listen and have access
|
|
||||||
/// to a [Bloc] state.
|
|
||||||
@Deprecated('Use FlameBlocProvider and FlameBlocListenable instead')
|
|
||||||
mixin BlocComponent<B extends BlocBase<S>, S> on Component {
|
|
||||||
StreamSubscription<S>? _subscription;
|
|
||||||
|
|
||||||
S? _state;
|
|
||||||
|
|
||||||
/// The current state of the [Bloc] that this [Component] is listening to.
|
|
||||||
/// Flame keeps a copy of the state on the [Component] so this can be directly
|
|
||||||
/// accessed in both the [update] and the [render] method.
|
|
||||||
S? get state => _state;
|
|
||||||
|
|
||||||
/// Makes this component subscribe to the Bloc changes.
|
|
||||||
/// Visible only for test purposes.
|
|
||||||
@visibleForTesting
|
|
||||||
void subscribe(FlameBloc game) {
|
|
||||||
final _bloc = game.read<B>();
|
|
||||||
_state = _bloc.state;
|
|
||||||
|
|
||||||
_subscription = _bloc.stream.listen((newState) {
|
|
||||||
if (_state != newState) {
|
|
||||||
final _callNewState = listenWhen(_state, newState);
|
|
||||||
_state = newState;
|
|
||||||
|
|
||||||
if (_callNewState) {
|
|
||||||
onNewState(newState);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Makes this component stop listening to the [Bloc] changes.
|
|
||||||
/// Visible only for test purposes.
|
|
||||||
@visibleForTesting
|
|
||||||
void unsubscribe() {
|
|
||||||
_subscription?.cancel();
|
|
||||||
_subscription = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Override this to make [onNewState] be called only when
|
|
||||||
/// a certain state change happens.
|
|
||||||
///
|
|
||||||
/// Default implementation returns true.
|
|
||||||
bool listenWhen(S? previousState, S newState) => true;
|
|
||||||
|
|
||||||
/// Listener called everytime a new state is emitted to this component.
|
|
||||||
///
|
|
||||||
/// Default implementation is a no-op.
|
|
||||||
void onNewState(S state) {}
|
|
||||||
|
|
||||||
@override
|
|
||||||
@mustCallSuper
|
|
||||||
void onMount() {
|
|
||||||
super.onMount();
|
|
||||||
assert(
|
|
||||||
findGame()! is FlameBloc,
|
|
||||||
'BlocComponent can only be added to a FlameBloc game',
|
|
||||||
);
|
|
||||||
final game = findGame()! as FlameBloc;
|
|
||||||
if (game.isAttached) {
|
|
||||||
subscribe(game);
|
|
||||||
} else {
|
|
||||||
game.subscriptionQueue.add(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
@mustCallSuper
|
|
||||||
void onRemove() {
|
|
||||||
super.onRemove();
|
|
||||||
unsubscribe();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// A mixin that enhances a [FlameGame] enabling features to receive
|
|
||||||
/// and emit changes to a [Bloc] state.
|
|
||||||
@Deprecated('Use FlameBlocProvider and FlameBlocListener instead')
|
|
||||||
mixin FlameBloc on FlameGame {
|
|
||||||
/// Contains a list of all of the [BlocComponent]s with an active
|
|
||||||
/// subscription. Only visible for testing.
|
|
||||||
@visibleForTesting
|
|
||||||
final List<BlocComponent> subscriptionQueue = [];
|
|
||||||
|
|
||||||
@override
|
|
||||||
@mustCallSuper
|
|
||||||
void onAttach() {
|
|
||||||
_runSubscriptionQueue();
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
@mustCallSuper
|
|
||||||
void onRemove() {
|
|
||||||
super.onRemove();
|
|
||||||
_unsubscribe();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Convenience method for obtaining the nearest ancestor provider of type
|
|
||||||
/// [T].
|
|
||||||
///
|
|
||||||
/// This method will do a lookup in the tree for [T], so avoid calling this
|
|
||||||
/// inside the game loop methods like [update] and [render] to avoid
|
|
||||||
/// performance issues.
|
|
||||||
T read<T>() {
|
|
||||||
final context = buildContext;
|
|
||||||
if (context == null) {
|
|
||||||
throw Exception('build context is not available yet');
|
|
||||||
}
|
|
||||||
|
|
||||||
return context.read<T>();
|
|
||||||
}
|
|
||||||
|
|
||||||
void _runSubscriptionQueue() {
|
|
||||||
while (subscriptionQueue.isNotEmpty) {
|
|
||||||
final component = subscriptionQueue.removeAt(0);
|
|
||||||
component.subscribe(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void _unsubscribe() {
|
|
||||||
children.whereType<BlocComponent>().forEach((element) {
|
|
||||||
element.unsubscribe();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Provides a default, concrete implementation of a [FlameBloc] game.
|
|
||||||
@Deprecated('Use FlameBlocProvider and FlameBlocListener instead')
|
|
||||||
class FlameBlocGame extends FlameGame with FlameBloc {
|
|
||||||
/// FlameBlocGame constructor with an optional [Camera] as a parameter to
|
|
||||||
/// FlameGame.
|
|
||||||
@Deprecated('Use FlameBlocProvider and FlameBlocListener instead')
|
|
||||||
FlameBlocGame({super.camera});
|
|
||||||
}
|
|
||||||
@ -1,141 +0,0 @@
|
|||||||
// ignore_for_file: deprecated_member_use_from_same_package
|
|
||||||
|
|
||||||
import 'package:flame/components.dart';
|
|
||||||
import 'package:flame_bloc/flame_bloc.dart';
|
|
||||||
import 'package:flame_test/flame_test.dart';
|
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
|
||||||
|
|
||||||
enum InventoryState {
|
|
||||||
sword,
|
|
||||||
bow,
|
|
||||||
}
|
|
||||||
|
|
||||||
class InventoryCubit extends Cubit<InventoryState> {
|
|
||||||
InventoryCubit() : super(InventoryState.sword);
|
|
||||||
|
|
||||||
void selectBow() {
|
|
||||||
emit(InventoryState.bow);
|
|
||||||
}
|
|
||||||
|
|
||||||
void selectSword() {
|
|
||||||
emit(InventoryState.bow);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class MyBlocGame extends FlameBlocGame {}
|
|
||||||
|
|
||||||
class InventoryComponent extends Component
|
|
||||||
with BlocComponent<InventoryCubit, InventoryState> {}
|
|
||||||
|
|
||||||
class MockInventoryComponent extends Component
|
|
||||||
with BlocComponent<InventoryCubit, InventoryState> {
|
|
||||||
int numSubscribeCalls = 0;
|
|
||||||
|
|
||||||
@override
|
|
||||||
void subscribe(FlameBloc game) {
|
|
||||||
numSubscribeCalls++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
group('FlameBlocGame', () {
|
|
||||||
late InventoryCubit cubit;
|
|
||||||
|
|
||||||
setUp(() {
|
|
||||||
cubit = InventoryCubit();
|
|
||||||
});
|
|
||||||
|
|
||||||
final blocGame = FlameTester<MyBlocGame>(
|
|
||||||
MyBlocGame.new,
|
|
||||||
pumpWidget: (gameWidget, tester) async {
|
|
||||||
await tester.pumpWidget(
|
|
||||||
BlocProvider<InventoryCubit>.value(
|
|
||||||
value: cubit,
|
|
||||||
child: gameWidget,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
blocGame.testGameWidget(
|
|
||||||
'can emit states',
|
|
||||||
verify: (game, tester) async {
|
|
||||||
game.read<InventoryCubit>().selectBow();
|
|
||||||
|
|
||||||
expect(cubit.state, equals(InventoryState.bow));
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
blocGame.test(
|
|
||||||
'read throws exception when game is not attached yet',
|
|
||||||
(game) {
|
|
||||||
expect(() => game.read<InventoryCubit>(), throwsException);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
blocGame.test(
|
|
||||||
'adds component to queue when is not attached',
|
|
||||||
(game) {
|
|
||||||
game.add(InventoryComponent());
|
|
||||||
game.update(0);
|
|
||||||
|
|
||||||
expect(game.subscriptionQueue.length, equals(1));
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
blocGame.test(
|
|
||||||
'runs the queue when game is attached',
|
|
||||||
(game) {
|
|
||||||
final component = MockInventoryComponent();
|
|
||||||
game.add(component);
|
|
||||||
game.update(0);
|
|
||||||
expect(game.subscriptionQueue.length, 1);
|
|
||||||
game.onAttach();
|
|
||||||
|
|
||||||
expect(component.numSubscribeCalls, 1);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
blocGame.testGameWidget(
|
|
||||||
'init components with the initial state',
|
|
||||||
setUp: (game, _) async {
|
|
||||||
await game.ensureAdd(InventoryComponent());
|
|
||||||
},
|
|
||||||
verify: (game, tester) async {
|
|
||||||
final component = game.firstChild<InventoryComponent>();
|
|
||||||
expect(component?.state, equals(InventoryState.sword));
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
blocGame.testGameWidget(
|
|
||||||
'Components can be removed',
|
|
||||||
setUp: (game, tester) async {
|
|
||||||
await game.ensureAdd(InventoryComponent());
|
|
||||||
},
|
|
||||||
verify: (game, tester) async {
|
|
||||||
expect(game.children.length, 1);
|
|
||||||
|
|
||||||
final component = game.firstChild<InventoryComponent>();
|
|
||||||
expect(component, isNotNull);
|
|
||||||
|
|
||||||
game.remove(component!);
|
|
||||||
game.update(0);
|
|
||||||
expect(game.children.length, 0);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
blocGame.testGameWidget(
|
|
||||||
'components listen to changes',
|
|
||||||
setUp: (game, _) async {
|
|
||||||
await game.ensureAdd(InventoryComponent());
|
|
||||||
},
|
|
||||||
verify: (game, tester) async {
|
|
||||||
final component = game.firstChild<InventoryComponent>();
|
|
||||||
game.read<InventoryCubit>().selectBow();
|
|
||||||
|
|
||||||
expect(component?.state, equals(InventoryState.sword));
|
|
||||||
},
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user