Skip to content

Commit 4c8d498

Browse files
committed
feat(app_configuration): implement exclusive expansion for top-level tiles
- Add ExpansionTileController for each top-level ExpansionTile - Implement logic to collapse other main tiles when one expands - Wrap Maintenance and Force Update sections in ExpansionTiles - Update initialization and disposal of ExpansionTileControllers
1 parent f9f6aa5 commit 4c8d498

File tree

1 file changed

+89
-2
lines changed

1 file changed

+89
-2
lines changed

lib/app_configuration/view/app_configuration_page.dart

Lines changed: 89 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,26 @@ class AppConfigurationPage extends StatefulWidget {
2626
class _AppConfigurationPageState extends State<AppConfigurationPage>
2727
with SingleTickerProviderStateMixin {
2828
late TabController _tabController;
29+
// Controllers for the top-level ExpansionTiles to manage their expanded state.
30+
late List<ExpansionTileController> _mainTileControllers;
2931

3032
@override
3133
void initState() {
3234
super.initState();
3335
_tabController = TabController(length: 3, vsync: this);
36+
// Initialize a controller for each of the 5 top-level ExpansionTiles.
37+
_mainTileControllers =
38+
List.generate(5, (index) => ExpansionTileController());
3439
context.read<AppConfigurationBloc>().add(const AppConfigurationLoaded());
3540
}
3641

3742
@override
3843
void dispose() {
3944
_tabController.dispose();
45+
// Dispose of all ExpansionTileControllers to prevent memory leaks.
46+
for (final controller in _mainTileControllers) {
47+
controller.dispose();
48+
}
4049
super.dispose();
4150
}
4251

@@ -147,8 +156,20 @@ class _AppConfigurationPageState extends State<AppConfigurationPage>
147156
ListView(
148157
padding: const EdgeInsets.all(AppSpacing.lg),
149158
children: [
159+
// Top-level ExpansionTile for User Content Limits
150160
ExpansionTile(
161+
controller: _mainTileControllers[0],
151162
title: Text(l10n.userContentLimitsTitle),
163+
onExpansionChanged: (isExpanded) {
164+
if (isExpanded) {
165+
// Collapse other main tiles when this one expands
166+
for (var i = 0; i < _mainTileControllers.length; i++) {
167+
if (i != 0) {
168+
_mainTileControllers[i].collapse();
169+
}
170+
}
171+
}
172+
},
152173
childrenPadding: const EdgeInsets.symmetric(
153174
horizontal: AppSpacing.xxl,
154175
),
@@ -159,8 +180,20 @@ class _AppConfigurationPageState extends State<AppConfigurationPage>
159180
),
160181
],
161182
),
183+
// Top-level ExpansionTile for Feed Decorators
162184
ExpansionTile(
185+
controller: _mainTileControllers[1],
163186
title: Text(l10n.feedDecoratorsTitle),
187+
onExpansionChanged: (isExpanded) {
188+
if (isExpanded) {
189+
// Collapse other main tiles when this one expands
190+
for (var i = 0; i < _mainTileControllers.length; i++) {
191+
if (i != 1) {
192+
_mainTileControllers[i].collapse();
193+
}
194+
}
195+
}
196+
},
164197
childrenPadding: const EdgeInsets.symmetric(
165198
horizontal: AppSpacing.xxl,
166199
),
@@ -173,8 +206,20 @@ class _AppConfigurationPageState extends State<AppConfigurationPage>
173206
ListView(
174207
padding: const EdgeInsets.all(AppSpacing.lg),
175208
children: [
209+
// Top-level ExpansionTile for Ad Settings
176210
ExpansionTile(
211+
controller: _mainTileControllers[2],
177212
title: Text(l10n.adSettingsTitle),
213+
onExpansionChanged: (isExpanded) {
214+
if (isExpanded) {
215+
// Collapse other main tiles when this one expands
216+
for (var i = 0; i < _mainTileControllers.length; i++) {
217+
if (i != 2) {
218+
_mainTileControllers[i].collapse();
219+
}
220+
}
221+
}
222+
},
178223
childrenPadding: const EdgeInsets.symmetric(
179224
horizontal: AppSpacing.xxl,
180225
),
@@ -185,9 +230,51 @@ class _AppConfigurationPageState extends State<AppConfigurationPage>
185230
ListView(
186231
padding: const EdgeInsets.all(AppSpacing.lg),
187232
children: [
188-
_buildMaintenanceSection(context, remoteConfig),
233+
// Top-level ExpansionTile for Maintenance Section
234+
ExpansionTile(
235+
controller: _mainTileControllers[3],
236+
title: Text(l10n.maintenanceModeTitle),
237+
onExpansionChanged: (isExpanded) {
238+
if (isExpanded) {
239+
// Collapse other main tiles when this one expands
240+
for (var i = 0; i < _mainTileControllers.length; i++) {
241+
if (i != 3) {
242+
_mainTileControllers[i].collapse();
243+
}
244+
}
245+
}
246+
},
247+
childrenPadding: const EdgeInsets.symmetric(
248+
horizontal: AppSpacing.xxl,
249+
vertical: AppSpacing.md,
250+
),
251+
children: [
252+
_buildMaintenanceSection(context, remoteConfig),
253+
],
254+
),
189255
const SizedBox(height: AppSpacing.lg),
190-
_buildForceUpdateSection(context, remoteConfig),
256+
// Top-level ExpansionTile for Force Update Section
257+
ExpansionTile(
258+
controller: _mainTileControllers[4],
259+
title: Text(l10n.forceUpdateTitle),
260+
onExpansionChanged: (isExpanded) {
261+
if (isExpanded) {
262+
// Collapse other main tiles when this one expands
263+
for (var i = 0; i < _mainTileControllers.length; i++) {
264+
if (i != 4) {
265+
_mainTileControllers[i].collapse();
266+
}
267+
}
268+
}
269+
},
270+
childrenPadding: const EdgeInsets.symmetric(
271+
horizontal: AppSpacing.xxl,
272+
vertical: AppSpacing.md,
273+
),
274+
children: [
275+
_buildForceUpdateSection(context, remoteConfig),
276+
],
277+
),
191278
],
192279
),
193280
],

0 commit comments

Comments
 (0)