-
Notifications
You must be signed in to change notification settings - Fork 1
/
kana_list.dart
129 lines (116 loc) · 4.32 KB
/
kana_list.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
122
123
124
125
126
127
128
129
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:kana_to_kanji/src/core/models/kana.dart';
import 'package:kana_to_kanji/src/glossary/widgets/kana_list_tile.dart';
const _mainKanaLastId = 46;
const _dakutenLastId = 71;
const _emptyTiles = [44, 45, 46, 37, 36];
class KanaList extends StatefulWidget {
/// List of Kana.
/// Required the entire kana list of the alphabet (107 kanas) otherwise a loading screen
/// will be shown.
final List<({Kana kana, bool disabled})> items;
const KanaList({super.key, required this.items});
@override
State<KanaList> createState() => _KanaListState();
}
class _KanaListState extends State<KanaList> {
final _scrollToWidgetKey = GlobalKey(debugLabel: "kana_list_scroll_to_widget_key");
void _onPressed(Kana kana, BuildContext context) {
ScaffoldMessenger.of(context).clearSnackBars();
ScaffoldMessenger.of(context)
.showSnackBar(SnackBar(content: Text("Kana: ${kana.kana} tapped")));
}
@override
void didUpdateWidget(KanaList oldWidget) {
super.didUpdateWidget(oldWidget);
if (_scrollToWidgetKey.currentContext != null) {
WidgetsBinding.instance.addPostFrameCallback((_) {
Scrollable.ensureVisible(
_scrollToWidgetKey.currentContext!,
duration: const Duration(milliseconds: 400),
curve: Curves.easeInOut,
);
});
}
}
@override
Widget build(BuildContext context) {
final AppLocalizations l10n = AppLocalizations.of(context);
final scrollToIndex =
widget.items.indexWhere((element) => !element.disabled);
if (widget.items.isEmpty) {
return Center(child: Text(l10n.nothing_to_show));
}
final sectionTextStyle = Theme.of(context).textTheme.titleLarge;
const cleanTile = Card(elevation: 0);
final List<Widget> main = widget.items
.sublist(0, _mainKanaLastId)
.map<Widget>((item) => KanaListTile(
item.kana,
key: item.kana.id == scrollToIndex ? _scrollToWidgetKey : null,
disabled: item.disabled,
onPressed: () => _onPressed(item.kana, context),
))
.toList();
for (int id in _emptyTiles) {
main.insert(id, cleanTile);
}
final List<Widget> dakuten = widget.items
.sublist(_mainKanaLastId, _dakutenLastId)
.map<Widget>((item) => KanaListTile(item.kana,
key: item.kana.id == scrollToIndex ? _scrollToWidgetKey : null,
disabled: item.disabled,
onPressed: () => _onPressed(item.kana, context)))
.toList();
final List<Widget> combination = widget.items
.sublist(_dakutenLastId)
.map<Widget>((item) => KanaListTile(item.kana,
key: item.kana.id == scrollToIndex ? _scrollToWidgetKey : null,
disabled: item.disabled,
onPressed: () => _onPressed(item.kana, context)))
.toList();
return SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
GridView.count(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
crossAxisCount: 5,
children: main,
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Text(l10n.dakuten_kana, style: sectionTextStyle),
),
const Padding(
padding: EdgeInsets.only(bottom: 8.0),
child: Divider(height: 0, endIndent: 150),
),
GridView.count(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
crossAxisCount: 5,
children: dakuten,
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Text(l10n.combination_kana, style: sectionTextStyle),
),
const Padding(
padding: EdgeInsets.only(bottom: 8.0),
child: Divider(height: 0, endIndent: 150),
),
GridView.count(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
crossAxisCount: 3,
childAspectRatio: 1.8,
children: combination,
),
]));
}
}