Flutter中DropdownButtonFormField提示无法推断泛型参数'T'如何解决
解决方案
这个提示是Dart泛型类型推断冲突导致的,DropdownButtonFormField是泛型组件,需要绑定统一的类型参数,你未显式指定的情况下,编译器从value(String类型)推断类型为String,又从无类型的onChanged参数、items的dynamic泛型推断为dynamic,两边冲突就抛出了该提示。
修改步骤
- 给
DropdownButtonFormField显式指定泛型类型<String>,匹配所有选项值都是字符串的场景 - 给
onChanged回调的参数明确类型为String? - 把
items的泛型声明从<DropdownMenuItem<dynamic>>调整为<DropdownMenuItem<String>> - 可选优化:给自定义
menuItem方法明确返回值类型为DropdownMenuItem<String>
修改后代码
DropdownButtonFormField 部分
SizedBox( width: deviceWidth * .9, height: deviceHeight * 0.15, child: DropdownButtonFormField<String>( value: _dropDownValue, dropdownColor: Colors.blueAccent, iconSize: deviceWidth * .05, icon: Icon( Icons.arrow_drop_down_circle, color: Colors.white, ), style: TextStyle( color: Colors.black, fontFamily: 'Constantia', fontSize: 18.0, ), autovalidateMode: AutovalidateMode.always, decoration: InputDecoration( enabled: true, border: OutlineInputBorder( borderSide: BorderSide( color: Colors.red, width: 2, style: BorderStyle.solid, ), ), ), onChanged: (String? value) { setState(() { _dropDownValue = value.toString(); print(_dropDownValue); }); }, items: <DropdownMenuItem<String>>[ menuItem('none'), menuItem('10'), menuItem('20'), menuItem('30'), menuItem('40'), menuItem('50'), menuItem('60'), menuItem('70'), menuItem('80'), menuItem('90'), menuItem('100'), ], ), ),
自定义menuItem部分
DropdownMenuItem<String> menuItem(String val) { final deviceWidth = MediaQuery.of(context).size.width; return DropdownMenuItem<String>( value: val, child: Container( width: deviceWidth * 0.6, child: Text( val, style: TextStyle( fontFamily: 'Constantia', fontSize: 18.0, color: Colors.white, ), ), ), ); }
修改完成后编译器泛型推断完全匹配,提示会直接消失,原有功能不受任何影响。
内容的提问来源于stack exchange,提问作者Pranav Harer
相关产品推荐
相关产品推荐

