-
Notifications
You must be signed in to change notification settings - Fork 0
/
web_data_table_sample.dart
121 lines (118 loc) · 4.68 KB
/
web_data_table_sample.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import 'package:flutter/material.dart';
import 'package:flutter_datatable/controller/article_controller.dart';
import 'package:flutter_datatable/controller/web_datatable_controller.dart';
import 'package:flutter_datatable/domain/model/article/article.dart';
import 'package:flutter_datatable/utile/datatime_convert.dart';
import 'package:flutter_datatable/widget/drawer_menu.dart';
import 'package:flutter_web_data_table/web_data_table.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:intl/intl.dart';
class WebDataTableSample extends ConsumerWidget {
const WebDataTableSample({super.key});
static const route = '/sample/webDatatable';
static const title = 'web_data_table';
@override
Widget build(BuildContext context, WidgetRef ref) {
final articleListAsnc = ref.watch(articleListProvider);
return Scaffold(
appBar: AppBar(
title: const Text(title),
),
// 画面切り替え用
drawer: const DrawerMenu(),
body: articleListAsnc.when(
loading: () => const CircularProgressIndicator(),
error: (err, stack) => Center(
child: Text(err.toString()),
),
data: (articleList) {
final webDataTableState = ref.watch(webDataTableStateProvider);
final webDataTableNotifier =
ref.watch(webDataTableStateProvider.notifier);
return Padding(
padding: const EdgeInsets.only(
top: 20,
left: 20,
right: 20,
),
child: WebDataTable(
header: Container(),
source: WebDataTableSource(
sortColumnName: webDataTableState.sortColumnName,
sortAscending: webDataTableState.sortAscending,
// 一律で表示方法などを制御できる。
columns: <WebDataColumn>[
WebDataColumn(
// key名も直で指定する。
name: 'id',
label: const Text('id'),
// ここがdynamicなのが微妙かも
dataCell: (dynamic value) => DataCell(
Text('$value'),
),
),
WebDataColumn(
name: 'title',
label: const Text('タイトル'),
dataCell: (dynamic value) => DataCell(
Text('$value'),
),
),
WebDataColumn(
name: 'createdAt',
label: const Text('作成日時'),
// ここがdynamicなのが微妙かも
dataCell: (dynamic value) {
// 表示日付の変換
final createdAt =
const DatetimeConverter().fromJson(value as String);
return DataCell(
Text(
DateFormat.yMMMMd().add_jms().format(createdAt),
),
);
},
),
WebDataColumn(
name: 'updatedAt',
label: const Text('更新日時'),
// ここがdynamicなのが微妙かも
dataCell: (dynamic value) {
// 表示日付の変換
final createdAt =
const DatetimeConverter().fromJson(value as String);
return DataCell(
Text(
DateFormat.yMMMMd().add_jms().format(createdAt),
),
);
},
),
],
// Map<String, dynamic>型で指定する必要がある。
rows: articleList.map((article) => article.toJson()).toList(),
// 個人的にはここは直感的で実装はしやすかった。
onTapRow: (rows, index) {
final article = Article.fromJson(rows[index]);
showDialog<void>(
context: context,
builder: (context) {
return AlertDialog(
title: const Text('選択した行のデータ'),
content: Text(article.toString()),
);
},
);
},
),
onSort: (columnName, ascending) => webDataTableNotifier.onSort(
columnName: columnName,
ascending: ascending,
),
),
);
},
),
);
}
}