@@ -348,35 +348,54 @@ class _DropdownMenuState<T> extends State<DropdownMenu<T>> {
348348 final GlobalKey _leadingKey = GlobalKey ();
349349 late List <GlobalKey > buttonItemKeys;
350350 final MenuController _controller = MenuController ();
351- late final TextEditingController _textEditingController;
352351 late bool _enableFilter;
353352 late List <DropdownMenuEntry <T >> filteredEntries;
354353 List <Widget >? _initialMenu;
355354 int ? currentHighlight;
356355 double ? leadingPadding;
357356 bool _menuHasEnabledItem = false ;
357+ TextEditingController ? _localTextEditingController;
358+ TextEditingController get _textEditingController {
359+ return widget.controller ?? (_localTextEditingController ?? = TextEditingController ());
360+ }
358361
359362 @override
360363 void initState () {
361364 super .initState ();
362- _textEditingController = widget.controller ?? TextEditingController ();
363365 _enableFilter = widget.enableFilter;
364366 filteredEntries = widget.dropdownMenuEntries;
365367 buttonItemKeys = List <GlobalKey >.generate (filteredEntries.length, (int index) => GlobalKey ());
366368 _menuHasEnabledItem = filteredEntries.any ((DropdownMenuEntry <T > entry) => entry.enabled);
367369
368370 final int index = filteredEntries.indexWhere ((DropdownMenuEntry <T > entry) => entry.value == widget.initialSelection);
369371 if (index != - 1 ) {
370- _textEditingController.text = filteredEntries[index].label;
371- _textEditingController.selection =
372- TextSelection .collapsed (offset: _textEditingController.text.length);
372+ _textEditingController.value = TextEditingValue (
373+ text: filteredEntries[index].label,
374+ selection: TextSelection .collapsed (offset: filteredEntries[index].label.length),
375+ );
373376 }
374377 refreshLeadingPadding ();
375378 }
376379
380+ @override
381+ void dispose () {
382+ if (_localTextEditingController != null ) {
383+ debugPrint ('Disposing of $_textEditingController ' );
384+ }
385+ _localTextEditingController? .dispose ();
386+ _localTextEditingController = null ;
387+ super .dispose ();
388+ }
389+
377390 @override
378391 void didUpdateWidget (DropdownMenu <T > oldWidget) {
379392 super .didUpdateWidget (oldWidget);
393+ if (oldWidget.controller != widget.controller) {
394+ if (widget.controller != null ) {
395+ _localTextEditingController? .dispose ();
396+ _localTextEditingController = null ;
397+ }
398+ }
380399 if (oldWidget.enableSearch != widget.enableSearch) {
381400 if (! widget.enableSearch) {
382401 currentHighlight = null ;
@@ -394,9 +413,10 @@ class _DropdownMenuState<T> extends State<DropdownMenu<T>> {
394413 if (oldWidget.initialSelection != widget.initialSelection) {
395414 final int index = filteredEntries.indexWhere ((DropdownMenuEntry <T > entry) => entry.value == widget.initialSelection);
396415 if (index != - 1 ) {
397- _textEditingController.text = filteredEntries[index].label;
398- _textEditingController.selection =
399- TextSelection .collapsed (offset: _textEditingController.text.length);
416+ _textEditingController.value = TextEditingValue (
417+ text: filteredEntries[index].label,
418+ selection: TextSelection .collapsed (offset: filteredEntries[index].label.length),
419+ );
400420 }
401421 }
402422 }
@@ -463,7 +483,6 @@ class _DropdownMenuState<T> extends State<DropdownMenu<T>> {
463483
464484 List <Widget > _buildButtons (
465485 List <DropdownMenuEntry <T >> filteredEntries,
466- TextEditingController textEditingController,
467486 TextDirection textDirection,
468487 { int ? focusedIndex, bool enableScrollToHighlight = true }
469488 ) {
@@ -519,9 +538,10 @@ class _DropdownMenuState<T> extends State<DropdownMenu<T>> {
519538 trailingIcon: entry.trailingIcon,
520539 onPressed: entry.enabled
521540 ? () {
522- textEditingController.text = entry.label;
523- textEditingController.selection =
524- TextSelection .collapsed (offset: textEditingController.text.length);
541+ _textEditingController.value = TextEditingValue (
542+ text: entry.label,
543+ selection: TextSelection .collapsed (offset: entry.label.length),
544+ );
525545 currentHighlight = widget.enableSearch ? i : null ;
526546 widget.onSelected? .call (entry.value);
527547 }
@@ -535,37 +555,43 @@ class _DropdownMenuState<T> extends State<DropdownMenu<T>> {
535555 return result;
536556 }
537557
538- void handleUpKeyInvoke (_) => setState (() {
539- if (! _menuHasEnabledItem || ! _controller.isOpen) {
540- return ;
541- }
542- _enableFilter = false ;
543- currentHighlight ?? = 0 ;
544- currentHighlight = (currentHighlight! - 1 ) % filteredEntries.length;
545- while (! filteredEntries[currentHighlight! ].enabled) {
558+ void handleUpKeyInvoke (_) {
559+ setState (() {
560+ if (! _menuHasEnabledItem || ! _controller.isOpen) {
561+ return ;
562+ }
563+ _enableFilter = false ;
564+ currentHighlight ?? = 0 ;
546565 currentHighlight = (currentHighlight! - 1 ) % filteredEntries.length;
547- }
548- final String currentLabel = filteredEntries[currentHighlight! ].label;
549- _textEditingController.text = currentLabel;
550- _textEditingController.selection =
551- TextSelection .collapsed (offset: _textEditingController.text.length);
552- });
566+ while (! filteredEntries[currentHighlight! ].enabled) {
567+ currentHighlight = (currentHighlight! - 1 ) % filteredEntries.length;
568+ }
569+ final String currentLabel = filteredEntries[currentHighlight! ].label;
570+ _textEditingController.value = TextEditingValue (
571+ text: currentLabel,
572+ selection: TextSelection .collapsed (offset: currentLabel.length),
573+ );
574+ });
575+ }
553576
554- void handleDownKeyInvoke (_) => setState (() {
555- if (! _menuHasEnabledItem || ! _controller.isOpen) {
556- return ;
557- }
558- _enableFilter = false ;
559- currentHighlight ?? = - 1 ;
560- currentHighlight = (currentHighlight! + 1 ) % filteredEntries.length;
561- while (! filteredEntries[currentHighlight! ].enabled) {
577+ void handleDownKeyInvoke (_) {
578+ setState (() {
579+ if (! _menuHasEnabledItem || ! _controller.isOpen) {
580+ return ;
581+ }
582+ _enableFilter = false ;
583+ currentHighlight ?? = - 1 ;
562584 currentHighlight = (currentHighlight! + 1 ) % filteredEntries.length;
563- }
564- final String currentLabel = filteredEntries[currentHighlight! ].label;
565- _textEditingController.text = currentLabel;
566- _textEditingController.selection =
567- TextSelection .collapsed (offset: _textEditingController.text.length);
568- });
585+ while (! filteredEntries[currentHighlight! ].enabled) {
586+ currentHighlight = (currentHighlight! + 1 ) % filteredEntries.length;
587+ }
588+ final String currentLabel = filteredEntries[currentHighlight! ].label;
589+ _textEditingController.value = TextEditingValue (
590+ text: currentLabel,
591+ selection: TextSelection .collapsed (offset: currentLabel.length),
592+ );
593+ });
594+ }
569595
570596 void handlePressed (MenuController controller) {
571597 if (controller.isOpen) {
@@ -580,18 +606,10 @@ class _DropdownMenuState<T> extends State<DropdownMenu<T>> {
580606 setState (() {});
581607 }
582608
583- @override
584- void dispose () {
585- if (widget.controller == null ) {
586- _textEditingController.dispose ();
587- }
588- super .dispose ();
589- }
590-
591609 @override
592610 Widget build (BuildContext context) {
593611 final TextDirection textDirection = Directionality .of (context);
594- _initialMenu ?? = _buildButtons (widget.dropdownMenuEntries, _textEditingController, textDirection, enableScrollToHighlight: false );
612+ _initialMenu ?? = _buildButtons (widget.dropdownMenuEntries, textDirection, enableScrollToHighlight: false );
595613 final DropdownMenuThemeData theme = DropdownMenuTheme .of (context);
596614 final DropdownMenuThemeData defaults = _DropdownMenuDefaultsM3 (context);
597615
@@ -610,7 +628,7 @@ class _DropdownMenuState<T> extends State<DropdownMenu<T>> {
610628 }
611629 }
612630
613- final List <Widget > menu = _buildButtons (filteredEntries, _textEditingController, textDirection, focusedIndex: currentHighlight);
631+ final List <Widget > menu = _buildButtons (filteredEntries, textDirection, focusedIndex: currentHighlight);
614632
615633 final TextStyle ? effectiveTextStyle = widget.textStyle ?? theme.textStyle ?? defaults.textStyle;
616634
@@ -670,9 +688,10 @@ class _DropdownMenuState<T> extends State<DropdownMenu<T>> {
670688 if (currentHighlight != null ) {
671689 final DropdownMenuEntry <T > entry = filteredEntries[currentHighlight! ];
672690 if (entry.enabled) {
673- _textEditingController.text = entry.label;
674- _textEditingController.selection =
675- TextSelection .collapsed (offset: _textEditingController.text.length);
691+ _textEditingController.value = TextEditingValue (
692+ text: entry.label,
693+ selection: TextSelection .collapsed (offset: entry.label.length),
694+ );
676695 widget.onSelected? .call (entry.value);
677696 }
678697 } else {
0 commit comments