diff --git a/lib/flame/component_controller.dart b/lib/flame/component_controller.dart new file mode 100644 index 00000000..c52e46bf --- /dev/null +++ b/lib/flame/component_controller.dart @@ -0,0 +1,31 @@ +import 'package:flame/components.dart'; +import 'package:flame_bloc/flame_bloc.dart'; + +/// {@template component_controller} +/// A [ComponentController] is a [Component] in charge of handling the logic +/// associated with another [Component]. +/// +/// [ComponentController]s usually implement [BlocComponent]. +/// {@endtemplate} +abstract class ComponentController extends Component { + /// {@macro component_controller} + ComponentController(this.component); + + /// The [Component] controlled by this [ComponentController]. + final T component; + + /// Ads the [ComponentController] to its [component]. + Future attach() async { + await component.add(this); + } + + @override + Future onLoad() async { + await super.onLoad(); + assert( + parent! == component, + 'ComponentController should be child of $component. ' + 'Use attach() instead.', + ); + } +}