diff --git a/packages/flutter/lib/src/material/dropdown.dart b/packages/flutter/lib/src/material/dropdown.dart index 8ae13dd0ea..c4f27e1d8e 100644 --- a/packages/flutter/lib/src/material/dropdown.dart +++ b/packages/flutter/lib/src/material/dropdown.dart @@ -1200,7 +1200,12 @@ class _DropdownButtonState extends State> with WidgetsBindi } void _updateSelectedIndex() { - if (widget.value == null || widget.items == null || widget.items!.isEmpty) { + if (widget.items == null + || widget.items!.isEmpty + || (widget.value == null && + widget.items! + .where((DropdownMenuItem item) => item.value == widget.value) + .isEmpty)) { _selectedIndex = null; return; } diff --git a/packages/flutter/test/material/dropdown_test.dart b/packages/flutter/test/material/dropdown_test.dart index 0fabd8ccb8..b4fe8f72fa 100644 --- a/packages/flutter/test/material/dropdown_test.dart +++ b/packages/flutter/test/material/dropdown_test.dart @@ -2492,7 +2492,50 @@ void main() { expect(value, equals('two')); }); - testWidgets('DropdownButton is activated with the space key', (WidgetTester tester) async { + // Regression test for https://github.com/flutter/flutter/issues/77655. + testWidgets('DropdownButton selecting a null valued item should be selected', + (WidgetTester tester) async { + final List> items = >[ + const MapEntry(null, 'None'), + const MapEntry('one', 'One'), + const MapEntry('two', 'Two'), + ]; + String? selectedItem = 'one'; + + await tester.pumpWidget( + StatefulBuilder( + builder: (BuildContext context, StateSetter setState) { + return MaterialApp( + home: Scaffold( + body: DropdownButton( + value: selectedItem, + onChanged: (String? string) { + setState(() { + selectedItem = string; + }); + }, + items: items.map((MapEntry item) { + return DropdownMenuItem( + child: Text(item.value), + value: item.key, + ); + }).toList(), + ), + ), + ); + }, + ), + ); + + await tester.tap(find.text('One')); + await tester.pumpAndSettle(); + await tester.tap(find.text('None').last); + await tester.pumpAndSettle(); + expect(find.text('None'), findsOneWidget); + }); + + testWidgets('DropdownButton is activated with the space key', + (WidgetTester tester) async { final FocusNode focusNode = FocusNode(debugLabel: 'DropdownButton'); String? value = 'one';