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

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

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

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

Dart

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

Q&A

解決済

1回答

2173閲覧

Dartの無名関数の名前空間,FlutterのonTapの挙動について

takumi3

総合スコア18

Flutter

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

Dart

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

0グッド

0クリップ

投稿2020/04/20 17:31

編集2020/04/20 17:36

直下のコードを無名関数を使用しない形で書き換えてみました。二番目のコードです。無名関数を通常の関数を使って置き換えた形にしただけなのでコードの動作としては変わらないと思っていたのですが、contextindexは定義されていないというエラーが出ます。二つのコードは似て非なるものなのでしょうか?(無名関数の名前空間がキーポイントだとは思うのですが自分では解決できませんでした。)

Dart

1 Widget itemBuilder(BuildContext context, int index) { 2 return GestureDetector( 3 onTap: () => showDialog( 4 context: context, 5 builder: (context) => _dialogBuilder(context, _menus[index])), 6 child: Container(), 7 ); 8 }

Dart

1 Widget itemBuilder(BuildContext context, int index) { 2 return GestureDetector( 3 onTap: onTapFunc, 4 child: Container(), 5 ); 6 } 7 8 onTapFunc(){ 9 showDialog( 10 context: context, 11 builder: (context) => _dialogBuilder(context, _menus[index])); 12 }

また、onTapには引数を取らない関数しか渡せないので、無名関数を使わずに普通に関数を定義してしまうと、contextとindexを渡せず詰むことになるのでしょうか?
もう一点疑問があります。onTapは戻り値がvoidの関数を受け取るのですがshowDialog関数はFuture型のオブジェクト返すようですがなぜコンパイルエラーが発生しないのでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

同じようなところでつまづいており、以下などを参考にして解決しました。
https://stackoverflow.com/questions/50049683/flutter-gesturedetector-ontap-gets-triggered-automatically-how-to

onTapFunc()の引数でcontext, indexをとらず関数内でも定義していないので、contextindexは定義されていないというエラー

onTap:で指定する関数に直接onTapFunc()を入れるのではなく、() => onTapFunc()とすることで正しく呼び出せます。
onTap: onTapFuncではitemBuilderがビルドされる度にonTapFunc()が発火されてしまいます。onTap: () => onTapFunc()とすることで、タップの際に発火することになります。
そして、onTapFunc()で引数をとり、onTapFunc(context, index)としてあげれば、両引数をonTapFunc()関数内に渡してあげることができます。

dart

1Widget itemBuilder(BuildContext context, int index) { 2 return GestureDetector( 3 onTap: () => onTapFunc(context, index), 4 child: Container(), 5 ); 6 } 7 8onTapFunc(BuildContext context, int index){ 9 showDialog( 10 context: context, 11 builder: (context) => _dialogBuilder(context, _menus[index])); 12}

投稿2020/04/21 14:45

hnishim

総合スコア11

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問