質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

Q&A

解決済

1回答

4268閲覧

flutterでGridViewのitemをタップして、そのitemに発火させたい

Yariii

総合スコア61

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

0グッド

0クリップ

投稿2020/09/19 06:12

編集2020/09/19 07:38

FlutterでGridviewを使ってリスト表示させています。
それぞれアイテムはGestureDetectorで囲って「ontap」でクリックイベントを発火させるのですが、
現状タップした時に、全てのアイテムに発火してしまいます。
(コードを見直せば、そりゃそうだよなって理解はあるのですが...)

bool checked = false; void _checked() { setState(() { checked = true; }); } void _unchecked() { this.setState(() { checked = false; }); } Widget recommendFromFamily() { return Container( margin: EdgeInsets.only(top: 10.0), child: Column( children: <Widget>[ //アイテムリスト GridView.builder( shrinkWrap: true, gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 2, childAspectRatio: 0.8, mainAxisSpacing: 4.0, crossAxisSpacing: 4.0, ), itemCount: castsItems?.length ?? 3, itemBuilder: (BuildContext context, int index) { child: GestureDetector( checked == false ? Center( child: Text( 'チェックする', style: TextStyle( height: 2.3, color: Colors.amber, fontSize: 12, fontWeight: FontWeight.bold, ), textAlign: TextAlign.center, ), ) : Center( child: Text( 'チェック取り消す', style: TextStyle( height: 2.3, color: Colors.black87, fontSize: 12, fontWeight: FontWeight.bold, ), textAlign: TextAlign.center, ), )            onTap: () { castId = index; print(index); if (checked == true) { _checked(); } else if (checked == true) { _unchecked(); } }, ), }, ), ], ), ); }

これを、タップした要素のみにSetStateを制御したいのですが、それを実現するにはどのようにするのでしょう?
ご教授よろしくお願いいたします。

追記 9/19 16:37
onTapの条件分岐コードに関係のないものが混じっていたので修正しました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

はじめに、チェックされている要素を格納するための配列を用意します。

diff

1- bool checked = false; 2+ final List<int> checkedList = [];

次に、

  • チェックする時は、この配列に入れる
  • チェックを外す時は、この配列から取り除く

ようにします。

dart

1 void _check(int index) { 2 setState(() { 3 checkedList.add(index); 4 }); 5 } 6 7 void _uncheck(int index) { 8 this.setState(() { 9 checkedList.remove(index); 10 }); 11 }

「ある要素が選択されているかどうか」は、以下のようにcontainsを使って判定することができます。

dart

1itemBuilder: (BuildContext context, int index) { 2 final bool checked = checkedList.contains(index);

最後に、質問のコードに最小限の修正を加えたコードを貼っておきます。

dart

1 2 int castId = 0; 3 4 // チェックされたものを格納するための配列 5 final List<int> checkedList = []; 6 7 void _checked(int index) { 8 setState(() { 9 checkedList.add(index); 10 }); 11 } 12 13 void _unchecked(int index) { 14 setState(() { 15 checkedList.remove(index); 16 }); 17 } 18 19 Widget recommendFromFamily() { 20 return Container( 21 margin: EdgeInsets.only(top: 10.0), 22 child: Column( 23 children: <Widget>[ 24 //アイテムリスト 25 GridView.builder( 26 shrinkWrap: true, 27 gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( 28 crossAxisCount: 2, 29 childAspectRatio: 0.8, 30 mainAxisSpacing: 4.0, 31 crossAxisSpacing: 4.0, 32 ), 33 itemCount: castsItems?.length ?? 3, 34 itemBuilder: (BuildContext context, int index) { 35 // ここで要素ごとにチェックされているか判定 36 final bool checked = checkedList.contains(index); 37 return GestureDetector( 38 child: checked == false 39 ? Center( 40 child: Text( 41 'チェックする', 42 style: TextStyle( 43 height: 2.3, 44 color: Colors.amber, 45 fontSize: 12, 46 fontWeight: FontWeight.bold, 47 ), 48 textAlign: TextAlign.center, 49 ), 50 ) 51 : Center( 52 child: Text( 53 'チェック取り消す', 54 style: TextStyle( 55 height: 2.3, 56 color: Colors.black87, 57 fontSize: 12, 58 fontWeight: FontWeight.bold, 59 ), 60 textAlign: TextAlign.center, 61 ), 62 ), 63 onTap: () { 64 castId = index; 65 print(index); 66 if (checked) { 67 _unchecked(index); 68 } else { 69 _checked(index); 70 } 71 }, 72 ); 73 }, 74 ), 75 ], 76 ), 77 ); 78 } 79

投稿2020/09/19 08:17

nskhei

総合スコア704

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yariii

2020/09/19 09:28

できました!配列に出し入れして判定するのですか。知見が広がりました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問