我已经开始建立网站,但使用flutter.我能够实现在页面上呈现单个YT视频.但是,当我试图这样做的多个视频它没有得到显示.经过调查得知,只有1嵌入视频已绑定到DOM解析器.下面是我的示例代码.其中assets[pageIndex]是我传递的链接.和Iframe是负责显示它.请帮助我在这里,并让我知道,如果还有什么需要.提前感谢.排灯节快乐:)

我try 了不同的方法,在两个独立的小工具中保留了两个不同的视频链接,但仍然只有一个视频在渲染.

               import 'dart:html';
                import 'dart:ui_web' as ui;
                import 'package:flutter/material.dart';

                class IframeScreen extends StatefulWidget {
                  final List<String> urlDataList;

                  IframeScreen(this.urlDataList, {Key? key}) : super(key: key);

                  @override
                  State<IframeScreen> createState() => _IframeScreenState();
                }

                class _IframeScreenState extends State<IframeScreen> {
                  late List<IFrameElement> _iframeElements;

                  @override
                  void initState() {
                    super.initState();

                    _iframeElements = List.generate(
                      widget.urlDataList.length,
                      (index) {
                        var iframeElement = IFrameElement()
                    ..src = widget.urlDataList[index]
                    ..style.border = 'none'
                    ..allowFullscreen = true;

                        // Enable JavaScript
                        iframeElement.attributes['allow'] =
                      'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture';

                        // Register the iframe element with a unique key using index
                        ui.platformViewRegistry.registerViewFactory(
                    'iframeElement$index',
                    (int viewId) => iframeElement,
                        );

                        print('Registered iframeElement$index: ${iframeElement.src}');

                        return iframeElement;
                      },
                    );
                  }

                  @override
                  Widget build(BuildContext context) {
                    return Column(
                      children: [
                        for (int index = 0; index < widget.urlDataList.length; index++)
                    Expanded(
                      child: Container(
                        child: HtmlElementView(
                          viewType: 'iframeElement$index',
                          key: UniqueKey(),
                        ),
                      ),
                    ),
                      ],
                    );
                  }
                }

                class YourWidget extends StatelessWidget {
                  final List<String> assets;
                  final List<String> title;

                  YourWidget({required this.assets, required this.title});

                  @override
                  Widget build(BuildContext context) {
                    var screenSize = MediaQuery.of(context).size;

                    return Scaffold(
                      body: Row(
                        mainAxisAlignment: MainAxisAlignment.spaceBetween,
                        children: [
                    ...Iterable<int>.generate(assets.length).map(
                      (int pageIndex) => Column(
                        children: [
                          SizedBox(
                            height: screenSize.width / 6,
                            width: screenSize.width / 3.8,
                            child: InkWell(
                        onTap: () {
                          print(pageIndex);
                        },
                        child: Container(
                          decoration: BoxDecoration(
                            borderRadius: BorderRadius.circular(20.0),
                            boxShadow: [
                              BoxShadow(
                                offset: Offset(0, 10),
                                blurRadius: 20,
                                spreadRadius: 5,
                                color: Colors.grey.withOpacity(0.3),
                              )
                            ],
                          ),
                          child: IframeScreen([assets[pageIndex]]),
                        ),
                            ),
                          ),
                          Padding(
                            padding: EdgeInsets.only(
                        top: screenSize.height / 70,
                            ),
                            child: Text(
                        title[pageIndex],
                        style: TextStyle(
                          fontSize: 20,
                          color: Colors.orangeAccent,
                          fontFamily: 'Montserrat',
                          fontWeight: FontWeight.w500,
                        ),
                            ),
                          ),
                        ],
                      ),
                    ),
                        ],
                      ),
                    );
                  }
                }

                void main() {
                  runApp(
                    MaterialApp(
                      home: YourWidget(
                        assets: ['your_video_url_1', 'your_video_url_2'],
                        title: ['Title 1', 'Title 2'],
                      ),
                    ),
                  );
                }

推荐答案

解决方法如下:需要 for each 视频传递唯一的viewType,并更新了IfraScreen代码:

import 'dart:html';
import 'dart:ui' as ui;

import 'package:flutter/material.dart';

class IframeScreen extends StatefulWidget {
  var urlData;

  IframeScreen(this.urlData, {Key? key}) : super(key: key);

  @override
  State<IframeScreen> createState() => _IframeScreenState();
}

class _IframeScreenState extends State<IframeScreen> {
  final IFrameElement _iFrameElement = IFrameElement();

  @override
  void initState() {
    _iFrameElement.src = widget.urlData;
    _iFrameElement.style.border = 'none';
    _iFrameElement.allowFullscreen = true;
// ignore: undefined_prefixed_name
    ui.platformViewRegistry.registerViewFactory(
      widget.urlData,
      (int viewId) => (_iFrameElement as IFrameElement),
    );

    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        child: HtmlElementView(
          key: UniqueKey(),
          viewType: widget.urlData,
        ),
      ),
    );
  }
}

Flutter相关问答推荐

手势捕获的异常:类型';Double';不是类型转换中类型';Double';的子类型

Flutter BLoC et workmanager:如何创建独特的仓库初始化模式?

如何将Xpriter代码页更改为代码页27?

无效参数(S):隔离消息中的非法参数:try 旋转图像时对象不可发送

为什么PUT方法没有发出任何响应?

GitHub Actions工作流secret中的特殊字符未被保留

GetConnect Post API调用在Flutter Web中不起作用说:415不支持的媒体类型

SingleChildScrollView在ErrorWidget.builder中不工作

使索引[0]在ListViewBuilder中返回字符串1

StateNotifer正在riverpod中提供初始状态值(bool)

在 flutter 的列中使用 Expanded 时出现渲染 Flex 错误

Flutter居中的SizedBox无法居中

像图像一样Flutter 自定义标签

Flutter - 我需要显示文本,但应用程序不需要

当我将主题更改为深色然后返回浅色模式时,Getx 会Flutter 更改主题,它不会加载我的自定义主题

Flutter使Perspective Page View无限循环

使用 mocktail 包进行单元测试时,类型Null不是Future类型的子类型

一个或多个插件需要更高的 Android SDK 版本

带图像封面的 ElevatedButton

检索 api 的值时,我得到_TypeError(类型'Null'不是'String'类型的子类型)