首页 > 其他分享 >Flutter进阶组件(7):DataTable(数据表格)

Flutter进阶组件(7):DataTable(数据表格)

时间:2024-12-31 16:53:33浏览次数:1  
标签:DataCell 进阶 Text DataTable DataRow onTap const Flutter

DataTable是一个用于展示数据的表格组件,它允许开发者以一种结构化和可滚动的方式展示数据集。DataTable非常适合展示详细信息,如表格数据、统计数据或配置选项。

一、创建基本的DataTable

以下是创建一个基本DataTable的示例:

import 'package:flutter/material.dart';

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

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

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'Flutter Demo',
      debugShowCheckedModeBanner: false,
      home: DataTableExample(),
    );
  }
}

// 数据表格基本示例
class DataTableExample extends StatelessWidget {
  const DataTableExample({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('DataTable Example'),
      ),
      body: DataTable( // 数据表格
        columns: const <DataColumn>[ // 表头
          DataColumn(
            label: Text('Name'),
          ),
          DataColumn(
            label: Text('Age'),
          ),
          DataColumn(
            label: Text('Country'),
          ),
        ],

        rows: const <DataRow>[ // 内容行
          DataRow(cells: <DataCell>[
            DataCell(Text('John Doe')),
            DataCell(Text('21')),
            DataCell(Text('USA')),
          ]),

          DataRow(cells: <DataCell>[
            DataCell(Text('John Tom')),
            DataCell(Text('25')),
            DataCell(Text('UN')),
          ]),

          DataRow(cells: <DataCell>[
            DataCell(Text('John Jerry')),
            DataCell(Text('29')),
            DataCell(Text('HK')),
          ]),       

          // 更多的DataRow...
        ],

      ),
    );
  }
}

效果图如下所示:

flutter_table_A.png

二、DataTable属性

(1)DataTable参数

字段 类型
columns(表头) List<DataColumn>
rows(内容行) List<DataRow>
sortColumnIndex(排序列索引) int
sortAscending(升序排序) bool
onSelectAll(点击全选) ValueSetter<bool>

(2)DataColumn参数

字段 类型
label(标签,文本或者size=18的图标) Widget
tooltip(工具提示) String
numeric(是否包含数字) bool
onSort(排序时调用) DataColumnSortCallback

(3)DataRow参数

字段 类型
selected(选中) bool
onSelectChanged(点击选中改变) ValueChanged<bool>
cells(子项) List<DataCell>
index(索引DataRow.byIndex特有) int

(4)DataCell参数

字段 类型
child(子部件,一般为TextDropdownButton Widget
placeholder(是否为占位符,若childText,显示占位符文本样式) bool
showEditIcon(显示编辑图标,并非意义上的把child变为可编辑,需要结合onTap) bool
onTap(点击) VoidCallback

三、DataRow和DataCell的使用

DataRowDataTable中的行,它由DataCell组成:

DataRow(
  cells: <DataCell>[
    DataCell(Text('Jane Doe')),
    DataCell(Text('30')),
    DataCell(Text('Canada')),
  ],
)

DataCellDataRow中的单元格,它可以包含任何 Widget:

DataCell(Text('35'))

四、DataTable排序功能

DataTable支持排序功能,你可以通过实现onSelectSortColumn回调来自定义排序逻辑:

DataTable(
  sortColumnIndex: _sortColumnIndex,
  sortAscending: _sortAscending,
  onSelectSortColumn: (int columnIndex, bool ascending) {
    setState(() {
      _sortColumnIndex = columnIndex;
      _sortAscending = ascending;
      // 实现排序逻辑
    });
  },
  // ...
)

五、实现单元格可点击

class DataTableExample extends StatefulWidget {
  const DataTableExample({super.key});
  @override
  State<DataTableExample> createState() => DataTableState();
}

// 数据表格示例
class DataTableState extends State<DataTableExample> {
  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('DataTable Demo'), primary: true),
      body: DataTable( // 数据表格
        columns: const <DataColumn>[ // 表头
          DataColumn(
            label: Text('Name'),
          ),
          DataColumn(
            label: Text('Age'),
          ),
          DataColumn(
            label: Text('Country'),
          ),
        ],

        rows: const <DataRow>[ // 内容行
          DataRow(cells: <DataCell>[
            DataCell(Text('John Doe'), onTap: onTap),
            DataCell(Text('21'), onTap: onTap),
            DataCell(Text('USA'), onTap: onTap),
          ]),

          DataRow(cells: <DataCell>[
            DataCell(Text('John Tom'), onTap: onTap),
            DataCell(Text('25'), onTap: onTap),
            DataCell(Text('UN'), onTap: onTap),
          ]),

          DataRow(cells: <DataCell>[
            DataCell(Text('John Jerry'), onTap: onTap),
            DataCell(Text('29'), onTap: onTap),
            DataCell(Text('HK'), onTap: onTap),
          ]),       

          // 更多的DataRow...
        ],

      ));
  }
}

void onTap() {
  debugPrint('data onTap');
}

效果图如下所示,单元格现在可以点击:

