Flutter电子表格UI插件flutter_spreadsheet_ui的使用

发布于 1周前 作者 wuwangju 来自 Flutter

Flutter电子表格UI插件flutter_spreadsheet_ui的使用

简介

FlutterSpreadsheetUI 是一个Flutter插件,允许开发者在Flutter应用程序中轻松创建和嵌入类似电子表格的表格。通过这个插件,开发者可以创建具有各种功能(如列宽调整、行高调整等)的交互式和可自定义的表格。该插件提供了丰富的配置选项,例如列宽、行高、网格线颜色和粗细、字体样式和大小等,使开发者能够完全自定义表格的外观。此外,插件还提供了多种回调函数,用于处理列宽和行高的调整等操作。

开始使用

1. 添加依赖

pubspec.yaml 文件中添加以下依赖:

dependencies:
  flutter_spreadsheet_ui: '^0.0.5'
2. 安装依赖

在命令行或终端中运行以下命令来安装插件:

$ flutter pub get

或者,如果你的编辑器支持 flutter pub get,可以直接在编辑器中执行此操作。

3. 导入插件

在Dart代码中导入 flutter_spreadsheet_ui

import 'package:flutter_spreadsheet_ui/flutter_spreadsheet_ui.dart';

使用示例

1. 创建表格数据

首先,生成 FlutterSpreadsheetUIColumnFlutterSpreadsheetUIRow 的数据,这些数据将用于构建表格。

final List<FlutterSpreadsheetUIColumn> _columns = [
  FlutterSpreadsheetUIColumn(
    contentAlignment: Alignment.center,
    cellBuilder: (context, cellId) => const Text("任务"),
  ),
  FlutterSpreadsheetUIColumn(
    width: 200,
    contentAlignment: Alignment.center,
    cellBuilder: (context, cellId) => const Text("分配日期"),
  ),
  FlutterSpreadsheetUIColumn(
    width: 110,
    cellBuilder: (context, cellId) => const Text("权限"),
  ),
];

final List<FlutterSpreadsheetUIRow> _rows = [
  FlutterSpreadsheetUIRow(
    cells: [
      FlutterSpreadsheetUICell(
        cellBuilder: (context, cellId) => const Text('任务 1'),
      ),
      FlutterSpreadsheetUICell(
        cellBuilder: (context, cellId) => Text(DateTime.now().toString()),
      ),
      FlutterSpreadsheetUICell(
        cellBuilder: (context, cellId) => const Text('无'),
      ),
    ],
  ),
];
2. 配置表格

使用 FlutterSpreadsheetUIConfig 来自定义表格的默认配置:

FlutterSpreadsheetUIConfig _tableConfig = const FlutterSpreadsheetUIConfig(
  enableColumnWidthDrag: true,  // 允许拖动调整列宽
  enableRowHeightDrag: true,    // 允许拖动调整行高
  firstColumnWidth: 150,        // 第一列的宽度
  freezeFirstColumn: true,      // 冻结第一列
  freezeFirstRow: true,         // 冻结第一行
);
3. 添加回调函数

为了处理列宽和行高的调整,可以添加 columnWidthResizeCallbackrowHeightResizeCallback 回调函数:

void _columnWidthResizeCallback(int columnIndex, double updatedWidth) {
  log("列: $columnIndex 的新宽度: $updatedWidth");
}

void _rowHeightResizeCallback(int rowIndex, double updatedHeight) {
  log("行: $rowIndex 的新高度: $updatedHeight");
}
4. 构建表格

将上述配置和数据传递给 FlutterSpreadsheetUI 小部件,并将其添加到 widget 树中:

FlutterSpreadsheetUI(
  config: _tableConfig,
  columnWidthResizeCallback: _columnWidthResizeCallback,
  rowHeightResizeCallback: _rowHeightResizeCallback,
  columns: _columns,
  rows: _rows,
),

完整示例

