Flutter ListView.builder中能否调用列表项绑定的专属自定义函数
问题解答
你想要的调用效果是可以实现的,但你写的原始写法会因为Dart的类型校验问题编译报错,需要做调整。
方案1:直接调整现有写法适配类型要求
你定义的_shortcuts是泛型为dynamic的列表,内部Map的value也是dynamic类型,Dart无法自动识别_shortcuts[i]['func']是可调用的函数,需要手动做类型强转:
// 强转为接受String参数的函数类型后再调用 (_shortcuts[i]['func'] as void Function(String))('wow');
这种写法可以正常运行,但有隐患:如果后续你往列表里加的项的func参数类型、返回值不匹配,只有运行时才会抛出异常,编译期发现不了问题。
方案2:更推荐的类型安全实现(Flutter开发标准写法)
不要用Map存储异构的功能项数据,自定义数据类封装所有属性,既可以避免强转代码,也能在编译期就拦截所有类型错误:
首先定义数据类:
class ShortcutItem { final String name; final IconData icon; bool selection; final void Function(String) func; ShortcutItem({ required this.name, required this.icon, required this.selection, required this.func, }); }
改写你的列表定义:
List<ShortcutItem> _shortcuts = [ ShortcutItem( name: 'HORN', icon: Icons.circle_outlined, selection: false, func: (String dummy) { print('I did it!' + dummy); }, ), ];
之后在ListView.builder里可以直接调用,无需任何类型转换:
ListView.builder( itemCount: _shortcuts.length, itemBuilder: (context, index) { final item = _shortcuts[index]; return ListTile( leading: Icon(item.icon), title: Text(item.name), selected: item.selection, // 点击时触发对应函数 onTap: () => item.func('wow'), ); } )
注意:不要直接在
itemBuilder方法体内直接执行函数,否则页面渲染的时候就会自动触发所有函数,要把函数调用放在onTap这类交互回调里。
内容的提问来源于stack exchange,提问作者Máté Antal
相关产品推荐
相关产品推荐

