GestureDetector là widget bọc quanh một child để nhận diện cử chỉ — tap, double-tap, long-press, drag, scale... — và gọi callback tương ứng (onTap, onPanUpdate, onScaleUpdate...). Nó không vẽ gì, chỉ lắng nghe.
Vấn đề nảy sinh khi nhiều detector cùng quan tâm một chuỗi chạm: bạn kéo ngang một item nằm trong ListView cuộn dọc — hệ thống phải quyết ai "thắng" cử chỉ đó. Flutter giải bằng gesture arena:
1. Khi ngón chạm xuống, mọi recognizer có thể liên quan cùng vào một "đấu trường" cho pointer đó.
2. Theo diễn tiến di chuyển, mỗi recognizer tự đánh giá: hoặc tuyên bố thắng khi chắc chắn (drag ngang đủ ngưỡng), hoặc bỏ cuộc (reject) khi thấy không hợp.
3. Khi chỉ còn một recognizer trụ lại, nó thắng và độc quyền nhận phần còn lại của chuỗi chạm; các recognizer khác bị hủy. Nếu nhiều cái cùng "muốn thắng", recognizer vào trước/theo thứ tự cây được ưu tiên.
Hệ quả thực hành: gesture ngoài cùng và trong cùng có thể tranh nhau (drag lồng trong scroll). Khi cần điều khiển chi tiết ai thắng, dùng RawGestureDetector với custom GestureRecognizer, hoặc chọn recognizer phù hợp (HorizontalDragGestureRecognizer vs VerticalDrag) để arena phân xử đúng ý.