mirror of
https://github.com/flutter/flutter
synced 2024-10-13 19:52:53 +00:00
Test DataTable (#7591)
This patch adds a basic test for the DataTable widget.
This commit is contained in:
parent
94cac1a69c
commit
bf296f715e
|
@ -5,8 +5,8 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/rendering.dart';
|
||||
|
||||
class Desert {
|
||||
Desert(this.name, this.calories, this.fat, this.carbs, this.protein, this.sodium, this.calcium, this.iron);
|
||||
class Dessert {
|
||||
Dessert(this.name, this.calories, this.fat, this.carbs, this.protein, this.sodium, this.calcium, this.iron);
|
||||
final String name;
|
||||
final int calories;
|
||||
final double fat;
|
||||
|
@ -19,68 +19,68 @@ class Desert {
|
|||
bool selected = false;
|
||||
}
|
||||
|
||||
class DesertDataSource extends DataTableSource {
|
||||
final List<Desert> _deserts = <Desert>[
|
||||
new Desert('Frozen yogurt', 159, 6.0, 24, 4.0, 87, 14, 1),
|
||||
new Desert('Ice cream sandwich', 237, 9.0, 37, 4.3, 129, 8, 1),
|
||||
new Desert('Eclair', 262, 16.0, 24, 6.0, 337, 6, 7),
|
||||
new Desert('Cupcake', 305, 3.7, 67, 4.3, 413, 3, 8),
|
||||
new Desert('Gingerbread', 356, 16.0, 49, 3.9, 327, 7, 16),
|
||||
new Desert('Jelly bean', 375, 0.0, 94, 0.0, 50, 0, 0),
|
||||
new Desert('Lollipop', 392, 0.2, 98, 0.0, 38, 0, 2),
|
||||
new Desert('Honeycomb', 408, 3.2, 87, 6.5, 562, 0, 45),
|
||||
new Desert('Donut', 452, 25.0, 51, 4.9, 326, 2, 22),
|
||||
new Desert('KitKat', 518, 26.0, 65, 7.0, 54, 12, 6),
|
||||
class DessertDataSource extends DataTableSource {
|
||||
final List<Dessert> _desserts = <Dessert>[
|
||||
new Dessert('Frozen yogurt', 159, 6.0, 24, 4.0, 87, 14, 1),
|
||||
new Dessert('Ice cream sandwich', 237, 9.0, 37, 4.3, 129, 8, 1),
|
||||
new Dessert('Eclair', 262, 16.0, 24, 6.0, 337, 6, 7),
|
||||
new Dessert('Cupcake', 305, 3.7, 67, 4.3, 413, 3, 8),
|
||||
new Dessert('Gingerbread', 356, 16.0, 49, 3.9, 327, 7, 16),
|
||||
new Dessert('Jelly bean', 375, 0.0, 94, 0.0, 50, 0, 0),
|
||||
new Dessert('Lollipop', 392, 0.2, 98, 0.0, 38, 0, 2),
|
||||
new Dessert('Honeycomb', 408, 3.2, 87, 6.5, 562, 0, 45),
|
||||
new Dessert('Donut', 452, 25.0, 51, 4.9, 326, 2, 22),
|
||||
new Dessert('KitKat', 518, 26.0, 65, 7.0, 54, 12, 6),
|
||||
|
||||
new Desert('Frozen yogurt with sugar', 168, 6.0, 26, 4.0, 87, 14, 1),
|
||||
new Desert('Ice cream sandwich with sugar', 246, 9.0, 39, 4.3, 129, 8, 1),
|
||||
new Desert('Eclair with sugar', 271, 16.0, 26, 6.0, 337, 6, 7),
|
||||
new Desert('Cupcake with sugar', 314, 3.7, 69, 4.3, 413, 3, 8),
|
||||
new Desert('Gingerbread with sugar', 345, 16.0, 51, 3.9, 327, 7, 16),
|
||||
new Desert('Jelly bean with sugar', 364, 0.0, 96, 0.0, 50, 0, 0),
|
||||
new Desert('Lollipop with sugar', 401, 0.2, 100, 0.0, 38, 0, 2),
|
||||
new Desert('Honeycomb with sugar', 417, 3.2, 89, 6.5, 562, 0, 45),
|
||||
new Desert('Donut with sugar', 461, 25.0, 53, 4.9, 326, 2, 22),
|
||||
new Desert('KitKat with sugar', 527, 26.0, 67, 7.0, 54, 12, 6),
|
||||
new Dessert('Frozen yogurt with sugar', 168, 6.0, 26, 4.0, 87, 14, 1),
|
||||
new Dessert('Ice cream sandwich with sugar', 246, 9.0, 39, 4.3, 129, 8, 1),
|
||||
new Dessert('Eclair with sugar', 271, 16.0, 26, 6.0, 337, 6, 7),
|
||||
new Dessert('Cupcake with sugar', 314, 3.7, 69, 4.3, 413, 3, 8),
|
||||
new Dessert('Gingerbread with sugar', 345, 16.0, 51, 3.9, 327, 7, 16),
|
||||
new Dessert('Jelly bean with sugar', 364, 0.0, 96, 0.0, 50, 0, 0),
|
||||
new Dessert('Lollipop with sugar', 401, 0.2, 100, 0.0, 38, 0, 2),
|
||||
new Dessert('Honeycomb with sugar', 417, 3.2, 89, 6.5, 562, 0, 45),
|
||||
new Dessert('Donut with sugar', 461, 25.0, 53, 4.9, 326, 2, 22),
|
||||
new Dessert('KitKat with sugar', 527, 26.0, 67, 7.0, 54, 12, 6),
|
||||
|
||||
new Desert('Frozen yogurt with honey', 223, 6.0, 36, 4.0, 87, 14, 1),
|
||||
new Desert('Ice cream sandwich with honey', 301, 9.0, 49, 4.3, 129, 8, 1),
|
||||
new Desert('Eclair with honey', 326, 16.0, 36, 6.0, 337, 6, 7),
|
||||
new Desert('Cupcake with honey', 369, 3.7, 79, 4.3, 413, 3, 8),
|
||||
new Desert('Gingerbread with honey', 420, 16.0, 61, 3.9, 327, 7, 16),
|
||||
new Desert('Jelly bean with honey', 439, 0.0, 106, 0.0, 50, 0, 0),
|
||||
new Desert('Lollipop with honey', 456, 0.2, 110, 0.0, 38, 0, 2),
|
||||
new Desert('Honeycomb with honey', 472, 3.2, 99, 6.5, 562, 0, 45),
|
||||
new Desert('Donut with honey', 516, 25.0, 63, 4.9, 326, 2, 22),
|
||||
new Desert('KitKat with honey', 582, 26.0, 77, 7.0, 54, 12, 6),
|
||||
new Dessert('Frozen yogurt with honey', 223, 6.0, 36, 4.0, 87, 14, 1),
|
||||
new Dessert('Ice cream sandwich with honey', 301, 9.0, 49, 4.3, 129, 8, 1),
|
||||
new Dessert('Eclair with honey', 326, 16.0, 36, 6.0, 337, 6, 7),
|
||||
new Dessert('Cupcake with honey', 369, 3.7, 79, 4.3, 413, 3, 8),
|
||||
new Dessert('Gingerbread with honey', 420, 16.0, 61, 3.9, 327, 7, 16),
|
||||
new Dessert('Jelly bean with honey', 439, 0.0, 106, 0.0, 50, 0, 0),
|
||||
new Dessert('Lollipop with honey', 456, 0.2, 110, 0.0, 38, 0, 2),
|
||||
new Dessert('Honeycomb with honey', 472, 3.2, 99, 6.5, 562, 0, 45),
|
||||
new Dessert('Donut with honey', 516, 25.0, 63, 4.9, 326, 2, 22),
|
||||
new Dessert('KitKat with honey', 582, 26.0, 77, 7.0, 54, 12, 6),
|
||||
|
||||
new Desert('Frozen yogurt with milk', 262, 8.4, 36, 12.0, 194, 44, 1),
|
||||
new Desert('Ice cream sandwich with milk', 339, 11.4, 49, 12.3, 236, 38, 1),
|
||||
new Desert('Eclair with milk', 365, 18.4, 36, 14.0, 444, 36, 7),
|
||||
new Desert('Cupcake with milk', 408, 6.1, 79, 12.3, 520, 33, 8),
|
||||
new Desert('Gingerbread with milk', 459, 18.4, 61, 11.9, 434, 37, 16),
|
||||
new Desert('Jelly bean with milk', 478, 2.4, 106, 8.0, 157, 30, 0),
|
||||
new Desert('Lollipop with milk', 495, 2.6, 110, 8.0, 145, 30, 2),
|
||||
new Desert('Honeycomb with milk', 511, 5.6, 99, 14.5, 669, 30, 45),
|
||||
new Desert('Donut with milk', 555, 27.4, 63, 12.9, 433, 32, 22),
|
||||
new Desert('KitKat with milk', 621, 28.4, 77, 15.0, 161, 42, 6),
|
||||
new Dessert('Frozen yogurt with milk', 262, 8.4, 36, 12.0, 194, 44, 1),
|
||||
new Dessert('Ice cream sandwich with milk', 339, 11.4, 49, 12.3, 236, 38, 1),
|
||||
new Dessert('Eclair with milk', 365, 18.4, 36, 14.0, 444, 36, 7),
|
||||
new Dessert('Cupcake with milk', 408, 6.1, 79, 12.3, 520, 33, 8),
|
||||
new Dessert('Gingerbread with milk', 459, 18.4, 61, 11.9, 434, 37, 16),
|
||||
new Dessert('Jelly bean with milk', 478, 2.4, 106, 8.0, 157, 30, 0),
|
||||
new Dessert('Lollipop with milk', 495, 2.6, 110, 8.0, 145, 30, 2),
|
||||
new Dessert('Honeycomb with milk', 511, 5.6, 99, 14.5, 669, 30, 45),
|
||||
new Dessert('Donut with milk', 555, 27.4, 63, 12.9, 433, 32, 22),
|
||||
new Dessert('KitKat with milk', 621, 28.4, 77, 15.0, 161, 42, 6),
|
||||
|
||||
new Desert('Coconut slice and frozen yogurt', 318, 21.0, 31, 5.5, 96, 14, 7),
|
||||
new Desert('Coconut slice and ice cream sandwich', 396, 24.0, 44, 5.8, 138, 8, 7),
|
||||
new Desert('Coconut slice and eclair', 421, 31.0, 31, 7.5, 346, 6, 13),
|
||||
new Desert('Coconut slice and cupcake', 464, 18.7, 74, 5.8, 422, 3, 14),
|
||||
new Desert('Coconut slice and gingerbread', 515, 31.0, 56, 5.4, 316, 7, 22),
|
||||
new Desert('Coconut slice and jelly bean', 534, 15.0, 101, 1.5, 59, 0, 6),
|
||||
new Desert('Coconut slice and lollipop', 551, 15.2, 105, 1.5, 47, 0, 8),
|
||||
new Desert('Coconut slice and honeycomb', 567, 18.2, 94, 8.0, 571, 0, 51),
|
||||
new Desert('Coconut slice and donut', 611, 40.0, 58, 6.4, 335, 2, 28),
|
||||
new Desert('Coconut slice and KitKat', 677, 41.0, 72, 8.5, 63, 12, 12),
|
||||
new Dessert('Coconut slice and frozen yogurt', 318, 21.0, 31, 5.5, 96, 14, 7),
|
||||
new Dessert('Coconut slice and ice cream sandwich', 396, 24.0, 44, 5.8, 138, 8, 7),
|
||||
new Dessert('Coconut slice and eclair', 421, 31.0, 31, 7.5, 346, 6, 13),
|
||||
new Dessert('Coconut slice and cupcake', 464, 18.7, 74, 5.8, 422, 3, 14),
|
||||
new Dessert('Coconut slice and gingerbread', 515, 31.0, 56, 5.4, 316, 7, 22),
|
||||
new Dessert('Coconut slice and jelly bean', 534, 15.0, 101, 1.5, 59, 0, 6),
|
||||
new Dessert('Coconut slice and lollipop', 551, 15.2, 105, 1.5, 47, 0, 8),
|
||||
new Dessert('Coconut slice and honeycomb', 567, 18.2, 94, 8.0, 571, 0, 51),
|
||||
new Dessert('Coconut slice and donut', 611, 40.0, 58, 6.4, 335, 2, 28),
|
||||
new Dessert('Coconut slice and KitKat', 677, 41.0, 72, 8.5, 63, 12, 12),
|
||||
];
|
||||
|
||||
void _sort<T>(Comparable<T> getField(Desert d), bool ascending) {
|
||||
_deserts.sort((Desert a, Desert b) {
|
||||
void _sort<T>(Comparable<T> getField(Dessert d), bool ascending) {
|
||||
_desserts.sort((Dessert a, Dessert b) {
|
||||
if (!ascending) {
|
||||
final Desert c = a;
|
||||
final Dessert c = a;
|
||||
a = b;
|
||||
b = c;
|
||||
}
|
||||
|
@ -96,35 +96,35 @@ class DesertDataSource extends DataTableSource {
|
|||
@override
|
||||
DataRow getRow(int index) {
|
||||
assert(index >= 0);
|
||||
if (index >= _deserts.length)
|
||||
if (index >= _desserts.length)
|
||||
return null;
|
||||
final Desert desert = _deserts[index];
|
||||
final Dessert dessert = _desserts[index];
|
||||
return new DataRow.byIndex(
|
||||
index: index,
|
||||
selected: desert.selected,
|
||||
selected: dessert.selected,
|
||||
onSelectChanged: (bool value) {
|
||||
if (desert.selected != value) {
|
||||
if (dessert.selected != value) {
|
||||
_selectedCount += value ? 1 : -1;
|
||||
assert(_selectedCount >= 0);
|
||||
desert.selected = value;
|
||||
dessert.selected = value;
|
||||
notifyListeners();
|
||||
}
|
||||
},
|
||||
cells: <DataCell>[
|
||||
new DataCell(new Text('${desert.name}')),
|
||||
new DataCell(new Text('${desert.calories}')),
|
||||
new DataCell(new Text('${desert.fat.toStringAsFixed(1)}')),
|
||||
new DataCell(new Text('${desert.carbs}')),
|
||||
new DataCell(new Text('${desert.protein.toStringAsFixed(1)}')),
|
||||
new DataCell(new Text('${desert.sodium}')),
|
||||
new DataCell(new Text('${desert.calcium}%')),
|
||||
new DataCell(new Text('${desert.iron}%')),
|
||||
new DataCell(new Text('${dessert.name}')),
|
||||
new DataCell(new Text('${dessert.calories}')),
|
||||
new DataCell(new Text('${dessert.fat.toStringAsFixed(1)}')),
|
||||
new DataCell(new Text('${dessert.carbs}')),
|
||||
new DataCell(new Text('${dessert.protein.toStringAsFixed(1)}')),
|
||||
new DataCell(new Text('${dessert.sodium}')),
|
||||
new DataCell(new Text('${dessert.calcium}%')),
|
||||
new DataCell(new Text('${dessert.iron}%')),
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
int get rowCount => _deserts.length;
|
||||
int get rowCount => _desserts.length;
|
||||
|
||||
@override
|
||||
bool get isRowCountApproximate => false;
|
||||
|
@ -133,9 +133,9 @@ class DesertDataSource extends DataTableSource {
|
|||
int get selectedRowCount => _selectedCount;
|
||||
|
||||
void _selectAll(bool checked) {
|
||||
for (Desert desert in _deserts)
|
||||
desert.selected = checked;
|
||||
_selectedCount = checked ? _deserts.length : 0;
|
||||
for (Dessert dessert in _desserts)
|
||||
dessert.selected = checked;
|
||||
_selectedCount = checked ? _desserts.length : 0;
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
@ -151,10 +151,10 @@ class _DataTableDemoState extends State<DataTableDemo> {
|
|||
int _rowsPerPage = PaginatedDataTable.defaultRowsPerPage;
|
||||
int _sortColumnIndex;
|
||||
bool _sortAscending = true;
|
||||
DesertDataSource _desertsDataSource = new DesertDataSource();
|
||||
DessertDataSource _dessertsDataSource = new DessertDataSource();
|
||||
|
||||
void _sort<T>(Comparable<T> getField(Desert d), int columnIndex, bool ascending) {
|
||||
_desertsDataSource._sort<T>(getField, ascending);
|
||||
void _sort<T>(Comparable<T> getField(Dessert d), int columnIndex, bool ascending) {
|
||||
_dessertsDataSource._sort<T>(getField, ascending);
|
||||
setState(() {
|
||||
_sortColumnIndex = columnIndex;
|
||||
_sortAscending = ascending;
|
||||
|
@ -174,51 +174,51 @@ class _DataTableDemoState extends State<DataTableDemo> {
|
|||
onRowsPerPageChanged: (int value) { setState(() { _rowsPerPage = value; }); },
|
||||
sortColumnIndex: _sortColumnIndex,
|
||||
sortAscending: _sortAscending,
|
||||
onSelectAll: _desertsDataSource._selectAll,
|
||||
onSelectAll: _dessertsDataSource._selectAll,
|
||||
columns: <DataColumn>[
|
||||
new DataColumn(
|
||||
label: new Text('Dessert (100g serving)'),
|
||||
onSort: (int columnIndex, bool ascending) => _sort<String>((Desert d) => d.name, columnIndex, ascending)
|
||||
onSort: (int columnIndex, bool ascending) => _sort<String>((Dessert d) => d.name, columnIndex, ascending)
|
||||
),
|
||||
new DataColumn(
|
||||
label: new Text('Calories'),
|
||||
tooltip: 'The total amount of food energy in the given serving size.',
|
||||
numeric: true,
|
||||
onSort: (int columnIndex, bool ascending) => _sort<num>((Desert d) => d.calories, columnIndex, ascending)
|
||||
onSort: (int columnIndex, bool ascending) => _sort<num>((Dessert d) => d.calories, columnIndex, ascending)
|
||||
),
|
||||
new DataColumn(
|
||||
label: new Text('Fat (g)'),
|
||||
numeric: true,
|
||||
onSort: (int columnIndex, bool ascending) => _sort<num>((Desert d) => d.fat, columnIndex, ascending)
|
||||
onSort: (int columnIndex, bool ascending) => _sort<num>((Dessert d) => d.fat, columnIndex, ascending)
|
||||
),
|
||||
new DataColumn(
|
||||
label: new Text('Carbs (g)'),
|
||||
numeric: true,
|
||||
onSort: (int columnIndex, bool ascending) => _sort<num>((Desert d) => d.carbs, columnIndex, ascending)
|
||||
onSort: (int columnIndex, bool ascending) => _sort<num>((Dessert d) => d.carbs, columnIndex, ascending)
|
||||
),
|
||||
new DataColumn(
|
||||
label: new Text('Protein (g)'),
|
||||
numeric: true,
|
||||
onSort: (int columnIndex, bool ascending) => _sort<num>((Desert d) => d.protein, columnIndex, ascending)
|
||||
onSort: (int columnIndex, bool ascending) => _sort<num>((Dessert d) => d.protein, columnIndex, ascending)
|
||||
),
|
||||
new DataColumn(
|
||||
label: new Text('Sodium (mg)'),
|
||||
numeric: true,
|
||||
onSort: (int columnIndex, bool ascending) => _sort<num>((Desert d) => d.sodium, columnIndex, ascending)
|
||||
onSort: (int columnIndex, bool ascending) => _sort<num>((Dessert d) => d.sodium, columnIndex, ascending)
|
||||
),
|
||||
new DataColumn(
|
||||
label: new Text('Calcium (%)'),
|
||||
tooltip: 'The amount of calcium as a percentage of the recommended daily amount.',
|
||||
numeric: true,
|
||||
onSort: (int columnIndex, bool ascending) => _sort<num>((Desert d) => d.calcium, columnIndex, ascending)
|
||||
onSort: (int columnIndex, bool ascending) => _sort<num>((Dessert d) => d.calcium, columnIndex, ascending)
|
||||
),
|
||||
new DataColumn(
|
||||
label: new Text('Iron (%)'),
|
||||
numeric: true,
|
||||
onSort: (int columnIndex, bool ascending) => _sort<num>((Desert d) => d.iron, columnIndex, ascending)
|
||||
onSort: (int columnIndex, bool ascending) => _sort<num>((Dessert d) => d.iron, columnIndex, ascending)
|
||||
),
|
||||
],
|
||||
source: _desertsDataSource
|
||||
source: _dessertsDataSource
|
||||
)
|
||||
]
|
||||
)
|
||||
|
|
|
@ -219,10 +219,11 @@ class DataCell {
|
|||
///
|
||||
/// See also:
|
||||
///
|
||||
/// * [DataColumn]
|
||||
/// * [DataRow]
|
||||
/// * [DataCell]
|
||||
/// * [PaginatedDataTable]
|
||||
/// * [DataColumn], which describes a column in the data table.
|
||||
/// * [DataRow], which contains the data for a row in the data table.
|
||||
/// * [DataCell], which contains the data for a single cell in the data table.
|
||||
/// * [PaginatedDataTable], which shows part of the data in a data table and
|
||||
/// provides controls for paging through the remainder of the data.
|
||||
/// * <https://material.google.com/components/data-tables.html>
|
||||
class DataTable extends StatelessWidget {
|
||||
/// Creates a widget describing a data table.
|
||||
|
|
|
@ -22,8 +22,18 @@ import 'icons.dart';
|
|||
import 'progress_indicator.dart';
|
||||
import 'theme.dart';
|
||||
|
||||
/// A wrapper for [DataTable] that obtains data lazily from a [DataTableSource]
|
||||
/// and displays it one page at a time. The widget is presented as a [Card].
|
||||
/// A material design data table that shows data using multiple pages.
|
||||
///
|
||||
/// A paginated data table shows [rowsPerPage] rows of data per page and
|
||||
/// provies controls for showing other pages.
|
||||
///
|
||||
/// Data is read lazily from from a [DataTableSource]. The widget is presented
|
||||
/// as a [Card].
|
||||
///
|
||||
/// See also:
|
||||
///
|
||||
/// * [DataTable], which is not paginated.
|
||||
/// * <https://material.io/guidelines/components/data-tables.html#data-tables-tables-within-cards>
|
||||
class PaginatedDataTable extends StatefulWidget {
|
||||
/// Creates a widget describing a paginated [DataTable] on a [Card].
|
||||
///
|
||||
|
|
125
packages/flutter/test/material/data_table_test.dart
Normal file
125
packages/flutter/test/material/data_table_test.dart
Normal file
|
@ -0,0 +1,125 @@
|
|||
// Copyright 2017 The Chromium 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';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
|
||||
class Dessert {
|
||||
Dessert(this.name, this.calories, this.fat, this.carbs, this.protein, this.sodium, this.calcium, this.iron);
|
||||
|
||||
final String name;
|
||||
final int calories;
|
||||
final double fat;
|
||||
final int carbs;
|
||||
final double protein;
|
||||
final int sodium;
|
||||
final int calcium;
|
||||
final int iron;
|
||||
}
|
||||
|
||||
final List<Dessert> kDesserts = <Dessert>[
|
||||
new Dessert('Frozen yogurt', 159, 6.0, 24, 4.0, 87, 14, 1),
|
||||
new Dessert('Ice cream sandwich', 237, 9.0, 37, 4.3, 129, 8, 1),
|
||||
new Dessert('Eclair', 262, 16.0, 24, 6.0, 337, 6, 7),
|
||||
new Dessert('Cupcake', 305, 3.7, 67, 4.3, 413, 3, 8),
|
||||
new Dessert('Gingerbread', 356, 16.0, 49, 3.9, 327, 7, 16),
|
||||
new Dessert('Jelly bean', 375, 0.0, 94, 0.0, 50, 0, 0),
|
||||
new Dessert('Lollipop', 392, 0.2, 98, 0.0, 38, 0, 2),
|
||||
new Dessert('Honeycomb', 408, 3.2, 87, 6.5, 562, 0, 45),
|
||||
new Dessert('Donut', 452, 25.0, 51, 4.9, 326, 2, 22),
|
||||
new Dessert('KitKat', 518, 26.0, 65, 7.0, 54, 12, 6),
|
||||
];
|
||||
|
||||
void main() {
|
||||
testWidgets('DataTable control test', (WidgetTester tester) async {
|
||||
List<String> log = <String>[];
|
||||
|
||||
Widget buildTable({ int sortColumnIndex, bool sortAscending: true }) {
|
||||
return new DataTable(
|
||||
sortColumnIndex: sortColumnIndex,
|
||||
sortAscending: sortAscending,
|
||||
onSelectAll: (bool value) {
|
||||
log.add('select-all: $value');
|
||||
},
|
||||
columns: <DataColumn>[
|
||||
new DataColumn(
|
||||
label: new Text('Name'),
|
||||
tooltip: 'Name',
|
||||
),
|
||||
new DataColumn(
|
||||
label: new Text('Calories'),
|
||||
tooltip: 'Calories',
|
||||
numeric: true,
|
||||
onSort: (int columnIndex, bool ascending) {
|
||||
log.add('column-sort: $columnIndex $ascending');
|
||||
}
|
||||
),
|
||||
],
|
||||
rows: kDesserts.map((Dessert dessert) {
|
||||
return new DataRow(
|
||||
key: new Key(dessert.name),
|
||||
onSelectChanged: (bool selected) {
|
||||
log.add('row-selected: ${dessert.name}');
|
||||
},
|
||||
cells: <DataCell>[
|
||||
new DataCell(
|
||||
new Text(dessert.name),
|
||||
),
|
||||
new DataCell(
|
||||
new Text('${dessert.calories}'),
|
||||
showEditIcon: true,
|
||||
onTap: () {
|
||||
log.add('cell-tap: ${dessert.calories}');
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
}).toList(),
|
||||
);
|
||||
}
|
||||
|
||||
await tester.pumpWidget(new MaterialApp(
|
||||
home: new Material(child: buildTable())
|
||||
));
|
||||
|
||||
await tester.tap(find.byType(Checkbox).first);
|
||||
|
||||
expect(log, <String>['select-all: true']);
|
||||
log.clear();
|
||||
|
||||
await tester.tap(find.text('Cupcake'));
|
||||
|
||||
expect(log, <String>['row-selected: Cupcake']);
|
||||
log.clear();
|
||||
|
||||
await tester.tap(find.text('Calories'));
|
||||
|
||||
expect(log, <String>['column-sort: 1 true']);
|
||||
log.clear();
|
||||
|
||||
await tester.pumpWidget(new MaterialApp(
|
||||
home: new Material(child: buildTable(sortColumnIndex: 1))
|
||||
));
|
||||
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 200));
|
||||
await tester.tap(find.text('Calories'));
|
||||
|
||||
expect(log, <String>['column-sort: 1 false']);
|
||||
log.clear();
|
||||
|
||||
await tester.pumpWidget(new MaterialApp(
|
||||
home: new Material(child: buildTable(sortColumnIndex: 1, sortAscending: false))
|
||||
));
|
||||
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 200));
|
||||
|
||||
await tester.tap(find.text('375'));
|
||||
|
||||
expect(log, <String>['cell-tap: 375']);
|
||||
log.clear();
|
||||
|
||||
await tester.tap(find.byType(Checkbox).last);
|
||||
|
||||
expect(log, <String>['row-selected: KitKat']);
|
||||
log.clear();
|
||||
});
|
||||
}
|
Loading…
Reference in a new issue