flutter_table_C.png

六、自定义DataTable外观

你可以通过设置不同的属性来定制DataTable的外观:

DataTable(
  border: TableBorder.all(color: Colors.blueAccent), // 蓝色边框
  columnSpacing: 20.0,
  dataRowMinHeight: 48.0,
  headingRowHeight: 56.0,
  // ...
)

加了之后的效果图如下所示:

flutter_table_B.png


参考:

Flutter 中的 DataTable 小部件:全面指南_flutter datatable-CSDN博客

Flutter学习记录——12.表格组件_flutter 表格-CSDN博客


标签:DataCell,进阶,Text,DataTable,DataRow,onTap,const,Flutter
From: https://www.cnblogs.com/linuxAndMcu/p/18644368

相关文章

  • Vue 3 + TypeScript 从入门到进阶:快速上手指南
    Vue3+TypeScript从入门到进阶:快速上手指南Vue3是Vue.js的最新版本,而TypeScript是一种可以极大提升开发效率和代码质量的强类型语言。当Vue3与TypeScript结合使用时,可以带来更高效的开发体验。本文将重点介绍Vue3与TypeScript的结合使用方式,并提供详细的代码......
  • Vue 3 从入门到进阶:快速上手指南
    Vue3从入门到进阶:快速上手指南Vue3是Vue.js的最新版本,引入了许多强大的新特性,如CompositionAPI、全新的响应式系统等,为开发者提供了更高的灵活性和性能优化。本文将带你快速了解Vue3的核心概念,并提供代码示例帮助你上手。一、Vue3新特性概览1.CompositionAPIC......
  • 《docker高级篇(大厂进阶):1.Docker复杂安装详说》包括:安装mysql主从复制、安装redis集群
    @目录二、高级篇(大厂进阶)1.Docker复杂安装详说1.1安装mysql主从复制1.2安装redis集群1.2.1面试题:1~2亿条数据需要缓存,请问如何设计这个存储案例哈希取余分区一致性哈希算法分区哈希槽分区1.2.23主3从redis集群扩缩容配置案例架构说明整体流程图知识点总结图使用步骤:注意点说明......
  • 《智破光影迷宫:人工智能图像识别的进阶挑战》
    在当今数字化的时代,人工智能图像识别技术如同一颗璀璨的明星,照亮了众多领域前行的道路。从安防监控中的人脸辨识、医疗影像的病症诊断,到智能交通里的车牌读取以及工业生产线上的产品质量检测,图像识别的应用场景可谓广泛且关键。然而,如同阳光之下必有阴影,复杂背景与光照变化......
  • SQL 实战:窗口函数进阶 – 实现复杂滑动窗口与动态累计计算
    窗口函数是SQL中非常强大的工具,能够在不改变原始数据粒度的情况下,动态进行排名、累计、滑动平均以及环比同比计算。在实际业务场景中,窗口函数常用于构建复杂的时间序列分析,如滚动累计、移动平均、同比/环比增长等。本文将深入探讨窗口函数的高级用法,通过具体案例展示如......
  • Python 进阶:深入理解 import 机制与 importlib 的妙用
    大家好,今天我们来深入探讨Python中的导入机制和importlib模块。相信不少朋友和我一样,平时写代码时可能只用过最基础的import语句,或者偶尔用importlib.import_module来做些动态导入。但其实这背后的机制非常有趣,而且importlib提供的功能远比我们想象的要丰富。Python的......
  • harmony_flutter_packageInfo(包基础信息获取)
    harmony_flutter_packageInfo(包基础信息获取)一.MethodChannel1.flutter端代码创建MethodChannel接收ohos端传递过来的状态值staticconstMethodChannel_channel=constMethodChannel('dev.fluttercommunity.plus/package_info');//获取所有参数staticFutur......
  • harmony_flutter_contacts(获取原生通讯录)
    harmony_flutter_contacts(获取原生通讯录)1.ohos端建立通道请求权限方法调用系统通讯录增加增删改查constpermissions:Array<Permissions>=['ohos.permission.READ_CONTACTS','ohos.permission.WRITE_CONTACTS']/**FlutterContactsPlugin**/exportdefaultclas......
  • 洛谷题单指南-线段树的进阶用法-P4587 [FJOI2016] 神秘数
    原题链接:https://www.luogu.com.cn/problem/P4587题意解读:对于序列a[n],查询m个区间[l,r]数值对应集合的神秘数。集合S 的神秘数定义为最小的不能被 S的子集的和表示的正整数。解题思路:对于区间[l,r],从小到大将数值选入集合,来观察神秘数的变化,设S当前的神秘数为ans。当下一......
  • 《Vue进阶教程》第三十一课:ref的初步实现
     往期内容:《Vue进阶教程》第二十课:lazy懒执行《Vue进阶教程》第二十一课:支持缓存《Vue进阶教程》第二十二课:自定义更新(调度器)《Vue进阶教程》第二十三课:渲染计算属性的结果《Vue进阶教程》第二十四课:优化《Vue进阶教程》第二十五课:watch基本概念《Vue进阶教程》第二......