Android 颤振:从WebView加载IFrame
我正在寻找从Flatter WebView(WebView\u Flatter:^0.1.2)加载iFrame的方法,但找不到任何相关信息Android 颤振:从WebView加载IFrame,android,webview,flutter,Android,Webview,Flutter,我正在寻找从Flatter WebView(WebView\u Flatter:^0.1.2)加载iFrame的方法,但找不到任何相关信息 Container( child: WebView( initialUrl: 'https://www.youtube.com/embed/abc', javaScriptMode: JavaScr
Container(
child: WebView(
initialUrl: 'https://www.youtube.com/embed/abc',
javaScriptMode: JavaScriptMode.unrestricted,
)),
你知道如何将IFrame传递给Webview吗,它会作为initialUrl的一部分吗?我也尝试过同样的方法,但加载不正确。这可能会满足你的需要
Container(
child: WebView(
initialUrl: Uri.dataFromString('<html><body><iframe src="https://www.youtube.com/embed/abc"></iframe></body></html>', mimeType: 'text/html').toString(),
javascriptMode: JavascriptMode.unrestricted,
)),
容器(
孩子:网络视图(
initialUrl:Uri.dataFromString(“”,mimeType:'text/html').toString(),
javascriptMode:javascriptMode.unrestricted,
)),
这将传递一个包含带有iframe的HTML页面的数据URL。基于上面的@Günter,我做了一些轻微的调整,因为我无法让它在ios上工作。这是基于官方的pub.dev页面
String html = """<!DOCTYPE html>
<html>
<head>
<style>
body {
overflow: hidden;
}
.embed-youtube {
position: relative;
padding-bottom: 56.25%;
padding-top: 0px;
height: 0;
overflow: hidden;
}
.embed-youtube iframe,
.embed-youtube object,
.embed-youtube embed {
border: 0;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
</style>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
</head>
<body bgcolor="#121212">
<div class="embed-youtube">
<iframe
id="vjs_video_3_Youtube_api"
style="width:100%;height:100%;top:0;left:0;position:absolute;"
class="vjs-tech holds-the-iframe"
frameborder="0"
allowfullscreen="1"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
webkitallowfullscreen mozallowfullscreen allowfullscreen
title="Live Tv"
frameborder="0"
src="$iframeUrl"
></iframe></div>
</body>
</html>
""";
final Completer<WebViewController> _controller =
Completer<WebViewController>();
final String contentBase64 =
base64Encode(const Utf8Encoder().convert(html));
return WebView(
initialUrl: 'data:text/html;base64,$contentBase64',
javascriptMode: JavascriptMode.unrestricted,
onWebViewCreated: (WebViewController webViewController) {
_controller.complete(webViewController);
},
onPageStarted: (String url) {
print('Page started loading: $url');
},
onPageFinished: (String url) {
print('Page finished loading: $url');
},
gestureNavigationEnabled: true,
);
String html=”“”
身体{
溢出:隐藏;
}
.嵌入youtube{
位置:相对位置;
垫底:56.25%;
填充顶部:0px;
身高:0;
溢出:隐藏;
}
.嵌入youtube iframe,
.嵌入youtube对象,
.嵌入youtube嵌入{
边界:0;
位置:绝对位置;
排名:0;
左:0;
宽度:100%;
身高:100%;
}
""";
最终完成器控制器=
完成符();
最终字符串contentBase64=
base64Encode(const Utf8Encoder().convert(html));
返回WebView(
initialUrl:'data:text/html;base64,$contentBase64',
javascriptMode:javascriptMode.unrestricted,
onWebViewCreated:(WebViewController WebViewController){
_控制器。完成(webViewController);
},
onPageStarted:(字符串url){
打印('页面已开始加载:$url');
},
onPageFinished:(字符串url){
打印('Page finished loading:$url');
},
gestureNavigationEnabled:正确,
);
然后我用@Lorenzo Pichilli answer在android上做了这件事。我工作得快了一点。希望这对任何人都有帮助。花了我一整天的时间
PS
这使我能够在Android和iOS上播放youtube和vimeo视频。到目前为止一切正常
编辑:
要在webview完成加载之前添加加载程序,请查看如何添加进度循环指示器。抱歉,我不知道,并且在接下来的几天内没有时间仔细查看。这就是我所说的玩家移动。你们知道了吗?您使用的链接格式是什么?我试着交换嵌入式/观看?v?=但出现了一个很大的youtube条。嵌入全屏按钮后,质量和速度设置也不会显示。它没有显示广告,为什么?这种方法有一些局限性。我不记得细节了。可能与CORS有关。最好使用另一种方法,在你的Flitter应用程序中的Dart中实现一个简单的代理,在这里你提供一个端口,转发所有请求并传递
http://localhost:1234
到webview,其中1234
是您正在服务的端口。我手头没有相关的代码。你说的我一点也不懂对不起,哈哈,你是什么意思?我只想展示youtube视频。就像youtube应用程序一样