@@ -236,12 +236,32 @@ class SegmentedButton<T> extends StatefulWidget {
236
236
final Widget ? selectedIcon;
237
237
238
238
@override
239
- State <SegmentedButton <T >> createState () => _SegmentedButtonState <T >();
239
+ State <SegmentedButton <T >> createState () => SegmentedButtonState <T >();
240
240
}
241
241
242
- class _SegmentedButtonState <T > extends State <SegmentedButton <T >> {
242
+ /// State for [SegmentedButton] .
243
+ @visibleForTesting
244
+ class SegmentedButtonState <T > extends State <SegmentedButton <T >> {
243
245
bool get _enabled => widget.onSelectionChanged != null ;
244
- final Map <ButtonSegment <T >, MaterialStatesController > _statesControllers = < ButtonSegment <T >, MaterialStatesController > {};
246
+
247
+ /// Controllers for the [ButtonSegment] s.
248
+ @visibleForTesting
249
+ final Map <ButtonSegment <T >, MaterialStatesController > statesControllers = < ButtonSegment <T >, MaterialStatesController > {};
250
+
251
+ @override
252
+ void didUpdateWidget (covariant SegmentedButton <T > oldWidget) {
253
+ super .didUpdateWidget (oldWidget);
254
+ if (oldWidget != widget) {
255
+ statesControllers.removeWhere ((ButtonSegment <T > segment, MaterialStatesController controller) {
256
+ if (widget.segments.contains (segment)) {
257
+ return false ;
258
+ } else {
259
+ controller.dispose ();
260
+ return true ;
261
+ }
262
+ });
263
+ }
264
+ }
245
265
246
266
void _handleOnPressed (T segmentValue) {
247
267
if (! _enabled) {
@@ -325,7 +345,7 @@ class _SegmentedButtonState<T> extends State<SegmentedButton<T>> {
325
345
: segment.label != null
326
346
? segment.icon
327
347
: null ;
328
- final MaterialStatesController controller = _statesControllers .putIfAbsent (segment, () => MaterialStatesController ());
348
+ final MaterialStatesController controller = statesControllers .putIfAbsent (segment, () => MaterialStatesController ());
329
349
controller.value = < MaterialState > {
330
350
if (segmentSelected) MaterialState .selected,
331
351
};
@@ -391,7 +411,7 @@ class _SegmentedButtonState<T> extends State<SegmentedButton<T>> {
391
411
392
412
@override
393
413
void dispose () {
394
- for (final MaterialStatesController controller in _statesControllers .values) {
414
+ for (final MaterialStatesController controller in statesControllers .values) {
395
415
controller.dispose ();
396
416
}
397
417
super .dispose ();
0 commit comments