Android 颤振:从WebView加载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

我正在寻找从Flatter WebView(WebView\u Flatter:^0.1.2)加载iFrame的方法,但找不到任何相关信息

                 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应用程序一样