Flutter中如何实现可返回动态Widget的回调方法
实现支持返回动态Widget的回调方案
核心调整逻辑:把原来强制返回Text组件的逻辑,改成支持字段名、返回字符串的函数、返回Widget的函数三种入参,兼顾原有使用习惯的同时扩展动态Widget能力。
修改后的代码如下:
Widget buildArrayItemContentFromList( BuildContext ctx, Map<String, dynamic> data, int index) { return Row( children: (this.itemBuilder as List).map<Widget>((field) { // 传入的是返回Widget的回调,直接返回回调执行结果 if (field is Widget Function(Map<String, dynamic>, int)) { return field(data, index); } // 传入的是返回字符串的回调,包装成Text返回(兼容旧逻辑) if (field is String Function(Map<String, dynamic>)) { return Text( field(data), style: const TextStyle(fontSize: 14), ); } // 传入的是字段名字符串,取值后包装成Text返回(兼容旧逻辑) if (field is String) { String value = data.containsKey(field) ? data[field].toString() : ''; return Text( value, style: const TextStyle(fontSize: 14), ); } // 异常情况返回空占位组件 return const SizedBox.shrink(); }).toList(), mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.spaceBetween, ); }
使用示例:
- 原有字段名用法保持不变:
itemBuilder: ['name', 'age', 'address'] - 原有返回字符串的函数用法保持不变:
itemBuilder: [ 'name', (data) => '年龄:${data['age']}', ] - 新增动态Widget用法,可返回任意自定义组件:
itemBuilder: [ 'name', // 自定义头像组件 (Map<String, dynamic> data, int index) => CircleAvatar( backgroundImage: NetworkImage(data['avatar_url']), ), // 自定义操作按钮组件 (Map<String, dynamic> data, int index) => ElevatedButton( onPressed: () => print('点击了第$index项的查看按钮'), child: const Text('查看详情'), ) ]
内容的提问来源于stack exchange,提问作者Faisal Bin Mohammad Ali
相关产品推荐
相关产品推荐

