66 lines
1.7 KiB
Dart
66 lines
1.7 KiB
Dart
// 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<WebStreamPlayer> createState() => _WebStreamPlayerState();
|
|
}
|
|
|
|
class _WebStreamPlayerState extends State<WebStreamPlayer> {
|
|
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);
|
|
}
|
|
}
|