diff --git a/lib/pages/chat_page.dart b/lib/pages/chat_page.dart index e161fbd64..3bcd8fbc9 100644 --- a/lib/pages/chat_page.dart +++ b/lib/pages/chat_page.dart @@ -40,6 +40,9 @@ class ChatPage extends StatelessWidget implements PageShape { }) ]; + @override + final scrollController = FFI.chatModel.scroller; + @override Widget build(BuildContext context) { return ChangeNotifierProvider.value( diff --git a/lib/pages/connection_page.dart b/lib/pages/connection_page.dart index 5252d2b1b..4dba37a87 100644 --- a/lib/pages/connection_page.dart +++ b/lib/pages/connection_page.dart @@ -21,6 +21,9 @@ class ConnectionPage extends StatefulWidget implements PageShape { @override final appBarActions = isWeb ? [WebMenu()] : []; + @override + final scrollController = ScrollController(); + @override _ConnectionPageState createState() => _ConnectionPageState(); } @@ -46,6 +49,7 @@ class _ConnectionPageState extends State { Provider.of(context); if (_idController.text.isEmpty) _idController.text = FFI.getId(); return SingleChildScrollView( + controller: widget.scrollController, child: Column( mainAxisAlignment: MainAxisAlignment.start, mainAxisSize: MainAxisSize.max, diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index ef895c042..0fa646d28 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -9,6 +9,7 @@ abstract class PageShape extends Widget { final String title = ""; final Icon icon = Icon(null); final List appBarActions = []; + final ScrollController? scrollController = null; } class HomePage extends StatefulWidget { @@ -74,7 +75,20 @@ class _HomePageState extends State { _selectedIndex = index; }), ), - body: _pages.elementAt(_selectedIndex), + body: Listener( + onPointerMove: (evt) { + final page = _pages.elementAt(_selectedIndex); + + /// 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 + if (evt.size == 1 && page.scrollController != null) { + final offset = page.scrollController!.offset.toDouble(); + page.scrollController!.jumpTo(offset - evt.delta.dy); + } + }, + child: _pages.elementAt(_selectedIndex)), )); } } diff --git a/lib/pages/server_page.dart b/lib/pages/server_page.dart index bd89f5ba3..64291c24c 100644 --- a/lib/pages/server_page.dart +++ b/lib/pages/server_page.dart @@ -57,6 +57,9 @@ class ServerPage extends StatelessWidget implements PageShape { }) ]; + @override + final scrollController = ScrollController(); + @override Widget build(BuildContext context) { checkService(); @@ -64,6 +67,7 @@ class ServerPage extends StatelessWidget implements PageShape { value: FFI.serverModel, child: Consumer( builder: (context, serverModel, child) => SingleChildScrollView( + controller: scrollController, child: Center( child: Column( mainAxisAlignment: MainAxisAlignment.start, diff --git a/lib/pages/settings_page.dart b/lib/pages/settings_page.dart index dff6b5957..73cdea486 100644 --- a/lib/pages/settings_page.dart +++ b/lib/pages/settings_page.dart @@ -20,6 +20,9 @@ class SettingsPage extends StatefulWidget implements PageShape { @override final appBarActions = []; + @override + final scrollController = null; + @override _SettingsState createState() => _SettingsState(); }