Flutter DropdownButton断言错误求助:复制代码运行异常怎么解决
Flutter动态下拉框_AssertionError错误解决方法
错误原因
该断言错误的核心是:DropdownButton的value值未匹配到items列表中的任意一项,或者存在多个相同value的选项。你的代码里存在三个问题:
- 第一个下拉框初始值
dropdownValue1 = 'Dropdown 1',但它的选项列表dropdownItems1是['Item 1', 'Item 2', 'Item 3'],无对应选项 - 第二个下拉框初始值
dropdownValue2 = 'Dropdown 2',同样不在初始选项列表dropdownItems2中 - 切换第一个下拉框选项时,第二个下拉框的选中值未同步更新,可能导致旧value不在新的选项列表里
解决步骤
- 将每个下拉框的初始
value设置为对应items列表的第一项 - 切换第一个下拉框选项时,同步把第二个下拉框的选中值更新为新选项列表的第一项
修正后的完整代码
void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: DynamicDropdown(), ); } } class DynamicDropdown extends StatefulWidget { @override _DynamicDropdownState createState() => _DynamicDropdownState(); } class _DynamicDropdownState extends State<DynamicDropdown> { // 初始值设为对应列表的第一项 String dropdownValue1 = 'Item 1'; String dropdownValue2 = 'Item A'; List<String> dropdownItems1 = ['Item 1', 'Item 2', 'Item 3']; List<String> dropdownItems2 = ['Item A', 'Item B', 'Item C']; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Dynamic Dropdown'), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ DropdownButtonFormField( value: dropdownValue1, onChanged: (newValue) { setState(() { dropdownValue1 = newValue!; if (dropdownValue1 == 'Item 1') { dropdownItems2 = ['Item A', 'Item B', 'Item C']; // 同步更新第二个下拉框的选中值 dropdownValue2 = dropdownItems2.first; } else if (dropdownValue1 == 'Item 2') { dropdownItems2 = ['Item D', 'Item E', 'Item F']; dropdownValue2 = dropdownItems2.first; } else { dropdownItems2 = ['Item G', 'Item H', 'Item I']; dropdownValue2 = dropdownItems2.first; } }); }, items: dropdownItems1.map((String value) { return DropdownMenuItem<String>( value: value, child: Text(value), ); }).toList(), ), const SizedBox(height: 20), DropdownButton<String>( value: dropdownValue2, onChanged: (newValue) { setState(() { dropdownValue2 = newValue!; }); }, items: dropdownItems2.map((String value) { return DropdownMenuItem<String>( value: value, child: Text(value), ); }).toList(), ), ], ), ), ); } }
内容的提问来源于stack exchange,提问作者Meikisihka
相关产品推荐
相关产品推荐