以下是一个完整的示例代码,展示了如何在Flutter应用程序中使用 FlutterSpreadsheetUI 插件:

import 'dart:developer';

import 'package:flutter/material.dart';
import 'package:flutter_spreadsheet_ui/flutter_spreadsheet_ui.dart';

void main() {
  runApp(const MyApp());
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Padding(
        padding: const EdgeInsets.all(6.0),
        child: FlutterSpreadsheetUI(
          config: const FlutterSpreadsheetUIConfig(
            enableColumnWidthDrag: true,  // 允许拖动调整列宽
            enableRowHeightDrag: true,    // 允许拖动调整行高
            firstColumnWidth: 150,        // 第一列的宽度
            freezeFirstColumn: true,      // 冻结第一列
            freezeFirstRow: true,         // 冻结第一行
          ),
          columnWidthResizeCallback: (int columnIndex, double updatedWidth) {
            log("列: $columnIndex 的新宽度: $updatedWidth");
          },
          rowHeightResizeCallback: (int rowIndex, double updatedHeight) {
            log("行: $rowIndex 的新高度: $updatedHeight");
          },
          columns: [
            FlutterSpreadsheetUIColumn(
              contentAlignment: Alignment.center,
              cellBuilder: (context, cellId) => const Text("任务"),
            ),
            FlutterSpreadsheetUIColumn(
              width: 200,
              contentAlignment: Alignment.center,
              cellBuilder: (context, cellId) => const Text("分配日期"),
            ),
            FlutterSpreadsheetUIColumn(
              width: 110,
              cellBuilder: (context, cellId) => const Text("权限"),
            ),
          ],
          rows: [
            FlutterSpreadsheetUIRow(
              cells: [
                FlutterSpreadsheetUICell(
                  cellBuilder: (context, cellId) => const Text('任务 1'),
                ),
                FlutterSpreadsheetUICell(
                  cellBuilder: (context, cellId) => Text(DateTime.now().toString()),
                ),
                FlutterSpreadsheetUICell(
                  cellBuilder: (context, cellId) => const Text('无'),
                ),
              ],
            ),
            FlutterSpreadsheetUIRow(
              cells: [
                FlutterSpreadsheetUICell(
                  cellBuilder: (context, cellId) => const Text('任务 2'),
                ),
                FlutterSpreadsheetUICell(
                  cellBuilder: (context, cellId) => Text(DateTime.now().toString()),
                ),
                FlutterSpreadsheetUICell(
                  cellBuilder: (context, cellId) => const Text('读取'),
                ),
              ],
            ),
            FlutterSpreadsheetUIRow(
              cells: [
                FlutterSpreadsheetUICell(
                  cellBuilder: (context, cellId) => const Text('任务 3'),
                ),
                FlutterSpreadsheetUICell(
                  cellBuilder: (context, cellId) => Text(DateTime.now().toString()),
                ),
                FlutterSpreadsheetUICell(
                  cellBuilder: (context, cellId) => const Text('编辑'),
                ),
              ],
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter电子表格UI插件flutter_spreadsheet_ui的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter电子表格UI插件flutter_spreadsheet_ui的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用 flutter_spreadsheet_ui 插件来创建一个简单的电子表格UI的示例代码。这个插件允许你在Flutter应用中创建和操作电子表格。

首先,确保你已经在 pubspec.yaml 文件中添加了 flutter_spreadsheet_ui 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_spreadsheet_ui: ^latest_version  # 请替换为最新版本号

然后运行 flutter pub get 来获取依赖。

接下来,在你的 Dart 文件中使用 flutter_spreadsheet_ui 插件。以下是一个完整的示例代码:

import 'package:flutter/material.dart';
import 'package:flutter_spreadsheet_ui/flutter_spreadsheet_ui.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Spreadsheet UI Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: SpreadsheetScreen(),
    );
  }
}

class SpreadsheetScreen extends StatefulWidget {
  @override
  _SpreadsheetScreenState createState() => _SpreadsheetScreenState();
}

class _SpreadsheetScreenState extends State<SpreadsheetScreen> {
  final SpreadsheetController _controller = SpreadsheetController(
    rows: 10,
    cols: 10,
    initialData: List.generate(
      100,
      (index) => SpreadsheetCellData(value: (index % 10).toString()),
    ),
  );

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Spreadsheet UI Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Spreadsheet(
          controller: _controller,
          headerBuilder: (context, row, col) {
            return Text(
              (col == 0 ? 'Row ' : '') + (row + 1).toString(),
              style: TextStyle(fontWeight: FontWeight.bold),
            );
          },
          cellBuilder: (context, row, col) {
            final cellData = _controller.cellData(row, col);
            return GestureDetector(
              onTap: () {
                _showCellEditorDialog(context, row, col);
              },
              child: Container(
                decoration: BoxDecoration(
                  border: Border.all(color: Colors.grey.shade300),
                ),
                child: Center(
                  child: Text(
                    cellData.value ?? '',
                    style: TextStyle(fontSize: 16),
                  ),
                ),
              ),
            );
          },
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          _showAddRowDialog(context);
        },
        tooltip: 'Add Row',
        child: Icon(Icons.add),
      ),
    );
  }

  Future<void> _showCellEditorDialog(BuildContext context, int row, int col) async {
    final result = await showDialog<String>(
      context: context,
      builder: (context) {
        return AlertDialog(
          title: Text('Edit Cell'),
          content: TextField(
            initialValue: _controller.cellData(row, col).value ?? '',
            decoration: InputDecoration(labelText: 'Value'),
            onChanged: (value) {
              _controller.updateCellData(row, col, SpreadsheetCellData(value: value));
            },
          ),
          actions: <Widget>[
            TextButton(
              onPressed: () => Navigator.of(context).pop(),
              child: Text('Cancel'),
            ),
            TextButton(
              onPressed: () => Navigator.of(context).pop(null),
              child: Text('OK'),
            ),
          ],
        );
      },
    );
  }

  Future<void> _showAddRowDialog(BuildContext context) async {
    final result = await showDialog<void>(
      context: context,
      builder: (context) {
        return AlertDialog(
          title: Text('Add Row'),
          content: SingleChildScrollView(
            child: ListBody(
              children: List.generate(
                10,
                (index) => TextField(
                  decoration: InputDecoration(labelText: 'Col ${index + 1}'),
                  onChanged: (value) {
                    // You can handle the input here if needed
                  },
                ),
              ),
            ),
          ),
          actions: <Widget>[
            TextButton(
              onPressed: () => Navigator.of(context).pop(),
              child: Text('Cancel'),
            ),
            TextButton(
              onPressed: () {
                List<SpreadsheetCellData> newRowData = List.generate(
                  10,
                  (index) => SpreadsheetCellData(value: (index + 1).toString()), // Replace with actual input values
                );
                _controller.addRow(newRowData);
                Navigator.of(context).pop();
              },
              child: Text('Add'),
            ),
          ],
        );
      },
    );
  }
}

在这个示例中,我们创建了一个简单的电子表格界面,其中包括:

  1. 一个 SpreadsheetController 实例,用于管理电子表格的数据和状态。
  2. 一个 Spreadsheet 组件,用于显示电子表格。
  3. 一个自定义的 headerBuilder,用于生成表头。
  4. 一个自定义的 cellBuilder,用于生成单元格,并为每个单元格添加点击事件以显示编辑器对话框。
  5. _showCellEditorDialog 方法,用于显示单元格编辑器对话框。
  6. _showAddRowDialog 方法,用于显示添加新行的对话框(在这个示例中,新行的数据是硬编码的,你可以根据实际需求进行修改)。

请注意,这个示例是一个基础实现,你可以根据具体需求进一步扩展和优化。

回到顶部