Flutter:DropdownButton选项存变量引发onChanged参数类型不匹配报错
我来帮你拆解这个报错的原因和解决办法:
为什么会出现这个错误?
你遇到的类型不匹配问题,核心原因是**dropdownList的泛型类型声明不完整**。
在你的错误代码里,你把dropdownList声明成了:
List<DropdownMenuItem> dropdownList = [/*...*/].map<DropdownMenuItem<String>>((String value) { /*...*/ }).toList();
这里只写了List<DropdownMenuItem>,没有指定泛型参数<String>,Dart会自动把它推断为List<DropdownMenuItem<dynamic>>(也就是动态类型)。
当DropdownButton的items是dynamic类型时,它的onChanged回调的参数类型也会被推断为dynamic,但你写的回调是(String newValue),这就导致了类型不兼容——void Function(String)无法赋值给void Function(dynamic),所以编译器报错。
而你第一个能运行的代码里,items是直接在DropdownButton内部生成的,map方法明确指定了<DropdownMenuItem<String>>,Dart能正确推断出DropdownButton的泛型是<String>,所以onChanged的参数类型自然匹配String。
怎么修复?
只需要给dropdownList加上完整的泛型声明,同时建议给DropdownButton也明确指定泛型,让类型更清晰:
修改后的代码如下:
static String defaultDropDownValue = 'Select your Network'; String dropdownValue = defaultDropDownValue; // 这里加上<String>,明确泛型类型 List<DropdownMenuItem<String>> dropdownList = [defaultDropDownValue, 'one', 'two'] .map<DropdownMenuItem<String>>((String value) { return DropdownMenuItem<String>( value: value, child: Text(value), ); }).toList(); // ... new Flexible( child: DropdownButton<String>( // 明确指定DropdownButton的泛型为String isExpanded: true, value: dropdownValue, onChanged: (String newValue) { setState(() { dropdownValue = newValue; }); _checkSsid(); }, items: dropdownList, ), ),
这样修改后,Dart能明确知道dropdownList里的每个DropdownMenuItem的值类型是String,DropdownButton的泛型也对应String,onChanged的参数类型String就完全匹配了,报错也就消失了。
内容的提问来源于stack exchange,提问作者Eric

