android带分页功能的表格,Flutter 分页功能表格控件

08443dab5423426709821624625edd84.png

老孟导读:前2天有读者问到是否有带分页功能的表格控件,今天分页功能的表格控件详细解析来来。

PaginatedDataTable

PaginatedDataTable是一个带分页功能的DataTable,生成一批数据,项目中此一般通过服务器获取,定义model类:

class User {

User(this.name, this.age, this.sex);

final String name;

final int age;

final String sex;

}复制代码

生成数据:

List _data = [];

@override

void initState() {

List.generate(100, (index) {

_data.add(User('老孟$index', index % 50, index % 2 == 0 ? '男' : '女'));

});

super.initState();

}复制代码

PaginatedDataTable的基础用法如下:

PaginatedDataTable(

header: Text('header'),

columns: [

DataColumn(label: Text('姓名')),

DataColumn(label: Text('性别')),

DataColumn(label: Text('年龄')),

],

source: MyDataTableSource(_data),

)复制代码

header表示表格顶部控件。

columns表示每一列的列头控件。

source表示数据源,需要继承DataTableSource,用法如下:

class MyDataTableSource extends DataTableSource {

MyDataTableSource(this.data);

final List data;

@override

DataRow getRow(int index) {

if (index >= data.length) {

return null;

}

return DataRow.byIndex(

index: index,

cells: [

DataCell(Text('${data[index].name}')),

DataCell(Text('${data[index].sex}')),

DataCell(Text('${data[index].age}')),

],

);

}

@override

int get selectedRowCount {

return 0;

}

@override

bool get isRowCountApproximate {

return false;

}

@override

int get rowCount {

return data.length;

}

}复制代码

效果如下:

d4f4912165578cb31d91be03d8881921.png

getRow是根据index获取每一行的数据,通常使用DataRow.byIndex返回数据,cells表示每一个表格的数据,cells的数量需要与PaginatedDataTable中columns数量保持一致。

selectedRowCount是选中的行数,注意这里不是索引,是总共选中的行数。

isRowCountApproximate:如果isRowCountApproximate设置为true,行数将会无尽大,所以正常情况下isRowCountApproximate设置为false。

rowCount表示行数,如果isRowCountApproximate设置为true,此属性无效。

设置actions,显示在header的右端,用法如下:

PaginatedDataTable(

header: Text('header'),

actions: [

IconButton(icon: Icon(Icons.add),onPressed: (){},),

IconButton(icon: Icon(Icons.delete),onPressed: (){},),

],

...

)复制代码

效果如下:

01e12ec638363040c904a4208bfd5ea7.png

rowsPerPage表示每页显示的行数,默认10行,设置5行如下:

PaginatedDataTable(

rowsPerPage: 5,

...

)复制代码

onRowsPerPageChanged不为null时,在左下角出现每页显示多少行数的选项,用法如下:

var _rowsPerPage = 5;

PaginatedDataTable(

onRowsPerPageChanged: (v) {

setState(() {

_rowsPerPage = v;

});

},

availableRowsPerPage: [5,10,15,16],

rowsPerPage: _rowsPerPage,

...

)复制代码

效果如下:

22e9ba4dc9420ff8f1ee55a436801431.png

点击出现availableRowsPerPage设置的数组,onRowsPerPageChanged为选择其中一项后回调,用于更新rowsPerPage属性。

显示的数据过多时,需要将PaginatedDataTable包裹在SingleChildScrollView中,滚动显示数据:

SingleChildScrollView(

child: PaginatedDataTable()

)复制代码

onPageChanged是翻页时回调,返回当前页第一条数据的索引:

PaginatedDataTable(

onPageChanged: (page){

print('onPageChanged:$page');

},复制代码

打印数据为:

flutter: onPageChanged:10

flutter: onPageChanged:20

flutter: onPageChanged:30

flutter: onPageChanged:40复制代码

排序

生序降序设置:

PaginatedDataTable(

sortColumnIndex: 1,

sortAscending: false,

...

)复制代码

效果如下:

e68856a9e72bce86696e4920e05409d6.png

生序降序的设置仅仅显示相应图标,数据并不会实际排序,对数据进行排序可以当用户点击表头时对数据按照本列数据进行排序,用法如下,

var _sortAscending = true;

_buildPaginatedDataTable() {

return PaginatedDataTable(

header: Text('header'),

sortColumnIndex: 2,

sortAscending: _sortAscending,

columns: [

DataColumn(label: Text('姓名')),

DataColumn(label: Text('性别')),

DataColumn(

label: Text('年龄'),

onSort: (index, sortAscending) {

setState(() {

_sortAscending = sortAscending;

if (sortAscending) {

_data.sort((a, b) => a.age.compareTo(b.age));

} else {

_data.sort((a, b) => b.age.compareTo(a.age));

}

});

}),

],

source: MyDataTableSource(_data),

);

}复制代码

效果如下:

2aa0edb93cc4a493eaca93fd7f1e16fd.png

选中

可以在每一行的前面添加复选框,表示当前行是否选中,在User中添加是否选中属性,用法如下:

class User {

User(this.name, this.age, this.sex, {this.selected = false});

final String name;

final int age;

final String sex;

bool selected;

}复制代码

添加勾选框:

@override

DataRow getRow(int index) {

if (index >= data.length) {

return null;

}

return DataRow.byIndex(

index: index,

selected: data[index].selected,

onSelectChanged: (selected) {

data[index].selected = selected;

notifyListeners();

},

cells: [

DataCell(

Text('${data[index].name}'),

),

DataCell(Text('${data[index].sex}')),

DataCell(Text('${data[index].age}')),

],

);

}复制代码

效果如下:

db818e53c9614c0fa586f4649a7c1092.png

全选控制:

PaginatedDataTable(

header: Text('header'),

onSelectAll: (all) {

setState(() {

_data.forEach((f){

f.selected = all;

});

});

},复制代码

处理数据显示不全问题

当表格列比较多的时候,使用SingleChildScrollView包裹,显示不全时滚动显示,用法如下:

SingleChildScrollView(

scrollDirection: Axis.horizontal,

child: PaginatedDataTable()

)复制代码

效果如下:

5eb3ed9cf29d664155abaf681b515ddf.png

交流

老孟Flutter博客地址(近200个控件用法):laomengit.com

欢迎加入Flutter交流群(微信:laomengit)、关注公众号【老孟Flutter】:

b739ec46bb5c46d9c0aa4ce35ba1ea56.png

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[Flutter 分页功能表格控件]http://www.zyiz.net/tech/detail-131795.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值