flutter - Mouse scroll stuck while cursor is on top of youtube_player_iframe
问题描述
Mouse scroll stuck on top of video. I'm using youtube_player_iframe. Also, I don't want to rebuild the iframe widget. I tried to wrap it with pointer_interceptor
but it didn't solve the problem. My first priority is to solve the scroll issue and avoid rebuilding the widget on scrolling. Wrapping everything on SingleChildScrollView
is not a good practice.
- I don't want to use YouTube API like this package
- Need to implemented flutter-web
if you have an alternative way to handle it, feel free to share. Thanks
check this output video
Test widget
import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:pointer_interceptor/pointer_interceptor.dart';
import 'package:sliver_tools/sliver_tools.dart';
import 'package:youtube_player_iframe/youtube_player_iframe.dart';
class YoutubeVideoAdTestScreen2 extends StatefulWidget {
YoutubeVideoAdTestScreen2({Key? key}) : super(key: key);
@override
_YoutubeVideoAdTestScreen2State createState() =>
_YoutubeVideoAdTestScreen2State();
}
class _YoutubeVideoAdTestScreen2State extends State<YoutubeVideoAdTestScreen2> {
YoutubePlayerController _controller = YoutubePlayerController(
initialVideoId: '1oF3pI5umck',
params: YoutubePlayerParams(
// Defining custom playlist
startAt: Duration(seconds: 30),
showControls: true,
showFullscreenButton: true,
),
);
@override
void dispose() {
super.dispose();
_controller.close();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: CustomScrollView(
slivers: [
MultiSliver(
children: [
...List.generate(
4,
(index) => Container(
color: index % 2 == 0 ? Colors.amber : Colors.cyanAccent,
height: index * 50 + 100,
),
).toList(),
SliverToBoxAdapter(
child: YoutubePlayerIFrame(
gestureRecognizers: <Factory<OneSequenceGestureRecognizer>>{},
controller: _controller,
aspectRatio: 16 / 9,
),
),
...List.generate(
4,
(index) => Container(
color: index % 2 == 0 ? Colors.amber : Colors.cyanAccent,
height: index * 50 + 100,
),
).toList(),
],
),
],
),
);
}
}
解决方案
在 Flutter 应用程序中嵌入 HTML 元素的问题在于,这些元素的呈现方式不同。iframes
dart api 提供了以下信息pointer events
:
由于跨域
iframe
元素的安全限制,Flutter无法将指针事件分派到 HTML 视图。如果 aniframe
是事件的目标,则不通知包含该事件的窗口。特别是,这意味着任何落在 an 上的指针事件iframe
都不会被 Flutter 看到,因此 HTML 视图无法与其他小部件一起参与手势检测。
对此没有理想的解决方案,要么在悬停 时失去滚动能力,要么失去与iframe
交互的能力 iframe
,但仍然在其上滚动。
这个想法很简单:将另一个包装AspectRatio
在 a 中PointerInterceptor
,在 aStack
中,这样仍然提供滚动行为,但遗憾的是你不能再与它交互了iframe
。
.....
SliverToBoxAdapter(
child: Stack(
children: [
YoutubePlayerIFrame(
gestureRecognizers: <Factory<OneSequenceGestureRecognizer>>{},
controller: _controller,
aspectRatio: 16 / 9,
),
PointerInterceptor(
child: AspectRatio(
aspectRatio: 16 / 9,
),
),
],
),
),
......
肯定有不同的方法来实现这一点,但我发现如果你只想滚动iframe
. 播放器仍然可以通过它的_controller
, so等来控制play()
,stop()
似乎仍然可以工作。
编辑:
这PointerInterceptor
是一个 pub.dev 包:https ://pub.dev/packages/pointer_interceptor
推荐阅读
- python - 如何能够选择 tkinter 消息小部件中的文本?
- eclipse - 无法在 Eclipse Photon 中安装 JBoss AS、Wildfly、EAP 工具
- reporting-services - 有没有办法在 SSRS 中编写表达式以导航到文档映射中的特定子报表?
- spring - 字符串启动:启动一堆消费者
- javascript - 在一个数组中查找小于或等于另一个数组中的数字的数字?
- c# - 有没有办法从 C# 中的 DataGridView 隐藏空单元格而不是行
- elasticsearch - 有没有办法在排序结果中获取一个项目的索引?
- css - 无法获取 css 表格数据以冻结第一列
- javascript - 添加新数据时,路径上的曲线增加太多
- docker - Kubernetes:如何管理大量服务?将多个应用程序分组到一个服务中是一个坏主意吗?