// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'package:flutter/material.dart'; /// Flutter code sample for [PaginatedDataTable]. class MyDataSource extends DataTableSource { static const List _displayIndexToRawIndex = [0, 3, 4, 5, 6]; late List>> sortedData; void setData( List>> rawData, int sortColumn, bool sortAscending, ) { sortedData = rawData.toList() ..sort((List> a, List> b) { final Comparable cellA = a[_displayIndexToRawIndex[sortColumn]]; final Comparable cellB = b[_displayIndexToRawIndex[sortColumn]]; return cellA.compareTo(cellB) * (sortAscending ? 1 : -1); }); notifyListeners(); } @override int get rowCount => sortedData.length; static DataCell cellFor(Object data) { String value; if (data is DateTime) { value = '${data.year}-${data.month.toString().padLeft(2, '0')}-${data.day.toString().padLeft(2, '0')}'; } else { value = data.toString(); } return DataCell(Text(value)); } @override DataRow? getRow(int index) { return DataRow.byIndex( index: sortedData[index][0] as int, cells: [ cellFor( 'S${sortedData[index][1]}E${sortedData[index][2].toString().padLeft(2, '0')}', ), cellFor(sortedData[index][3]), cellFor(sortedData[index][4]), cellFor(sortedData[index][5]), cellFor(sortedData[index][6]), ], ); } @override bool get isRowCountApproximate => false; @override int get selectedRowCount => 0; } void main() => runApp(const DataTableExampleApp()); class DataTableExampleApp extends StatelessWidget { const DataTableExampleApp({super.key}); @override Widget build(BuildContext context) { return const MaterialApp( home: SingleChildScrollView( padding: EdgeInsets.all(12.0), child: DataTableExample(), ), ); } } class DataTableExample extends StatefulWidget { const DataTableExample({super.key}); @override State createState() => _DataTableExampleState(); } class _DataTableExampleState extends State { final MyDataSource dataSource = MyDataSource()..setData(episodes, 0, true); int _columnIndex = 0; bool _columnAscending = true; void _sort(int columnIndex, bool ascending) { setState(() { _columnIndex = columnIndex; _columnAscending = ascending; dataSource.setData(episodes, _columnIndex, _columnAscending); }); } @override Widget build(BuildContext context) { return PaginatedDataTable( sortColumnIndex: _columnIndex, sortAscending: _columnAscending, columns: [ DataColumn(label: const Text('Episode'), onSort: _sort), DataColumn(label: const Text('Title'), onSort: _sort), DataColumn(label: const Text('Director'), onSort: _sort), DataColumn(label: const Text('Writer(s)'), onSort: _sort), DataColumn(label: const Text('Air Date'), onSort: _sort), ], source: dataSource, ); } } final List>> episodes = >>[ >[ 1, 1, 1, 'Strange New Worlds', 'Akiva Goldsman', 'Akiva Goldsman, Alex Kurtzman, Jenny Lumet', DateTime(2022, 5, 5), ], >[ 2, 1, 2, 'Children of the Comet', 'Maja Vrvilo', 'Henry Alonso Myers, Sarah Tarkoff', DateTime(2022, 5, 12), ], >[ 3, 1, 3, 'Ghosts of Illyria', 'Leslie Hope', 'Akela Cooper, Bill Wolkoff', DateTime(2022, 5, 19), ], >[ 4, 1, 4, 'Memento Mori', 'Dan Liu', 'Davy Perez, Beau DeMayo', DateTime(2022, 5, 26), ], >[ 5, 1, 5, 'Spock Amok', 'Rachel Leiterman', 'Henry Alonso Myers, Robin Wasserman', DateTime(2022, 6, 2), ], >[ 6, 1, 6, 'Lift Us Where Suffering Cannot Reach', 'Andi Armaganian', 'Robin Wasserman, Bill Wolkoff', DateTime(2022, 6, 9), ], >[ 7, 1, 7, 'The Serene Squall', 'Sydney Freeland', 'Beau DeMayo, Sarah Tarkoff', DateTime(2022, 6, 16), ], >[ 8, 1, 8, 'The Elysian Kingdom', 'Amanda Row', 'Akela Cooper, Onitra Johnson', DateTime(2022, 6, 23), ], >[ 9, 1, 9, 'All Those Who Wander', 'Christopher J. Byrne', 'Davy Perez', DateTime(2022, 6, 30), ], >[ 10, 2, 10, 'A Quality of Mercy', 'Chris Fisher', 'Henry Alonso Myers, Akiva Goldsman', DateTime(2022, 7, 7), ], >[ 11, 2, 1, 'The Broken Circle', 'Chris Fisher', 'Henry Alonso Myers, Akiva Goldsman', DateTime(2023, 6, 15), ], >[ 12, 2, 2, 'Ad Astra per Aspera', 'Valerie Weiss', 'Dana Horgan', DateTime(2023, 6, 22), ], >[ 13, 2, 3, 'Tomorrow and Tomorrow and Tomorrow', 'Amanda Row', 'David Reed', DateTime(2023, 6, 29), ], >[ 14, 2, 4, 'Among the Lotus Eaters', 'Eduardo Sánchez', 'Kirsten Beyer, Davy Perez', DateTime(2023, 7, 6), ], >[ 15, 2, 5, 'Charades', 'Jordan Canning', 'Kathryn Lyn, Henry Alonso Myers', DateTime(2023, 7, 13), ], >[ 16, 2, 6, 'Lost in Translation', 'Dan Liu', 'Onitra Johnson, David Reed', DateTime(2023, 7, 20), ], >[ 17, 2, 7, 'Those Old Scientists', 'Jonathan Frakes', 'Kathryn Lyn, Bill Wolkoff', DateTime(2023, 7, 22), ], >[ 18, 2, 8, 'Under the Cloak of War', '', 'Davy Perez', DateTime(2023, 7, 27), ], >[ 19, 2, 9, 'Subspace Rhapsody', '', 'Dana Horgan, Bill Wolkoff', DateTime(2023, 8, 3), ], >[ 20, 2, 10, 'Hegemony', '', 'Henry Alonso Myers', DateTime(2023, 8, 10), ], ];