回答編集履歴

1

なるべく元のコードを残した実装を追記

2020/09/13 12:37

投稿

nskhei
nskhei

スコア704

test CHANGED
@@ -68,7 +68,7 @@
68
68
 
69
69
 
70
70
 
71
- Future<List<Map<String, dynamic>>> stuffs; // 取得したデータを保持するための変数
71
+ Future<List<Map<String, dynamic>>> staffs; // 取得したデータを保持するための変数
72
72
 
73
73
 
74
74
 
@@ -78,13 +78,13 @@
78
78
 
79
79
  super.initState();
80
80
 
81
- stuffs = _loadStuffData(); // データ取得開始
81
+ stuffs = _loadStaffData(); // データ取得開始
82
-
82
+
83
- }
83
+ }
84
-
85
-
86
-
84
+
85
+
86
+
87
- Future<List<Map<String, dynamic>>> _loadStuffData() async {
87
+ Future<List<Map<String, dynamic>>> _loadStaffData() async {
88
88
 
89
89
  return sampleData; // 実際はDBからデータを取得して返す
90
90
 
@@ -110,7 +110,7 @@
110
110
 
111
111
  child: FutureBuilder<List<Map<String, dynamic>>>(
112
112
 
113
- future: stuffs,
113
+ future: staffs,
114
114
 
115
115
  builder: (context, snapshot) {
116
116
 
@@ -118,7 +118,7 @@
118
118
 
119
119
  if (!snapshot.hasData) {
120
120
 
121
- return StuffListPlaceHolder();
121
+ return StaffListPlaceHolder();
122
122
 
123
123
  }
124
124
 
@@ -148,7 +148,7 @@
148
148
 
149
149
  // データが取得できるまでのプレースホルダー。
150
150
 
151
- class StuffListPlaceHolder extends StatelessWidget {
151
+ class StaffListPlaceHolder extends StatelessWidget {
152
152
 
153
153
  @override
154
154
 
@@ -191,3 +191,345 @@
191
191
  あとはこの辺のパッケージを使うと見た目も良い感じになるかもしれません。
192
192
 
193
193
  * [https://pub.dev/packages/shimmer](https://pub.dev/packages/shimmer)
194
+
195
+
196
+
197
+ ---
198
+
199
+
200
+
201
+ **追記**
202
+
203
+
204
+
205
+ 上記の回答は手元で考えてみたのをそのまま貼ったので、元のコードから離れすぎてて、あまり参考にならないかもしれません。
206
+
207
+ なるべく最小限の修正 + setStateだけで、それっぽいコード書いたので、こっち参考にしてください。
208
+
209
+
210
+
211
+ ```dart
212
+
213
+ class ListViewHorizonCast extends StatefulWidget {
214
+
215
+ @override
216
+
217
+ _ListViewHorizonCastState createState() => _ListViewHorizonCastState();
218
+
219
+ }
220
+
221
+
222
+
223
+ class _ListViewHorizonCastState extends State<ListViewHorizonCast> {
224
+
225
+ List<Map<String, dynamic>> listItems;
226
+
227
+
228
+
229
+ @override
230
+
231
+ void didChangeDependencies() {
232
+
233
+ super.didChangeDependencies();
234
+
235
+ if (listItems == null) {
236
+
237
+ _loadData();
238
+
239
+ }
240
+
241
+ }
242
+
243
+
244
+
245
+ Future<void> _loadData() async {
246
+
247
+ // データ取得に1秒かかった想定
248
+
249
+ await Future.delayed(Duration(seconds: 1));
250
+
251
+ setState(() {
252
+
253
+ listItems = [
254
+
255
+ {
256
+
257
+ 'name': '山本太郎',
258
+
259
+ 'img': '../assets/images/sample.jpg',
260
+
261
+ 'comment': 'ここに一言入ります',
262
+
263
+ 'age': '22' + '歳',
264
+
265
+ },
266
+
267
+ {
268
+
269
+ 'name': '山本花子',
270
+
271
+ 'img': '../assets/images/sample.jpg',
272
+
273
+ 'comment': 'ここに一言入ります',
274
+
275
+ 'age': '22' + '歳',
276
+
277
+ },
278
+
279
+ {
280
+
281
+ 'name': '田中花子',
282
+
283
+ 'img': '../assets/images/sample.jpg',
284
+
285
+ 'comment': 'ここに一言入ります',
286
+
287
+ 'age': '22' + '歳',
288
+
289
+ },
290
+
291
+ ];
292
+
293
+ });
294
+
295
+ }
296
+
297
+
298
+
299
+ @override
300
+
301
+ Widget build(BuildContext context) {
302
+
303
+ return Container(
304
+
305
+ color: Colors.white,
306
+
307
+ margin: EdgeInsets.only(top: 10.0),
308
+
309
+ padding: EdgeInsets.symmetric(
310
+
311
+ horizontal: Settings().sidePadding(),
312
+
313
+ vertical: 20,
314
+
315
+ ),
316
+
317
+ child: Column(
318
+
319
+ children: <Widget>[
320
+
321
+ //タイトル
322
+
323
+ Container(
324
+
325
+ width: double.infinity,
326
+
327
+ margin: EdgeInsets.only(top: 0.0, bottom: 0.0),
328
+
329
+ height: 30,
330
+
331
+ child: Text(
332
+
333
+ 'スタッフ一覧',
334
+
335
+ style: Settings.fontTitleStyle,
336
+
337
+ textAlign: TextAlign.left,
338
+
339
+ ),
340
+
341
+ ),
342
+
343
+ //カードリスト
344
+
345
+ Container(
346
+
347
+ height: 200,
348
+
349
+ padding: EdgeInsets.only(bottom: 15.0),
350
+
351
+ child: ListView.builder(
352
+
353
+ scrollDirection: Axis.horizontal,
354
+
355
+ itemCount: listItems?.length ?? 3,
356
+
357
+ itemBuilder: (context, index) {
358
+
359
+ //カード
360
+
361
+ return FlatButton(
362
+
363
+ child: SizedBox(
364
+
365
+ width: 150,
366
+
367
+ child: Card(
368
+
369
+ child: Stack(
370
+
371
+ fit: StackFit.expand,
372
+
373
+ children: <Widget>[
374
+
375
+ listItems == null
376
+
377
+ //グレーアウト
378
+
379
+ ? Container(color: Colors.grey[200])
380
+
381
+ //スタッフの写真
382
+
383
+ : Container(
384
+
385
+ child: Container(
386
+
387
+ decoration: BoxDecoration(
388
+
389
+ image: DecorationImage(
390
+
391
+ image: AssetImage(
392
+
393
+ '../assets/images/sample.jpg',
394
+
395
+ ),
396
+
397
+ fit: BoxFit.cover,
398
+
399
+ ),
400
+
401
+ ),
402
+
403
+ child: Container(
404
+
405
+ decoration: BoxDecoration(
406
+
407
+ gradient: LinearGradient(
408
+
409
+ begin: Alignment.topCenter,
410
+
411
+ end: Alignment.bottomCenter,
412
+
413
+ stops: [0.5, 0.75, 0.95],
414
+
415
+ colors: [
416
+
417
+ Colors.black12,
418
+
419
+ Colors.black54,
420
+
421
+ Colors.black87,
422
+
423
+ ],
424
+
425
+ ),
426
+
427
+ ),
428
+
429
+ ),
430
+
431
+ ),
432
+
433
+ ),
434
+
435
+ //スタッフの名前
436
+
437
+ Positioned(
438
+
439
+ bottom: 25.0,
440
+
441
+ left: 5.0,
442
+
443
+ child: Text(
444
+
445
+ listItems != null ? listItems[index]['name'] : '',
446
+
447
+ style: TextStyle(
448
+
449
+ color: Colors.white,
450
+
451
+ fontSize: 14,
452
+
453
+ fontWeight: FontWeight.bold,
454
+
455
+ ),
456
+
457
+ ),
458
+
459
+ ),
460
+
461
+ //スタッフの一言
462
+
463
+ Positioned(
464
+
465
+ bottom: 8.0,
466
+
467
+ left: 5.0,
468
+
469
+ child: Text(
470
+
471
+ listItems != null
472
+
473
+ ? listItems[index]['comment']
474
+
475
+ : '',
476
+
477
+ style: TextStyle(
478
+
479
+ color: Colors.white70,
480
+
481
+ fontSize: 11,
482
+
483
+ ),
484
+
485
+ ),
486
+
487
+ ),
488
+
489
+ ],
490
+
491
+ ),
492
+
493
+ ),
494
+
495
+ ),
496
+
497
+ onPressed: () {
498
+
499
+ if (listItems != null) {
500
+
501
+ Navigator.push(
502
+
503
+ context,
504
+
505
+ MaterialPageRoute(
506
+
507
+ builder: (context) => CastProfileDetail(),
508
+
509
+ ),
510
+
511
+ );
512
+
513
+ }
514
+
515
+ },
516
+
517
+ );
518
+
519
+ },
520
+
521
+ ),
522
+
523
+ ),
524
+
525
+ ],
526
+
527
+ ),
528
+
529
+ );
530
+
531
+ }
532
+
533
+ }
534
+
535
+ ```