回答編集履歴

2

クラスで扱う例を追記

2020/09/17 13:44

投稿

nskhei
nskhei

スコア704

test CHANGED
@@ -33,3 +33,237 @@
33
33
  }
34
34
 
35
35
  ```
36
+
37
+
38
+
39
+ また、根本的な問題になりますが、このようなネストしたデータは、クラスに変換して扱った方が良いです。
40
+
41
+
42
+
43
+ どんなアプリを作っているか分からないので大体の雰囲気だけ示すと、以下のような感じです。
44
+
45
+
46
+
47
+ ```dart
48
+
49
+
50
+
51
+ // ユーザーを表すクラス
52
+
53
+ class User {
54
+
55
+ final String key;
56
+
57
+ final String name;
58
+
59
+ final Sex sex;
60
+
61
+ final List<WeightData> weightHistory;
62
+
63
+
64
+
65
+ User({
66
+
67
+ this.key,
68
+
69
+ this.name,
70
+
71
+ this.sex,
72
+
73
+ this.weightHistory,
74
+
75
+ });
76
+
77
+ }
78
+
79
+
80
+
81
+ // 体重データを表すクラス
82
+
83
+ class WeightData {
84
+
85
+ final double value;
86
+
87
+ final DateTime date;
88
+
89
+
90
+
91
+ WeightData({
92
+
93
+ this.value,
94
+
95
+ this.date,
96
+
97
+ });
98
+
99
+ }
100
+
101
+
102
+
103
+ // 性別を表すEnum
104
+
105
+ enum Sex {
106
+
107
+ Male,
108
+
109
+ Female,
110
+
111
+ Unknown,
112
+
113
+ }
114
+
115
+
116
+
117
+ // これらを使うと、データはこんな感じで表現できる
118
+
119
+ final List<User> allData = [
120
+
121
+ User(
122
+
123
+ key: '1',
124
+
125
+ name: 'Jim',
126
+
127
+ sex: Sex.Male,
128
+
129
+ weightHistory: [
130
+
131
+ WeightData(
132
+
133
+ date: DateTime(2020, 8, 25),
134
+
135
+ value: 5.1,
136
+
137
+ ),
138
+
139
+ WeightData(
140
+
141
+ date: DateTime(2020, 8, 26),
142
+
143
+ value: 5.4,
144
+
145
+ ),
146
+
147
+ ],
148
+
149
+ ),
150
+
151
+ User(
152
+
153
+ key: '2',
154
+
155
+ name: 'Tom',
156
+
157
+ sex: Sex.Male,
158
+
159
+ weightHistory: [
160
+
161
+ WeightData(
162
+
163
+ date: DateTime(2020, 8, 25),
164
+
165
+ value: 5.1,
166
+
167
+ ),
168
+
169
+ WeightData(
170
+
171
+ date: DateTime(2020, 8, 26),
172
+
173
+ value: 5.4,
174
+
175
+ ),
176
+
177
+ ],
178
+
179
+ ),
180
+
181
+ ];
182
+
183
+
184
+
185
+ // 実際の使用例
186
+
187
+ class ExamplePage extends StatefulWidget {
188
+
189
+ final String name;
190
+
191
+
192
+
193
+ const ExamplePage({
194
+
195
+ Key key,
196
+
197
+ @required this.name,
198
+
199
+ }) : super(key: key);
200
+
201
+
202
+
203
+ @override
204
+
205
+ _ExamplePageState createState() => _ExamplePageState();
206
+
207
+ }
208
+
209
+
210
+
211
+ class _ExamplePageState extends State<ExamplePage> {
212
+
213
+ List<DataPoint<DateTime>> data;
214
+
215
+
216
+
217
+ @override
218
+
219
+ void initState() {
220
+
221
+ super.initState();
222
+
223
+ this.data = allData
224
+
225
+ .where((user) => user.name == widget.name)
226
+
227
+ .map((user) => user.weightHistory)
228
+
229
+ .expand((data) => data)
230
+
231
+ .map(
232
+
233
+ (data) => DataPoint<DateTime>(
234
+
235
+ value: data.value,
236
+
237
+ xAxis: data.date,
238
+
239
+ ),
240
+
241
+ )
242
+
243
+ .toList();
244
+
245
+ }
246
+
247
+
248
+
249
+ @override
250
+
251
+ Widget build(BuildContext context) {
252
+
253
+ return Scaffold(
254
+
255
+ body: Center(
256
+
257
+ child: Text('${data[0]}'),
258
+
259
+ ),
260
+
261
+ );
262
+
263
+ }
264
+
265
+ }
266
+
267
+
268
+
269
+ ```

1

コード修正

2020/09/17 13:44

投稿

nskhei
nskhei

スコア704

test CHANGED
@@ -4,11 +4,15 @@
4
4
 
5
5
  ```dart
6
6
 
7
- final weightData =
7
+ for (int i = 0; i < allData.length; i++) {
8
8
 
9
- (allData[i]['data'] as Map<String, Map<String, Map>>)['weight'];
9
+ final info = allData[i]['data'] as Map<String, dynamic>;
10
+
11
+ if (info['name'] != widget.name) continue;
10
12
 
11
13
 
14
+
15
+ final weightData = info['weight'] as Map<String, Map>;
12
16
 
13
17
  for (var value in weightData.values) {
14
18
 
@@ -26,4 +30,6 @@
26
30
 
27
31
  }
28
32
 
33
+ }
34
+
29
35
  ```