import 'package:fis_live/controller/adapters/single/adapter_io.dart'; import 'package:fis_live/controller/controller.dart'; import 'package:fis_live/controller/exception.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_inappwebview/flutter_inappwebview.dart'; import '../data_root.dart'; /// 单路画面直播视图 class SingleChannelView extends StatefulWidget { const SingleChannelView({super.key}); @override State createState() => _SingleChannelViewState(); } class _SingleChannelViewState extends State { late final LiveShareDateProxy dataProxy; LiveController get controller => dataProxy.controller; LiveControllerSingleIOAdapter get adapter => controller.adapter! as LiveControllerSingleIOAdapter; InAppWebViewController get wvController => adapter.webViewController!; @override void initState() { super.initState(); } @override void didChangeDependencies() { dataProxy = LiveShareDateProxy.of(context)!; controller.adapter = LiveControllerSingleIOAdapter(); super.didChangeDependencies(); } @override Widget build(BuildContext context) { return _buildWebView(); } Widget _buildWebView() { return InAppWebView( initialFile: "assets/wwwroot/source.html", initialOptions: InAppWebViewGroupOptions( crossPlatform: InAppWebViewOptions( mediaPlaybackRequiresUserGesture: false, disableHorizontalScroll: true, disableVerticalScroll: true, allowFileAccessFromFileURLs: true, allowUniversalAccessFromFileURLs: true, ), ), onWebViewCreated: (c) { adapter.webViewController = c; c.addJavaScriptHandler(handlerName: 'onReady', callback: _onReady); c.addJavaScriptHandler(handlerName: 'onStart', callback: _onStart); c.addJavaScriptHandler(handlerName: 'onStop', callback: _onStop); c.addJavaScriptHandler(handlerName: 'onTimeout', callback: _onTimeout); c.addJavaScriptHandler(handlerName: 'onError', callback: _onError); c.addJavaScriptHandler(handlerName: 'onBuffering', callback: _onError); }, onLoadStop: (c, url) {}, onConsoleMessage: (c, consoleMessage) { print( "[WebView Console][${consoleMessage.messageLevel}] ${consoleMessage.message}"); }, ); } dynamic _onReady(List args) { final url = controller.source.url; wvController.evaluateJavascript(source: "load('$url')"); controller.ready.emit(this, null); } dynamic _onStart(List args) { controller.playStarted.emit(this, null); } dynamic _onStop(List args) { controller.playStopped.emit(this, null); } dynamic _onTimeout(List args) { controller.timeout.emit(this, null); } dynamic _onError(List args) { final error = args.first; controller.errorOccurred.emit( this, FLivePlayerException(error.code, error.msg), ); } }