single_view_io.dart 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import 'package:fis_live/controller/adapters/single/adapter_io.dart';
  2. import 'package:fis_live/controller/controller.dart';
  3. import 'package:fis_live/controller/exception.dart';
  4. import 'package:flutter/widgets.dart';
  5. import 'package:flutter_inappwebview/flutter_inappwebview.dart';
  6. import '../data_root.dart';
  7. /// 单路画面直播视图
  8. class SingleChannelView extends StatefulWidget {
  9. const SingleChannelView({super.key});
  10. @override
  11. State<SingleChannelView> createState() => _SingleChannelViewState();
  12. }
  13. class _SingleChannelViewState extends State<SingleChannelView> {
  14. late final LiveShareDateProxy dataProxy;
  15. LiveController get controller => dataProxy.controller;
  16. LiveControllerSingleIOAdapter get adapter =>
  17. controller.adapter! as LiveControllerSingleIOAdapter;
  18. InAppWebViewController get wvController => adapter.webViewController!;
  19. @override
  20. void initState() {
  21. super.initState();
  22. }
  23. @override
  24. void didChangeDependencies() {
  25. dataProxy = LiveShareDateProxy.of(context)!;
  26. controller.adapter = LiveControllerSingleIOAdapter();
  27. super.didChangeDependencies();
  28. }
  29. @override
  30. Widget build(BuildContext context) {
  31. return _buildWebView();
  32. }
  33. Widget _buildWebView() {
  34. return InAppWebView(
  35. initialFile: "assets/wwwroot/source.html",
  36. initialOptions: InAppWebViewGroupOptions(
  37. crossPlatform: InAppWebViewOptions(
  38. mediaPlaybackRequiresUserGesture: false,
  39. disableHorizontalScroll: true,
  40. disableVerticalScroll: true,
  41. allowFileAccessFromFileURLs: true,
  42. allowUniversalAccessFromFileURLs: true,
  43. ),
  44. ),
  45. onWebViewCreated: (c) {
  46. adapter.webViewController = c;
  47. c.addJavaScriptHandler(handlerName: 'onReady', callback: _onReady);
  48. c.addJavaScriptHandler(handlerName: 'onStart', callback: _onStart);
  49. c.addJavaScriptHandler(handlerName: 'onStop', callback: _onStop);
  50. c.addJavaScriptHandler(handlerName: 'onTimeout', callback: _onTimeout);
  51. c.addJavaScriptHandler(handlerName: 'onError', callback: _onError);
  52. c.addJavaScriptHandler(handlerName: 'onBuffering', callback: _onError);
  53. },
  54. onLoadStop: (c, url) {},
  55. onConsoleMessage: (c, consoleMessage) {
  56. print(
  57. "[WebView Console][${consoleMessage.messageLevel}] ${consoleMessage.message}");
  58. },
  59. );
  60. }
  61. dynamic _onReady(List args) {
  62. final url = controller.source.url;
  63. wvController.evaluateJavascript(source: "load('$url')");
  64. controller.ready.emit(this, null);
  65. }
  66. dynamic _onStart(List args) {
  67. controller.playStarted.emit(this, null);
  68. }
  69. dynamic _onStop(List args) {
  70. controller.playStopped.emit(this, null);
  71. }
  72. dynamic _onTimeout(List args) {
  73. controller.timeout.emit(this, null);
  74. }
  75. dynamic _onError(List args) {
  76. final error = args.first;
  77. controller.errorOccurred.emit(
  78. this,
  79. FLivePlayerException(error.code, error.msg),
  80. );
  81. }
  82. }