diff --git a/lib/common.dart b/lib/common.dart index d17eeffa5..ef0ced2b0 100644 --- a/lib/common.dart +++ b/lib/common.dart @@ -1,3 +1,4 @@ +import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'dart:async'; import 'package:flutter_easyloading/flutter_easyloading.dart'; @@ -217,3 +218,47 @@ String readableFileSize(double size) { return (size / G).toStringAsFixed(2) + " GB"; } } + +/// Flutter can't not catch PointerMoveEvent when size is 1 +/// This will happen in Android AccessibilityService Input +/// android can't init dispatching size yet ,see: https://stackoverflow.com/questions/59960451/android-accessibility-dispatchgesture-is-it-possible-to-specify-pressure-for-a +/// use this temporary solution until flutter or android fixes the bug +class AccessibilityListener extends StatelessWidget { + final Widget? child; + static final offset = 100; + + AccessibilityListener({this.child}); + + @override + Widget build(BuildContext context) { + return Listener( + onPointerDown: (evt) { + if (evt.size == 1 && GestureBinding.instance != null) { + GestureBinding.instance!.handlePointerEvent(PointerAddedEvent( + pointer: evt.pointer + offset, position: evt.position)); + GestureBinding.instance!.handlePointerEvent(PointerDownEvent( + pointer: evt.pointer + offset, + size: 0.1, + position: evt.position)); + } + }, + onPointerUp: (evt) { + if (evt.size == 1 && GestureBinding.instance != null) { + GestureBinding.instance!.handlePointerEvent(PointerUpEvent( + pointer: evt.pointer + offset, + size: 0.1, + position: evt.position)); + } + }, + onPointerMove: (evt) { + if (evt.size == 1 && GestureBinding.instance != null) { + GestureBinding.instance!.handlePointerEvent(PointerMoveEvent( + pointer: evt.pointer + offset, + size: 0.1, + delta: evt.delta, + position: evt.position)); + } + }, + child: child); + } +} diff --git a/lib/main.dart b/lib/main.dart index f02e8409a..4f8adc9e1 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -41,7 +41,13 @@ class App extends StatelessWidget { navigatorObservers: [ FirebaseAnalyticsObserver(analytics: analytics), ], - builder: EasyLoading.init(), + builder: isAndroid + ? (_, child) { + return AccessibilityListener( + child: FlutterEasyLoading(child: child), + ); + } + : EasyLoading.init(), ), ); }