Flutter高级表格展示插件advanced_table的使用

Flutter高级表格展示插件advanced_table的使用

Advanced Table

截图

注意:🚧 正在积极开发中。🚧

AdvancedTable 是一个提供了高级功能且更易于使用的表格组件,它通过允许对象以JSON表示的形式进行通用显示。

目录

开始使用

首先,在 pubspec.yaml 文件中添加依赖:

dependencies:
    advanced_table: ^1.1.0

或者,通过终端添加依赖:

flutter pub add advanced_table

使用包时,导入:

import 'package:advanced_table/advanced_table.dart';

展示

截图

用法

由于表格通过提供通用数据来工作,你需要创建一个简单的数据类。确保你提供了 toJson 方法,否则由于反射限制,表格将无法正常工作:

class Person {
  int age;
  String firstName;
  String lastName;
  List<String> favouriteFood;

  Person({
    required this.age,
    required this.firstName,
    required this.lastName,
    required this.favouriteFood,
  });

  Map<String, dynamic> toJson() => {
        'age': age,
        'firstName': firstName,
        'lastName': lastName,
        'favouriteFood': favouriteFood,
      };
}

一旦创建了数据类,你可以继续使用 AdvancedTable。这里的想法是你希望传递一个对象列表。此外,你需要为 Person 类中的每个字段提供一个 ColumnDefinition。确保 valueKey 属性与 Person#toJson 中的一个条目键匹配:

return MaterialApp(
  title: 'Example',
  home: Scaffold(
    body: AdvancedTable<Person>(
      columnDefinitions: [
        ColumnDefinition<int>(valueKey: 'age', title: const Text('Age')),
        ColumnDefinition<String>(
            valueKey: 'firstName', title: const Text('First name')),
        ColumnDefinition<String>(
            valueKey: 'lastName', title: const Text('Last name')),
        ColumnDefinition<List<String>>(
            valueKey: 'favouriteFood', title: const Text('Favourite Food')),
      ],
      data: [
        Person(
            age: 17,
            firstName: 'John',
            lastName: 'Smith',
            favouriteFood: ['Burger', 'Pizza']),
        Person(
            age: 17,
            firstName: 'Helena',
            lastName: 'Morgan',
            favouriteFood: ['Sushi', 'Pizza']),
      ],
    ),
  ),
);

操作

可以在 AdvancedTable 的表头行上方放置实用小部件:

AdvancedTable<Person>(
  columnDefinitions: ...,
  data: ...,
  actions: [
    IconButton(onPressed: () {}, icon: const Icon(Icons.sort)),
  ],
),

链接

可以通过向 ColumnDefinition 传递 isLink 来使单元格值可点击。你可能还想定义一个 linkValueClicked 以响应链接被点击。这是对 Uri 类型的默认行为。

示例:

ColumnDefinition<String>(
  valueKey: 'id',
  title: 'User ID',
  isLink: true,
  linkValueClicked: (value) {
    print('I was clicked');
  },
),

空值

AdvancedTable 可以显示 null 值。只需确保为 ColumnDefinition 的类型添加 ?

ColumnDefinition<List<String>?>(
  valueKey: 'favouriteFood', title: const Text('Favourite Food')),

你还可以配置 NullValueStrategy 以自定义显示为 null 的值的文本。默认情况下使用 NullValueStrategy.hyphen

列表显示文本

当定义 ColumnDefinition<List> 时,可以配置单元格中显示文本的方式。目前可以自定义 listSeparatorlistBrackets。默认情况下使用 ListSeparator.commaListBrackets.square

只需在创建 AdvancedTable 时传递所需值:

AdvancedTable<Person>(
  columnDefinitions: ...,
  data: ...,
  listSeparator: ListSeparator.semicolon,
  listBrackets: ListBrackets.curly,
),

限制

目前,ColumnDefinition 只支持 StringnumEnumDateTimeUriList 类型。

未来更新

目前计划增加以下功能:

  • 数据搜索、过滤和排序
  • 数据编辑
  • 列顺序移动
  • 样式定制

要了解进度,请访问 Advanced Table 项目板

错误、问题等

如果你发现任何奇怪的行为、错误或问题,请通过打开 问题 来告知我。如果UI表现不同,请附上一张图片或动图。


示例代码

import 'package:advanced_table/src/advanced_table.dart';
import 'package:advanced_table/src/column_definition.dart';
import 'package:flutter/material.dart';

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

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

  [@override](/user/override)
  State<ExampleApp> createState() => _ExampleAppState();
}

