Я пытаюсь использовать InAppWebView (последняя бета-версия v6, потому что я пытаюсь заставить это работать на веб-платформе) для отображения встроенного проигрывателя vimeo. В новом флаттер-приложении это отлично работает:
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
final GlobalKey webViewKey = GlobalKey();
InAppWebViewSettings settings = InAppWebViewSettings(
useShouldOverrideUrlLoading: true,
mediaPlaybackRequiresUserGesture: false,
allowsInlineMediaPlayback: true,
iframeAllowFullscreen: true);
return Scaffold(
body: InAppWebView(
key: webViewKey,
initialSettings: settings,
initialUrlRequest: URLRequest(
url: WebUri(Uri.dataFromString(
'<html><div style = "position:relative;padding-top:56.25%;"><iframe src = "https://player.vimeo.com/video/689902544?h=1c8590a277" frameborder = "0" allow = "autoplay; fullscreen; picture-in-picture" style = "position:absolute;top:0;left:0;width:100%;height:100%; allowfullscreen></iframe><p><a href = "https://vimeo.com/689902544">Eternal Spring</a> from <a href = "https://vimeo.com/christopherdormoy">Christopher Dormoy</a> on <a href = "https://vimeo.com">Vimeo</a>.</p></div></html>',
mimeType: 'text/html')
.toString())
//url: WebUri("https://orf.at")
)),
);
}
}
Когда я нажимаю на значок полноэкранного режима в проигрывателе Vimeo, мой браузер корректно переключается в полноэкранный режим.
Однако в моем реальном приложении мой виджет заключен в LayoutBuilder, и кажется, что всякий раз, когда InAppWebView
входит в полноэкранный режим, LayoutBuilder
запускает перестройку дерева дочерних виджетов, и, таким образом, я сразу же снова выбрасываюсь из полноэкранного режима.
Что я могу сделать, чтобы полноэкранный режим работал также в LayoutBuilder
?
Проблема, похоже, в том, что вы используете функцию GlobalKey
— она создается каждый раз, когда вызывается функция build
.
Это, в свою очередь, вызывает повторную инициализацию InAppWebView
, что, вероятно, приведет к выходу из полноэкранного режима.
Простое решение — создать GlobalKey
один раз (или просто полностью исключить его, если он вам больше ни для чего не нужен):
class _MyHomePageState extends State<MyHomePage> {
final webViewKey = GlobalKey();
@override
Widget build(BuildContext context) {
...
}
}
Я бы посоветовал вам обернуть виджет
InAppWebView
внутриStatefulBuilder
. Поэтому при изменении ограничений (включен полноэкранный режим) изменятся только дочерние виджетыStatefulBuilder
. не его родительский виджет (LayoutBuilder).