You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 03:24:03