class _ExampleAppState extends State<ExampleApp> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Example',
      home: Scaffold(
        body: AdvancedTable<Person>(columnDefinitions: [
          ColumnDefinition<int>(
              valueKey: 'age',
              title: 'Age',
              isLink: true,
              linkValueClicked: (age) {
                debugPrint(age.toString());
              }),
          ColumnDefinition<String>(
            valueKey: 'firstName',
            title: 'First name',
          ),
          ColumnDefinition<String>(
            valueKey: 'lastName',
            title: 'Last name',
          ),
          ColumnDefinition<Gender>(
            valueKey: 'gender',
            title: 'Gender',
          ),
          ColumnDefinition<List<String>?>(
            valueKey: 'food',
            title: 'Favourite Food',
          ),
        ], data: [
          Person(
              age: 17,
              firstName: 'Hallo',
              lastName: 'Welt',
              gender: Gender.male,
              food: null),
          Person(
              age: 17,
              firstName: 'Hallo',
              lastName: 'Welt',
              gender: Gender.male,
              food: List.of(['this', 'that'])),
          Person(
              age: 17,
              firstName: 'Hallo',
              lastName: 'Welt',
              gender: Gender.male,
              food: List.of(['this', 'that'])),
          Person(
              age: 17,
              firstName: 'Hallo',
              lastName: 'Welt',
              gender: Gender.male,
              food: List.of(['this', 'that']))
        ]),
      ),
    );
  }
}

class Person {
  int age;
  String firstName;
  String lastName;
  Gender gender;
  List<String>? food;

  Person({
    required this.age,
    required this.firstName,
    required this.lastName,
    required this.gender,
    required this.food,
  });

  Map<String, dynamic> toJson() => {
        'age': age,
        'firstName': firstName,
        'lastName': lastName,
        'gender': gender,
        'food': food,
      };
}

enum Gender {
  male,
  female,
  diverse,
}

更多关于Flutter高级表格展示插件advanced_table的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter高级表格展示插件advanced_table的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用Flutter的advanced_table插件来展示高级表格的示例代码。假设你已经将advanced_table插件添加到了你的pubspec.yaml文件中,并且已经运行了flutter pub get

首先,确保你的pubspec.yaml文件中包含以下依赖项:

dependencies:
  flutter:
    sdk: flutter
  advanced_table: ^x.y.z  # 请替换为最新版本号

然后,你可以在你的Flutter项目中使用AdvancedTable组件来展示表格。以下是一个完整的示例代码:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Advanced Table Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  // 示例数据
  final List<Map<String, dynamic>> dataSource = [
    {
      'id': 1,
      'name': 'John Doe',
      'age': 30,
      'email': 'john.doe@example.com',
    },
    {
      'id': 2,
      'name': 'Jane Smith',
      'age': 25,
      'email': 'jane.smith@example.com',
    },
    // 可以添加更多数据
  ];

  // 列配置
  final List<TableColumn> columns = [
    TableColumn(
      title: 'ID',
      dataIndex: 'id',
      width: 80,
      align: 'center',
    ),
    TableColumn(
      title: 'Name',
      dataIndex: 'name',
      width: 150,
      align: 'left',
    ),
    TableColumn(
      title: 'Age',
      dataIndex: 'age',
      width: 100,
      align: 'center',
    ),
    TableColumn(
      title: 'Email',
      dataIndex: 'email',
      width: 250,
      align: 'left',
    ),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Advanced Table Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: AdvancedTable(
          columns: columns,
          dataSource: dataSource,
          // 可选配置
          pagination: false,  // 是否启用分页
          loading: false,     // 是否显示加载动画
          border: true,       // 是否显示表格边框
          striped: true,      // 是否斑马线表格
          hover: true,        // 是否启用悬停效果
          rowKey: (item, index) => item['id'].toString(), // 唯一标识行的key
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个使用AdvancedTable组件的页面。dataSource变量包含表格的数据,而columns变量定义了表格的列配置。AdvancedTable组件接受这些配置并渲染表格。

你可以根据需要调整dataSourcecolumns来适应你的数据结构和展示需求。AdvancedTable还提供了许多其他配置选项,如分页、加载动画、边框样式等,你可以根据需要进行配置。

请确保你使用的是最新版本的advanced_table插件,并查阅其官方文档以获取更多功能和配置选项。

回到顶部