In Flutter, every element on the screen is a widget — from buttons and text to images and containers. While some widgets, like ElevatedButton or TextButton, are inherently clickable, others like Text, Container, or Image are not by default. However, any widget can be made interactive by wrapping it inside a GestureDetector.
The GestureDetector widget detects various user gestures, including taps, drags, and long presses. To convert any widget into a clickable one, wrap it with a GestureDetector and use the onTap callback to define the behavior on click.
Example: Making Text, Container, and Image Clickable
The following example demonstrates how to use GestureDetector to make Text, Container, and Image widgets clickable:
Code:
import 'package:flutter/material.dart';
class ClickableWidget extends StatefulWidget {
const ClickableWidget({super.key});
@override
State<ClickableWidget> createState() => _ClickableWidgetState();
}
class _ClickableWidgetState extends State<ClickableWidget> {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
GestureDetector(
onTap: (){
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Center(child: Text('1'))));
},
child: Text('CLICK HERE',style: TextStyle(color: Colors.black,fontWeight: FontWeight.bold,fontSize: 18),)),
SizedBox(height: 20,),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
GestureDetector(
onTap: (){
ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Center(child: Text('2'))));
},
child: Container(
padding: EdgeInsets.symmetric(horizontal: 12,vertical: 12),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12),
color: Colors.red
),
child: Text('CLICK HERE',style: TextStyle(color: Colors.black,fontWeight: FontWeight.bold,fontSize: 18),),
),
)
],
),
SizedBox(height: 20,),
Image.asset('assets/images/flutter_logo.png',scale: 3,)
],
),
);
}
}
DartOutput:

Conclusion:
Any widget in Flutter can be made clickable by simply wrapping it with a GestureDetector and defining the appropriate interaction logic using callbacks like onTap. This technique enhances user experience and enables developers to make rich, interactive UIs without relying solely on pre-built button widgets.