8 changed files with 441 additions and 18 deletions
@ -0,0 +1,93 @@ |
|||||||
|
import 'package:flutter/material.dart'; |
||||||
|
import 'package:syncfusion_flutter_datagrid/datagrid.dart'; |
||||||
|
import 'package:win_text_editor/modules/data_compare/controllers/data_compare_controller.dart'; |
||||||
|
|
||||||
|
class DataCompareGrid extends StatelessWidget { |
||||||
|
final DataCompareController controller; |
||||||
|
|
||||||
|
const DataCompareGrid({super.key, required this.controller}); |
||||||
|
|
||||||
|
@override |
||||||
|
Widget build(BuildContext context) { |
||||||
|
return Card( |
||||||
|
shape: RoundedRectangleBorder( |
||||||
|
borderRadius: BorderRadius.circular(2.0), // 这里可以根据需求调整圆角的大小 |
||||||
|
), |
||||||
|
child: SfDataGrid( |
||||||
|
source: controller.dataSource, |
||||||
|
columns: _buildColumns(), |
||||||
|
stackedHeaderRows: _buildStackedHeaders(), |
||||||
|
columnWidthMode: ColumnWidthMode.fill, |
||||||
|
gridLinesVisibility: GridLinesVisibility.both, |
||||||
|
headerGridLinesVisibility: GridLinesVisibility.both, |
||||||
|
), |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
List<GridColumn> _buildColumns() { |
||||||
|
return [ |
||||||
|
// 左表列 |
||||||
|
GridColumn(columnName: 'left_serial', width: 60, label: _buildHeaderCell('序号')), |
||||||
|
GridColumn(columnName: 'left_key', label: _buildHeaderCell('主键')), |
||||||
|
...controller.leftColumns.map( |
||||||
|
(col) => GridColumn(columnName: 'left_$col', label: _buildHeaderCell(col)), |
||||||
|
), |
||||||
|
// 对比列 |
||||||
|
GridColumn( |
||||||
|
columnName: 'comparison', |
||||||
|
label: _buildHeaderCell('对比', color: Colors.purple[50]), |
||||||
|
width: 80, |
||||||
|
), |
||||||
|
// 右表列 |
||||||
|
GridColumn(columnName: 'right_serial', width: 60, label: _buildHeaderCell('序号')), |
||||||
|
GridColumn(columnName: 'right_key', label: _buildHeaderCell('主键')), |
||||||
|
...controller.rightColumns.map( |
||||||
|
(col) => GridColumn(columnName: 'right_$col', label: _buildHeaderCell(col)), |
||||||
|
), |
||||||
|
]; |
||||||
|
} |
||||||
|
|
||||||
|
List<StackedHeaderRow> _buildStackedHeaders() { |
||||||
|
return [ |
||||||
|
// 第一行表头(左表和右表分组) |
||||||
|
StackedHeaderRow( |
||||||
|
cells: [ |
||||||
|
StackedHeaderCell( |
||||||
|
columnNames: [ |
||||||
|
'left_serial', |
||||||
|
'left_key', |
||||||
|
...controller.leftColumns.map((col) => 'left_$col'), |
||||||
|
], |
||||||
|
child: _buildGroupHeader('左表', color: Colors.green[50]), |
||||||
|
), |
||||||
|
// 对比列留空,将在第二行合并 |
||||||
|
// StackedHeaderCell(columnNames: ["comparison"], child: Container()), |
||||||
|
StackedHeaderCell( |
||||||
|
columnNames: [ |
||||||
|
'right_serial', |
||||||
|
'right_key', |
||||||
|
...controller.rightColumns.map((col) => 'right_$col'), |
||||||
|
], |
||||||
|
child: _buildGroupHeader('右表', color: Colors.blue[50]), |
||||||
|
), |
||||||
|
], |
||||||
|
), |
||||||
|
]; |
||||||
|
} |
||||||
|
|
||||||
|
Container _buildHeaderCell(String text, {Color? color}) { |
||||||
|
return Container( |
||||||
|
alignment: Alignment.center, |
||||||
|
color: color ?? Colors.grey[200], |
||||||
|
child: Text(text, style: const TextStyle(fontWeight: FontWeight.bold)), |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
Container _buildGroupHeader(String text, {Color? color}) { |
||||||
|
return Container( |
||||||
|
alignment: Alignment.center, |
||||||
|
color: color ?? Colors.purple[50], |
||||||
|
child: Text(text, style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 16)), |
||||||
|
); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue