From 47ac2c2cfc2b7013ef2d91cb6cb233ff654a8e54 Mon Sep 17 00:00:00 2001 From: Benjamin Schoenberger <25782944+Reprevise@users.noreply.github.com> Date: Tue, 4 Nov 2025 18:18:32 -0500 Subject: [PATCH] fix(useExpansibleController): add dispose --- .../lib/src/expansion_tile_controller.dart | 10 +++++-- .../test/use_expansible_controller_test.dart | 28 +++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/packages/flutter_hooks/lib/src/expansion_tile_controller.dart b/packages/flutter_hooks/lib/src/expansion_tile_controller.dart index 665aef4..cb03689 100644 --- a/packages/flutter_hooks/lib/src/expansion_tile_controller.dart +++ b/packages/flutter_hooks/lib/src/expansion_tile_controller.dart @@ -27,11 +27,17 @@ class _ExpansibleControllerHook extends Hook { class _ExpansibleControllerHookState extends HookState { - final controller = ExpansibleController(); + final _controller = ExpansibleController(); @override String get debugLabel => 'useExpansibleController'; @override - ExpansibleController build(BuildContext context) => controller; + ExpansibleController build(BuildContext context) => _controller; + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } } diff --git a/packages/flutter_hooks/test/use_expansible_controller_test.dart b/packages/flutter_hooks/test/use_expansible_controller_test.dart index 76d2207..b0bbeeb 100644 --- a/packages/flutter_hooks/test/use_expansible_controller_test.dart +++ b/packages/flutter_hooks/test/use_expansible_controller_test.dart @@ -78,5 +78,33 @@ void main() { controller.collapse(); expect(controller.isExpanded, false); }); + + testWidgets('check ExpansibleController gets disposed', (tester) async { + late ExpansibleController controller; + await tester.pumpWidget(MaterialApp( + home: Scaffold( + body: HookBuilder(builder: (context) { + controller = useExpansibleController(); + return ExpansionTile( + controller: controller, + title: const Text('Expansion Tile'), + ); + }), + ), + )); + + await tester.pumpWidget(const SizedBox()); + + expect( + () => controller.addListener(() {}), + throwsA( + isFlutterError.having( + (e) => e.message, + 'message', + contains('disposed'), + ), + ), + ); + }); }); }