İçeriğe geç / Skip to content / Zum Inhalt
Ahmet Balaman LogoAhmet Balaman

Flutter: GestureDetector verwenden und Touch-Ereignisse

Ahmet Balaman
FlutterGestureDetectorTouchGestureWidgetUI

GestureDetector ist ein leistungsfähiges Widget, mit dem wir jedem Widget Touch-Ereignisse wie Tippen, Doppeltippen, langes Drücken und Wischen hinzufügen können. Damit werden auch sonst nicht anklickbare Widgets interaktiv.

Live-Demo

Sie können dieses Widget im interaktiven Beispiel unten ausprobieren:

💡 Falls das Beispiel oben nicht lädt, klicken Sie auf DartPad, um es in einem neuen Tab auszuführen.

Grundlegende Verwendung

Mit GestureDetector machen Sie jedes Widget antippbar:

GestureDetector(
  onTap: () {
    print('Tapped!');
  },
  child: Container(
    padding: EdgeInsets.all(20),
    color: Colors.blue,
    child: Text('Tap me'),
  ),
)

Unterstützte Gestenarten

Tipp-Ereignisse

GestureDetector(
  onTap: () => print('Single tap'),
  onDoubleTap: () => print('Double tap'),
  onLongPress: () => print('Long press'),
  onTapDown: (details) => print('Finger touched'),
  onTapUp: (details) => print('Finger lifted'),
  onTapCancel: () => print('Tap cancelled'),
  child: MyWidget(),
)

Zieh-Ereignisse

GestureDetector(
  // Horizontal drag
  onHorizontalDragStart: (details) => print('Horizontal drag started'),
  onHorizontalDragUpdate: (details) => print('Delta: ${details.delta.dx}'),
  onHorizontalDragEnd: (details) => print('Velocity: ${details.primaryVelocity}'),
  
  // Vertical drag
  onVerticalDragStart: (details) => print('Vertical drag started'),
  onVerticalDragUpdate: (details) => print('Delta: ${details.delta.dy}'),
  onVerticalDragEnd: (details) => print('Velocity: ${details.primaryVelocity}'),
  
  // Pan (any direction)
  onPanStart: (details) => print('Pan started'),
  onPanUpdate: (details) => print('Position: ${details.localPosition}'),
  onPanEnd: (details) => print('Pan ended'),
  
  child: MyWidget(),
)

Skalieren (Pinch)

GestureDetector(
  onScaleStart: (details) => print('Scale started'),
  onScaleUpdate: (details) {
    print('Scale: ${details.scale}');
    print('Rotation: ${details.rotation}');
  },
  onScaleEnd: (details) => print('Scale ended'),
  child: MyWidget(),
)

Alternative InkWell

Wenn Sie den Ripple-Effekt des Material Design möchten, können Sie InkWell verwenden:

InkWell(
  onTap: () => print('Tapped'),
  onLongPress: () => print('Long pressed'),
  splashColor: Colors.orange.withOpacity(0.3),
  highlightColor: Colors.orange.withOpacity(0.1),
  borderRadius: BorderRadius.circular(8),
  child: Container(
    padding: EdgeInsets.all(16),
    child: Text('Button with Ripple Effect'),
  ),
)

HitTestBehavior

Steuert, wie Touch-Ereignisse erkannt werden:

GestureDetector(
  behavior: HitTestBehavior.opaque, // Detect on empty areas too
  // behavior: HitTestBehavior.translucent, // Pass to widgets below
  // behavior: HitTestBehavior.deferToChild, // Only detect on child (default)
  onTap: () => print('Tapped'),
  child: Container(
    width: 200,
    height: 200,
    // no color, transparent
    child: Center(child: Text('Tap')),
  ),
)

Zusammenfassung

Ereignis Beschreibung
onTap Einfaches Tippen
onDoubleTap Doppeltippen
onLongPress Langes Drücken
onHorizontalDrag* Horizontales Ziehen
onVerticalDrag* Vertikales Ziehen
onPan* Ziehen in beliebige Richtung
onScale* Zoomen und Drehen per Pinch

GestureDetector ist der grundlegendste Weg, Nutzerinteraktionen in Flutter zu erfassen.

Kommentare