如何用typedef解决Dart分析器的'dynamic'目标调用警告?
解决Dart中调用动态action的类型分析提示问题
你在Dart中定义了如下变量:
dropDownAddList.addAll( [ {'name': 'Import config from QRcode', 'action': scanQrCode}, {'name': 'Import config from Clipboard', 'action': importFromClipboard}, ], );
调用action时使用了这段代码:
onTap: () { dropDownAddList[index]['action'](); },
此时Dart分析器抛出提示:
Method invocation or property access on a 'dynamic' target.
相关方法定义:
Future<void> scanQrCode()async{ /// } Future<void> importFromClipboard()async{ /// }
可以用typedef解决,具体实现步骤如下:
- 定义匹配方法签名的typedef
你的方法都是无参数、返回Future<void>的函数,对应的typedef可以这样写:
typedef ConfigAction = Future<void> Function();
- 用强类型类替代Map封装数据
直接使用Map会导致类型信息丢失,创建一个类来封装name和action,能获得完整的类型检查:
class DropDownItem { final String name; final ConfigAction action; DropDownItem({required this.name, required this.action}); }
- 重构dropDownAddList的初始化逻辑
把原有的Map列表替换为DropDownItem实例列表,同时指定dropDownAddList的类型为List<DropDownItem>:
final List<DropDownItem> dropDownAddList = []; dropDownAddList.addAll( [ DropDownItem(name: 'Import config from QRcode', action: scanQrCode), DropDownItem(name: 'Import config from Clipboard', action: importFromClipboard), ], );
- 修改调用action的代码
现在调用时Dart能明确识别action的类型,不会再出现动态类型提示:
onTap: () { dropDownAddList[index].action(); },
解决原理
原来使用Map时,dropDownAddList[index]['action']的类型是dynamic,Dart无法确认它是可调用的函数,因此抛出提示。通过typedef定义明确的函数类型,再配合自定义类封装数据,能让Dart分析器识别action的具体类型,既消除了提示,也获得了编译时的类型安全保障。
内容的提问来源于stack exchange,提问作者DolDurma
相关产品推荐
相关产品推荐

