Я теперь случайно наткнулся на выход из проблемы "нет событий касания в Android", которую пёс Flutter Webview. Вместо того чтобы удалять мой вопрос, я чувствовал, что для других было бы более полезно оставить его здесь с решением, которое я нашел.
Я начал с намерения отлавливать события Touch в Flutter, а затем передавать их в WebView через evaluateJavascript
. Для этого я изменил структуру своего виджета, чтобы обернуть WebView в слушатель. Весь мой код конструктора виджетов показан ниже.
@override Widget build(BuildContext context)
{
SystemChrome.setPreferredOrientations([DeviceOrientation.landscapeLeft]);
return WidgetsApp
(
onGenerateRoute:makeWebView,
color:Color.fromRGBO(0,128,255,1.0)
);
}
Route makeWebView(RouteSettings settings)
{
return new PageRouteBuilder
(
pageBuilder:(BuildContext context,Animation<double> animation,Animation<double>
secondaryAnimation)
{
return SafeArea
(
child:Listener
(
child: SizedBox.expand
(
child:WebView
(
debuggingEnabled:true,
initialUrl:'',
javascriptMode:JavascriptMode.unrestricted,
onWebViewCreated:registerController,
javascriptChannels:Set.from
([JavascriptChannel(name:'JSBridge',onMessageReceived:handleMessage)]),
),
),
)
);
});
}
К моему большому удивлению, простое выполнение этого заставило инкапсулированный Flutter WebView отвечать на события touch#
без каких-либо неприятных проблем LongPress
. Мне непонятно, почему это должно происходить - возможно, кто-то еще здесь может объяснить.
Несколько замечаний по моему коду выше
- Я использую WebViews, которые занимают все устройство экран в альбомном формате - как на iOS, так и на Android
- Я использую WidgetsApp вместо MaterialApp для предоставления базовых c скаффолдингов
- SafeArea гарантирует, что приложение занимает пространство, которое
- Слушатель - это то, что делает волхв c здесь и делает сенсорные события доступными в WebView, даже на Android
- WebView является основным игроком, где происходят все действия , В переднем конце JavaScript вам просто нужно захватить события
touchstart
, touchmove
и touchend
на document.body
.
. Вы можете прочитать больше о различных виджетах, которые я использовал здесь, в документах по флаттеру .