// ignore_for_file: avoid_web_libraries_in_flutter, deprecated_member_use import 'dart:html' as html; import 'dart:ui_web' as ui_web; import 'package:flutter/material.dart'; class WebStreamPlayer extends StatefulWidget { final String streamUrl; final double volume; final int? refreshToken; const WebStreamPlayer({ super.key, required this.streamUrl, required this.volume, this.refreshToken, }); @override State createState() => _WebStreamPlayerState(); } class _WebStreamPlayerState extends State { late final String _viewType; html.IFrameElement? _iframe; @override void initState() { super.initState(); final cacheBuster = DateTime.now().microsecondsSinceEpoch; _viewType = 'flv-player-$cacheBuster'; ui_web.platformViewRegistry.registerViewFactory(_viewType, (int viewId) { final iframe = html.IFrameElement() ..src = 'flv_player.html?v=$cacheBuster' '&src=${Uri.encodeComponent(widget.streamUrl)}' '&volume=${widget.volume}' ..style.border = '0' ..style.width = '100%' ..style.height = '100%' ..style.pointerEvents = 'none' ..allow = 'autoplay; fullscreen'; _iframe = iframe; return iframe; }); } @override void didUpdateWidget(covariant WebStreamPlayer oldWidget) { super.didUpdateWidget(oldWidget); if (oldWidget.volume != widget.volume) { _iframe?.contentWindow?.postMessage({ 'type': 'setVolume', 'value': widget.volume, }, '*'); } } @override Widget build(BuildContext context) { return HtmlElementView(viewType: _viewType); } }