Как отключить мультитач в мобильном приложении с помощью флаттера
Этот вопрос основан исключительно на флаттере GestureDetector.
Например: в приложении реализован класс GestureDetector, поэтому здесь по умолчанию его поддержка мультитач, теперь нужно отключить этот мультитач, так что это может быть лучшим способом решения.
Ссылка на GestureDetector: https://docs.flutter.io/flutter/widgets/GestureDetector-class.html
2 ответа
Создать экземпляр OnlyOnePointerRecognizerWidget
widget и передайте ему любой виджет как дочерний. OnlyOnePointerRecognizerWidget
распознает только один указатель.
import 'package:flutter/material.dart';
import 'package:flutter/gestures.dart';
class OnlyOnePointerRecognizer extends OneSequenceGestureRecognizer {
int _p = 0;
@override
void addPointer(PointerDownEvent event) {
startTrackingPointer(event.pointer);
if (_p == 0) {
resolve(GestureDisposition.rejected);
_p = event.pointer;
} else {
resolve(GestureDisposition.accepted);
}
}
@override
String get debugDescription => 'only one pointer recognizer';
@override
void didStopTrackingLastPointer(int pointer) {}
@override
void handleEvent(PointerEvent event) {
if (!event.down && event.pointer == _p) {
_p = 0;
}
}
}
class OnlyOnePointerRecognizerWidget extends StatelessWidget {
final Widget child;
OnlyOnePointerRecognizerWidget({this.child});
@override
Widget build(BuildContext context) {
return RawGestureDetector(
gestures: <Type, GestureRecognizerFactory>{
OnlyOnePointerRecognizer: GestureRecognizerFactoryWithHandlers<OnlyOnePointerRecognizer>(
() => OnlyOnePointerRecognizer(),
(OnlyOnePointerRecognizer instance) {},
),
},
child: child,
);
}
}
Проблема устранена с помощью ImmediateMultiDragGestureRecognizer(), приведенный ниже код показывает, как мы можем его использовать.
child: RawGestureDetector(
behavior: HitTestBehavior.opaque,
gestures: <Type, GestureRecognizerFactory>{
ImmediateMultiDragGestureRecognizer:
GestureRecognizerFactoryWithHandlers<
ImmediateMultiDragGestureRecognizer>(
() => ImmediateMultiDragGestureRecognizer(),
(ImmediateMultiDragGestureRecognizer instance) {
instance..onStart = _handleOnStart;
},
),
},
Drag _handleOnStart(Offset position) {
if (count < 1) {
setState(() {
count++;
});
return _DragHandler(_handleDragUpdate, _handleDragEnd);
}
return null;
}
void _handleDragUpdate(DragUpdateDetails update) {
//code is here
}
void _handleDragEnd(DragEndDetails details) {
//code is here
}
setState(() {
count = 0;
});
}
class _DragHandler extends Drag {
_DragHandler(this.onUpdate, this.onEnd);
final GestureDragUpdateCallback onUpdate;
final GestureDragEndCallback onEnd;
@override
void update(DragUpdateDetails details) {
onUpdate(details);
}
@override
void end(DragEndDetails details) {
onEnd(details);
}
@override
void cancel(){}
}
Похоже, вы хотите MultiDragGestureRecognizer. Вам нужно создать StatefulWidget, который создает экземпляр MultiDragGestureRecognizer, а затем у вашей функции сборки должен быть Listener, который направляет событие onPointerDown в распознаватель. Вероятно, мы могли бы добавить этот распознаватель к самому GestureDetector или предоставить виджет, который оборачивает этот распознаватель, если это часто делают люди. Что еще более важно, мы должны, вероятно, документировать это. Я оставляю эту ошибку открытой для этой цели. библиотека жестов флаттера