Bird
Raised Fist0
Fluttermobile~5 mins

GestureDetector in Flutter

Choose your learning style10 modes available
Introduction

GestureDetector lets your app notice when you touch or swipe the screen. It helps make your app interactive.

You want to detect taps on a button or image.
You want to respond when the user swipes left or right.
You want to detect long presses to show extra options.
You want to track dragging movements on the screen.
You want to make any widget respond to touch gestures.
Syntax
Flutter
GestureDetector(
  onTap: () {
    // code to run when tapped
  },
  child: Widget(),
)

The child is the widget that listens for gestures.

You can use many gesture callbacks like onTap, onLongPress, onPanUpdate, etc.

Examples
This detects a tap on a blue square and prints a message.
Flutter
GestureDetector(
  onTap: () {
    print('Tapped!');
  },
  child: Container(color: Colors.blue, width: 100, height: 100),
)
This detects a long press on the text.
Flutter
GestureDetector(
  onLongPress: () {
    print('Long pressed!');
  },
  child: Text('Hold me'),
)
This detects dragging movements on the icon.
Flutter
GestureDetector(
  onPanUpdate: (details) {
    print('Dragged by ${details.delta}');
  },
  child: Icon(Icons.drag_handle),
)
Sample App

This app shows a teal box with the text "Tap me". When you tap the box, a message appears at the bottom saying "You tapped the box!".

Flutter
import 'package:flutter/material.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('GestureDetector Example')),
        body: Center(
          child: GestureDetector(
            onTap: () {
              ScaffoldMessenger.of(context).showSnackBar(
                const SnackBar(content: Text('You tapped the box!')),
              );
            },
            child: Container(
              width: 150,
              height: 150,
              color: Colors.teal,
              alignment: Alignment.center,
              child: const Text(
                'Tap me',
                style: TextStyle(color: Colors.white, fontSize: 24),
              ),
            ),
          ),
        ),
      ),
    );
  }
}
OutputSuccess
Important Notes

GestureDetector does not show any visual change by itself. You can add visual feedback inside the gesture callbacks.

Make sure the child widget has a size; otherwise, gestures might not be detected.

Use HitTestBehavior if you want to control how gestures pass through overlapping widgets.

Summary

GestureDetector listens for touch gestures on its child widget.

Use it to detect taps, long presses, drags, and more.

It helps make your app interactive and responsive to user touches.

Practice

(1/5)
1. What is the primary purpose of the GestureDetector widget in Flutter?
easy
A. To detect user touch gestures like taps and swipes on its child widget
B. To display images and icons on the screen
C. To manage app navigation between screens
D. To style text with different fonts and colors

Solution

  1. Step 1: Understand GestureDetector's role

    The GestureDetector widget listens for user touch gestures such as taps, double taps, long presses, and drags on its child widget.
  2. Step 2: Compare with other options

    Displaying images and icons, managing app navigation, and styling text are handled by other widgets like Image/Icon, Navigator/Router, and TextStyle, not GestureDetector.
  3. Final Answer:

    To detect user touch gestures like taps and swipes on its child widget -> Option A
  4. Quick Check:

    GestureDetector = Detects touch gestures [OK]
Hint: GestureDetector listens for user touches on child widgets [OK]
Common Mistakes:
  • Confusing GestureDetector with navigation widgets
  • Thinking it styles UI elements
  • Assuming it displays images
2. Which of the following is the correct way to detect a tap using GestureDetector in Flutter?
easy
A. GestureDetector(onPressed: () { print('Tapped'); }, child: Text('Tap me'))
B. GestureDetector(onClick: () { print('Tapped'); }, child: Text('Tap me'))
C. GestureDetector(onTouch: () { print('Tapped'); }, child: Text('Tap me'))
D. GestureDetector(onTap: () { print('Tapped'); }, child: Text('Tap me'))

Solution

  1. Step 1: Identify the correct GestureDetector callback

    The correct callback for detecting a tap is onTap. Other callbacks like onClick, onPressed, and onTouch do not exist on GestureDetector.
  2. Step 2: Verify syntax correctness

    GestureDetector(onTap: () { print('Tapped'); }, child: Text('Tap me')) uses the correct syntax with onTap and a child widget, making it valid Flutter code.
  3. Final Answer:

    GestureDetector(onTap: () { print('Tapped'); }, child: Text('Tap me')) -> Option D
  4. Quick Check:

    Tap detection uses onTap callback [OK]
