Flutter空安全报错:'() => Null'非'orElse'所需'(() => Map<String, dynamic>)?'子类型如何解决
Flutter空安全报错解决方案
报错信息
type '() => Null' is not a subtype of type '(() => Map<String, dynamic>)?' of 'orElse'
含义:类型() => Null不是参数orElse所预期的(() => Map<String, dynamic>?类型的子类型
问题原因
报错是由于你使用的MultiSelectFormField第三方组件内部空安全类型适配不到位,或者你传入的dataSource存在空值风险,触发组件内部orElse逻辑时,返回的空函数不符合类型要求导致的。
解决方法
- 优先优化
dataSource的传值逻辑,不要直接用!强制解包,提前做判空处理,保证传入的数组永远不为空,避免触发组件的orElse逻辑:
- 优先优化
// 把原来的dataSource替换为这段代码即可 dataSource: snapshot.data?.listactiviticheckpoints?.map((value){ return {'display': '$value','value': value}; }).toList() ?? [],
- 如果修改数据源后仍报错,需要修改
MultiSelectFormField组件内部的代码,找到调用orElse的位置,把原来返回null的函数:
- 如果修改数据源后仍报错,需要修改
orElse: () => null
修改为返回空Map的函数即可:
orElse: () => <String, dynamic>{}
- 你也可以直接升级适配了空安全版本的
MultiSelectFormField组件,官方新版本已经修复了这个类型不兼容问题。
- 你也可以直接升级适配了空安全版本的
修改后的完整代码示例
FutureBuilder<ActivityCheckPoints>( future: apiGetCheckPointsName(), builder: (context, snapshot) { if(snapshot.hasData) return Container( child: MultiSelectFormField( chipBackGroundColor: Colors.blue, chipLabelStyle: TextStyle(fontWeight: FontWeight.bold), dialogTextStyle: TextStyle(fontWeight: FontWeight.bold), checkBoxActiveColor: Colors.blue, checkBoxCheckColor: Colors.white, dialogShapeBorder: RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(12.0))), title: Text(_actpoints, style: TextStyle(fontSize: 16), ), // 只修改了这一行的dataSource逻辑 dataSource: snapshot.data?.listactiviticheckpoints?.map((value){ return {'display': '$value','value': value}; }).toList() ?? [], textField: 'display', valueField: 'value', okButtonLabel: 'OK', cancelButtonLabel: 'CANCEL', hintWidget: Text(_actpointsdisplay, ), initialValue: _listActivityPointNames, onSaved: (value) { if (value == null) return; setState(() { _listActivityPointNames = value; }); }, ), ); return Container(); } ),
内容的提问来源于stack exchange,提问作者Mihir Panchal
相关产品推荐
相关产品推荐

