diff --git a/packages/flame/lib/src/game/game_widget/game_widget.dart b/packages/flame/lib/src/game/game_widget/game_widget.dart index e79ea90717e..7e279622bac 100644 --- a/packages/flame/lib/src/game/game_widget/game_widget.dart +++ b/packages/flame/lib/src/game/game_widget/game_widget.dart @@ -116,7 +116,7 @@ class GameWidget extends StatefulWidget { game.mouseCursor = mouseCursor; } if (initialActiveOverlays != null) { - initialActiveOverlays.forEach(game.overlays.add); + game.overlays.addAll(initialActiveOverlays); } } diff --git a/packages/flame/lib/src/game/mixins/game.dart b/packages/flame/lib/src/game/mixins/game.dart index 7d853ec52dd..1ddc3eecd1a 100644 --- a/packages/flame/lib/src/game/mixins/game.dart +++ b/packages/flame/lib/src/game/mixins/game.dart @@ -325,6 +325,17 @@ class _ActiveOverlays { return setChanged; } + /// Marks [overlayNames] to be rendered. + void addAll(Iterable overlayNames) { + final overlayCountBeforeAdded = _activeOverlays.length; + _activeOverlays.addAll(overlayNames); + + final overlayCountAfterAdded = _activeOverlays.length; + if (overlayCountBeforeAdded != overlayCountAfterAdded) { + _game?._refreshWidget(); + } + } + /// Hides the [overlayName]. bool remove(String overlayName) { final hasRemoved = _activeOverlays.remove(overlayName); @@ -334,6 +345,17 @@ class _ActiveOverlays { return hasRemoved; } + /// Hides multiple overlays specified in [overlayNames]. + void removeAll(Iterable overlayNames) { + final overlayCountBeforeRemoved = _activeOverlays.length; + _activeOverlays.removeAll(overlayNames); + + final overlayCountAfterRemoved = _activeOverlays.length; + if (overlayCountBeforeRemoved != overlayCountAfterRemoved) { + _game?._refreshWidget(); + } + } + /// The names of all currently active overlays. Set get value => _activeOverlays; diff --git a/packages/flame/test/game/active_overlays_test.dart b/packages/flame/test/game/active_overlays_test.dart index 117f3048070..7347b72b921 100644 --- a/packages/flame/test/game/active_overlays_test.dart +++ b/packages/flame/test/game/active_overlays_test.dart @@ -19,6 +19,27 @@ void main() { }); }); + group('addAll', () { + test('can add multiple overlays at once', () { + final overlays = FlameGame().overlays; + overlays.addAll(['test', 'test2']); + expect(overlays.isActive('test'), true); + expect(overlays.isActive('test2'), true); + }); + }); + + group('removeAll', () { + test('can remove multiple overlays at once', () { + final overlays = FlameGame().overlays; + overlays.addAll(['test', 'test2']); + + overlays.removeAll(['test', 'test2']); + + expect(overlays.isActive('test'), false); + expect(overlays.isActive('test2'), false); + }); + }); + group('remove', () { test('can remove an overlay', () { final overlays = FlameGame().overlays;