Hint: Use onTap callback to detect taps in GestureDetector [OK]
Common Mistakes:
  • Using onClick or onPressed instead of onTap
  • Forgetting to provide a child widget
  • Misspelling callback names
3. What will happen when the user taps the text in this Flutter code?
GestureDetector(
  onTap: () => print('Tapped!'),
  child: Text('Click me'),
)
medium
A. The text 'Tapped!' will be printed to the console
B. Nothing happens because onTap is not a valid callback
C. The app will crash due to missing onPressed callback
D. The text will change to 'Tapped!' on screen

Solution

  1. Step 1: Understand onTap behavior

    The onTap callback runs the provided function when the user taps the child widget. Here, it prints 'Tapped!' to the console.
  2. Step 2: Check other options

    The text does not change on screen automatically without state management like setState. onTap is valid, so something does happen on tap. The app won't crash because onPressed is not required for GestureDetector.
  3. Final Answer:

    The text 'Tapped!' will be printed to the console -> Option A
  4. Quick Check:

    onTap prints 'Tapped!' on tap [OK]
Hint: onTap runs code on tap, prints to console if print() used [OK]
Common Mistakes:
  • Thinking onTap changes UI automatically
  • Confusing onTap with onPressed
  • Expecting visual changes without setState
4. Identify the error in this Flutter code snippet using GestureDetector:
GestureDetector(
  onTap: print('Tapped'),
  child: Text('Tap me'),
)
medium
A. Missing child widget inside GestureDetector
B. onTap should be a function, not the result of print()
C. GestureDetector does not support onTap callback
D. Text widget cannot be a child of GestureDetector

Solution

  1. Step 1: Analyze onTap assignment

    The onTap callback expects a function to call when tapped. Here, print('Tapped') runs immediately and assigns its result (void) to onTap, which is incorrect.
  2. Step 2: Correct usage

    onTap should be assigned a function like () => print('Tapped') or (){ print('Tapped'); } to run on tap.
  3. Final Answer:

    onTap should be a function, not the result of print() -> Option B
  4. Quick Check:

    onTap needs a function, not immediate call [OK]
Hint: Pass a function to onTap, not a direct call [OK]
Common Mistakes:
  • Calling print() instead of passing a function
  • Omitting child widget
  • Using unsupported callbacks
5. You want to detect both tap and long press gestures on a button in Flutter. Which GestureDetector code correctly handles both events?
hard
A. GestureDetector(onPressed: () => print('Tap'), onLongPress: () => print('Long press'), child: Container())
B. GestureDetector(onTap: () => print('Tap'), onDoubleTap: () => print('Long press'), child: Container())
C. GestureDetector(onTap: () => print('Tap'), onLongPress: () => print('Long press'), child: Container())
D. GestureDetector(onTap: () => print('Tap'), onHold: () => print('Long press'), child: Container())

Solution

  1. Step 1: Identify correct callbacks for tap and long press

    GestureDetector uses onTap for taps and onLongPress for long presses. GestureDetector(onTap: () => print('Tap'), onLongPress: () => print('Long press'), child: Container()) uses both correctly.
  2. Step 2: Check other options for errors

    GestureDetector(onTap: () => print('Tap'), onDoubleTap: () => print('Long press'), child: Container()) uses onDoubleTap instead of onLongPress, which is incorrect. GestureDetector(onPressed: () => print('Tap'), onLongPress: () => print('Long press'), child: Container()) uses onPressed which GestureDetector does not have. GestureDetector(onTap: () => print('Tap'), onHold: () => print('Long press'), child: Container()) uses onHold which is not a valid callback.
  3. Final Answer:

    GestureDetector(onTap: () => print('Tap'), onLongPress: () => print('Long press'), child: Container()) -> Option C
  4. Quick Check:

    Use onTap and onLongPress for tap and long press [OK]
Hint: Use onTap and onLongPress callbacks together [OK]
Common Mistakes:
  • Using onPressed instead of onTap
  • Confusing onDoubleTap with onLongPress
  • Using non-existent callbacks like onHold
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard