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>
时,可以配置单元格中显示文本的方式。目前可以自定义 listSeparator
和 listBrackets
。默认情况下使用 ListSeparator.comma
和 ListBrackets.square
。
只需在创建 AdvancedTable
时传递所需值:
AdvancedTable<Person>(
columnDefinitions: ...,
data: ...,
listSeparator: ListSeparator.semicolon,
listBrackets: ListBrackets.curly,
),
限制
目前,ColumnDefinition
只支持 String
、num
、Enum
、DateTime
、Uri
和 List
类型。
未来更新
目前计划增加以下功能:
- 数据搜索、过滤和排序
- 数据编辑
- 列顺序移动
- 样式定制
要了解进度,请访问 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
更多关于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
组件接受这些配置并渲染表格。
你可以根据需要调整dataSource
和columns
来适应你的数据结构和展示需求。AdvancedTable
还提供了许多其他配置选项,如分页、加载动画、边框样式等,你可以根据需要进行配置。
请确保你使用的是最新版本的advanced_table
插件,并查阅其官方文档以获取更多功能和配置选项。