ijkplayer.dart 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. import 'dart:async';
  2. import 'dart:io';
  3. import 'dart:typed_data';
  4. import 'package:flutter/material.dart';
  5. import 'package:flutter/services.dart';
  6. import 'package:flutter_ijkplayer/src/ijkplayer_controller_mixin.dart';
  7. import 'error.dart';
  8. import 'package:flutter_ijkplayer/src/helper/logutil.dart';
  9. import 'package:flutter_ijkplayer/src/entity/video_info.dart';
  10. import 'widget/controller_widget_builder.dart';
  11. import 'widget/ijkplayer_builder.dart';
  12. import 'engine/ijk_controller_manager.dart';
  13. part 'controller.dart';
  14. part 'ijk_event_channel.dart';
  15. part 'engine/manager.dart';
  16. /// Main Classes of Library
  17. class IjkPlayer extends StatefulWidget {
  18. final IjkMediaController mediaController;
  19. /// See [DefaultIJKControllerWidget]
  20. final IJKControllerWidgetBuilder controllerWidgetBuilder;
  21. /// See [buildDefaultIjkPlayer]
  22. final IJKTextureBuilder textureBuilder;
  23. /// Main Classes of Library
  24. const IjkPlayer({
  25. Key key,
  26. @required this.mediaController,
  27. this.controllerWidgetBuilder = defaultBuildIjkControllerWidget,
  28. this.textureBuilder = buildDefaultIjkPlayer,
  29. }) : super(key: key);
  30. @override
  31. IjkPlayerState createState() => IjkPlayerState();
  32. }
  33. /// State of [IjkPlayer]
  34. class IjkPlayerState extends State<IjkPlayer> {
  35. /// see [IjkMediaController]
  36. IjkMediaController controller;
  37. GlobalKey _wrapperKey = GlobalKey();
  38. @override
  39. void initState() {
  40. super.initState();
  41. controller = widget.mediaController ?? IjkMediaController();
  42. }
  43. @override
  44. void didUpdateWidget(IjkPlayer oldWidget) {
  45. super.didUpdateWidget(oldWidget);
  46. }
  47. @override
  48. void dispose() {
  49. super.dispose();
  50. }
  51. @override
  52. Widget build(BuildContext context) {
  53. var video = StreamBuilder<int>(
  54. stream: controller.textureIdStream,
  55. initialData: controller.textureId,
  56. builder: (context, snapshot) {
  57. if (!snapshot.hasData) {
  58. return Container();
  59. }
  60. var id = snapshot.data;
  61. return StreamBuilder<VideoInfo>(
  62. stream: controller.videoInfoStream,
  63. initialData: controller.videoInfo,
  64. builder: (context, videoInfoSnapShot) {
  65. return _buildTexture(id, videoInfoSnapShot.data);
  66. });
  67. },
  68. );
  69. var controllerWidget = widget.controllerWidgetBuilder?.call(controller);
  70. Widget stack = Stack(
  71. children: <Widget>[
  72. IgnorePointer(child: video),
  73. controllerWidget,
  74. ],
  75. );
  76. // return stack;
  77. return Material(
  78. child: stack,
  79. color: Colors.black,
  80. );
  81. }
  82. Widget _buildTexture(int id, VideoInfo info) {
  83. if (widget?.textureBuilder != null) {
  84. var texture = widget.textureBuilder.call(context, controller, info);
  85. return _IjkPlayerWrapper(
  86. child: texture,
  87. globalKey: _wrapperKey,
  88. controller: controller,
  89. );
  90. }
  91. if (id == null) {
  92. return Container(
  93. color: Colors.black,
  94. );
  95. }
  96. return Container(
  97. color: Colors.black,
  98. child: _IjkPlayerWrapper(
  99. globalKey: _wrapperKey,
  100. controller: controller,
  101. child: Texture(
  102. textureId: id,
  103. ),
  104. ),
  105. );
  106. }
  107. }
  108. class _IjkPlayerWrapper extends StatefulWidget {
  109. final Widget child;
  110. final GlobalKey globalKey;
  111. final IjkMediaController controller;
  112. const _IjkPlayerWrapper({
  113. @required this.globalKey,
  114. @required this.child,
  115. Key key,
  116. @required this.controller,
  117. }) : super(key: key);
  118. @override
  119. __IjkPlayerWrapperState createState() => __IjkPlayerWrapperState();
  120. }
  121. class __IjkPlayerWrapperState extends State<_IjkPlayerWrapper> {
  122. @override
  123. void initState() {
  124. super.initState();
  125. widget.controller?.attach(widget.globalKey);
  126. }
  127. @override
  128. void dispose() {
  129. widget.controller?.detach(widget.globalKey);
  130. super.dispose();
  131. }
  132. @override
  133. Widget build(BuildContext context) {
  134. return RepaintBoundary(
  135. child: widget.child,
  136. key: widget.globalKey,
  137. );
  138. }
  139. }