フラッターアプリを開発し、Firebaseデータからコンテナを動的に構築しています。コンテナ(またはボタンではないウィジェット)のonTapメソッドを取得する方法があるかどうかを知りたかったのです。
コードサンプルは次のとおりです。
child: new Container(
//INSERT ONTAP OR ONPRESSED METHOD HERE
margin: const EdgeInsets.symmetric(vertical: 10.0),
child: new Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
new Container(
margin: const EdgeInsets.only(right: 16.0),
child: new GoogleUserCircleAvatar(snapshot.value['images'][0]),
),
new Column(
crossAxisAlignment: CrossAxisAlignment.start,
children : [
new Container(
padding: const EdgeInsets.only(bottom: 8.0),
child: new Text("${snapshot.value['name']}",
style: new TextStyle(
fontWeight: FontWeight.bold,
),
),
),
new Text("${snapshot.value['description']}",
style: new TextStyle(
color: Colors.grey[500],
),
),
]
)
],
),
Container
を InkWell
または GestureDetector
でラップできます。違いは、InkWell
はタッチが受信されたことを視覚的に示すマテリアルウィジェットであるのに対し、GestureDetector
は視覚的なインジケータを表示しないより汎用的なウィジェットです。
コンテナをInkwell()ウィジェット内にラップすると、問題を解決できたり、GestureDetector()として
InkWell(
child: Container(...),
onTap: () {
print("tapped on container");
},
);
Gesture Detectorの使用
GestureDetector(
onTap: () { print("Container was tapped"); },
child: Container(...),
)
他の人が答えで言ったこととは別に、Card
内でInkWell
を使用すると、InkWell
はAndroidの波及効果を隠します。これはバックグラウンドで発生していることがわかります。しかし、カード自体にはありません。
その解決策は、InkWell
内にCard
を作成することです。
return Card(
child: InkWell(
child: Row(
// Row content
),
onTap: () => {
print("Card tapped.");
},
),
elevation: 2,
);
これにより、波及効果を得て、Androidもタップキャプチャを実行できます。