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

Flutter列表子元素组合问题:生成DataTable的DataRow数据

Flutter嵌套列表全组合生成DataTable的DataRow方案

需求说明

需要将嵌套列表[['Red','White','Yellow'],['40','41','42'],['Small','Big']]生成所有元素的全组合(笛卡尔积),再将每组组合转为包含TextFormField的DataRow,用于DataTable展示。

实现方案

1. 编写笛卡尔积生成函数

先实现一个Dart函数,输入嵌套列表,输出所有元素的全组合:

List<List<String>> generateCartesianProduct(List<List<String>> lists) {
  if (lists.isEmpty) return [[]];
  
  List<List<String>> result = [[]];
  for (var list in lists) {
    List<List<String>> temp = [];
    for (var existing in result) {
      for (var item in list) {
        temp.add([...existing, item]);
      }
    }
    result = temp;
  }
  return result;
}

2. 构建带TextFormField的DataTable

通过StatefulWidget管理输入状态,完整示例代码如下:

import 'package:flutter/material.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('组合数据表格')),
        body: const CombinationDataTable(),
      ),
    );
  }
}

class CombinationDataTable extends StatefulWidget {
  const CombinationDataTable({super.key});

  @override
  State<CombinationDataTable> createState() => _CombinationDataTableState();
}

class _CombinationDataTableState extends State<CombinationDataTable> {
  // 原始嵌套列表
  final List<List<String>> _originalLists = [
    ['Red', 'White', 'Yellow'],
    ['40', '41', '42'],
    ['Small', 'Big']
  ];
  
  // 存储每行输入框的控制器
  late List<List<TextEditingController>> _controllers;

  @override
  void initState() {
    super.initState();
    // 生成全组合并初始化控制器
    var combinations = generateCartesianProduct(_originalLists);
    _controllers = combinations.map((combo) {
      return combo.map((item) => TextEditingController(text: item)).toList();
    }).toList();
  }

  @override
  void dispose() {
    // 释放控制器资源
    for (var rowControllers in _controllers) {
      for (var controller in rowControllers) {
        controller.dispose();
      }
    }
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return SingleChildScrollView(
      padding: const EdgeInsets.all(16),
      child: DataTable(
        columns: const [
          DataColumn(label: Text('颜色')),
          DataColumn(label: Text('尺码')),
          DataColumn(label: Text('大小')),
        ],
        rows: List.generate(_controllers.length, (rowIndex) {
          var rowControllers = _controllers[rowIndex];
          return DataRow(
            cells: [
              DataCell(TextFormField(controller: rowControllers[0])),
              DataCell(TextFormField(controller: rowControllers[1])),
              DataCell(TextFormField(controller: rowControllers[2])),
            ],
          );
        }),
      ),
    );
  }

  // 笛卡尔积生成函数
  List<List<String>> generateCartesianProduct(List<List<String>> lists) {
    if (lists.isEmpty) return [[]];
    
    List<List<String>> result = [[]];
    for (var list in lists) {
      List<List<String>> temp = [];
      for (var existing in result) {
        for (var item in list) {
          temp.add([...existing, item]);
        }
      }
      result = temp;
    }
    return result;
  }
}

关键说明

  • 笛卡尔积函数通过迭代方式生成所有元素组合,确保覆盖所有可能的搭配。
  • 使用TextEditingController管理每个输入框的状态,初始化时自动填入组合的默认值。
  • 用SingleChildScrollView包裹表格,避免屏幕空间不足时出现布局溢出问题。

内容的提问来源于stack exchange,提问作者Ong Kimhong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 22:05:17