@@ -26,17 +26,26 @@ class AppConfigurationPage extends StatefulWidget {
26
26
class _AppConfigurationPageState extends State <AppConfigurationPage >
27
27
with SingleTickerProviderStateMixin {
28
28
late TabController _tabController;
29
+ // Controllers for the top-level ExpansionTiles to manage their expanded state.
30
+ late List <ExpansionTileController > _mainTileControllers;
29
31
30
32
@override
31
33
void initState () {
32
34
super .initState ();
33
35
_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 ());
34
39
context.read <AppConfigurationBloc >().add (const AppConfigurationLoaded ());
35
40
}
36
41
37
42
@override
38
43
void dispose () {
39
44
_tabController.dispose ();
45
+ // Dispose of all ExpansionTileControllers to prevent memory leaks.
46
+ for (final controller in _mainTileControllers) {
47
+ controller.dispose ();
48
+ }
40
49
super .dispose ();
41
50
}
42
51
@@ -147,8 +156,20 @@ class _AppConfigurationPageState extends State<AppConfigurationPage>
147
156
ListView (
148
157
padding: const EdgeInsets .all (AppSpacing .lg),
149
158
children: [
159
+ // Top-level ExpansionTile for User Content Limits
150
160
ExpansionTile (
161
+ controller: _mainTileControllers[0 ],
151
162
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
+ },
152
173
childrenPadding: const EdgeInsets .symmetric (
153
174
horizontal: AppSpacing .xxl,
154
175
),
@@ -159,8 +180,20 @@ class _AppConfigurationPageState extends State<AppConfigurationPage>
159
180
),
160
181
],
161
182
),
183
+ // Top-level ExpansionTile for Feed Decorators
162
184
ExpansionTile (
185
+ controller: _mainTileControllers[1 ],
163
186
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
+ },
164
197
childrenPadding: const EdgeInsets .symmetric (
165
198
horizontal: AppSpacing .xxl,
166
199
),
@@ -173,8 +206,20 @@ class _AppConfigurationPageState extends State<AppConfigurationPage>
173
206
ListView (
174
207
padding: const EdgeInsets .all (AppSpacing .lg),
175
208
children: [
209
+ // Top-level ExpansionTile for Ad Settings
176
210
ExpansionTile (
211
+ controller: _mainTileControllers[2 ],
177
212
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
+ },
178
223
childrenPadding: const EdgeInsets .symmetric (
179
224
horizontal: AppSpacing .xxl,
180
225
),
@@ -185,9 +230,51 @@ class _AppConfigurationPageState extends State<AppConfigurationPage>
185
230
ListView (
186
231
padding: const EdgeInsets .all (AppSpacing .lg),
187
232
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
+ ),
189
255
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
+ ),
191
278
],
192
279
),
193
280
],
0 commit comments