// 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<int> _displayIndexToRawIndex = <int>[ 0, 3, 4, 5, 6 ]; late List<List<Comparable<Object>>> sortedData; void setData(List<List<Comparable<Object>>> rawData, int sortColumn, bool sortAscending) { sortedData = rawData.toList()..sort((List<Comparable<Object>> a, List<Comparable<Object>> b) { final Comparable<Object> cellA = a[_displayIndexToRawIndex[sortColumn]]; final Comparable<Object> 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: <DataCell>[ 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<DataTableExample> createState() => _DataTableExampleState(); } class _DataTableExampleState extends State<DataTableExample> { 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>[ 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<List<Comparable<Object>>> episodes = <List<Comparable<Object>>>[ <Comparable<Object>>[ 1, 1, 1, 'Strange New Worlds', 'Akiva Goldsman', 'Akiva Goldsman, Alex Kurtzman, Jenny Lumet', DateTime(2022, 5, 5), ], <Comparable<Object>>[ 2, 1, 2, 'Children of the Comet', 'Maja Vrvilo', 'Henry Alonso Myers, Sarah Tarkoff', DateTime(2022, 5, 12), ], <Comparable<Object>>[ 3, 1, 3, 'Ghosts of Illyria', 'Leslie Hope', 'Akela Cooper, Bill Wolkoff', DateTime(2022, 5, 19), ], <Comparable<Object>>[ 4, 1, 4, 'Memento Mori', 'Dan Liu', 'Davy Perez, Beau DeMayo', DateTime(2022, 5, 26), ], <Comparable<Object>>[ 5, 1, 5, 'Spock Amok', 'Rachel Leiterman', 'Henry Alonso Myers, Robin Wasserman', DateTime(2022, 6, 2), ], <Comparable<Object>>[ 6, 1, 6, 'Lift Us Where Suffering Cannot Reach', 'Andi Armaganian', 'Robin Wasserman, Bill Wolkoff', DateTime(2022, 6, 9), ], <Comparable<Object>>[ 7, 1, 7, 'The Serene Squall', 'Sydney Freeland', 'Beau DeMayo, Sarah Tarkoff', DateTime(2022, 6, 16), ], <Comparable<Object>>[ 8, 1, 8, 'The Elysian Kingdom', 'Amanda Row', 'Akela Cooper, Onitra Johnson', DateTime(2022, 6, 23), ], <Comparable<Object>>[ 9, 1, 9, 'All Those Who Wander', 'Christopher J. Byrne', 'Davy Perez', DateTime(2022, 6, 30), ], <Comparable<Object>>[ 10, 2, 10, 'A Quality of Mercy', 'Chris Fisher', 'Henry Alonso Myers, Akiva Goldsman', DateTime(2022, 7, 7), ], <Comparable<Object>>[ 11, 2, 1, 'The Broken Circle', 'Chris Fisher', 'Henry Alonso Myers, Akiva Goldsman', DateTime(2023, 6, 15), ], <Comparable<Object>>[ 12, 2, 2, 'Ad Astra per Aspera', 'Valerie Weiss', 'Dana Horgan', DateTime(2023, 6, 22), ], <Comparable<Object>>[ 13, 2, 3, 'Tomorrow and Tomorrow and Tomorrow', 'Amanda Row', 'David Reed', DateTime(2023, 6, 29), ], <Comparable<Object>>[ 14, 2, 4, 'Among the Lotus Eaters', 'Eduardo Sánchez', 'Kirsten Beyer, Davy Perez', DateTime(2023, 7, 6), ], <Comparable<Object>>[ 15, 2, 5, 'Charades', 'Jordan Canning', 'Kathryn Lyn, Henry Alonso Myers', DateTime(2023, 7, 13), ], <Comparable<Object>>[ 16, 2, 6, 'Lost in Translation', 'Dan Liu', 'Onitra Johnson, David Reed', DateTime(2023, 7, 20), ], <Comparable<Object>>[ 17, 2, 7, 'Those Old Scientists', 'Jonathan Frakes', 'Kathryn Lyn, Bill Wolkoff', DateTime(2023, 7, 22), ], <Comparable<Object>>[ 18, 2, 8, 'Under the Cloak of War', '', 'Davy Perez', DateTime(2023, 7, 27), ], <Comparable<Object>>[ 19, 2, 9, 'Subspace Rhapsody', '', 'Dana Horgan, Bill Wolkoff', DateTime(2023, 8, 3), ], <Comparable<Object>>[ 20, 2, 10, 'Hegemony', '', 'Henry Alonso Myers', DateTime(2023, 8, 10), ], ];