video_list.dart 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_ijkplayer/flutter_ijkplayer.dart';
  3. class VideoList extends StatefulWidget {
  4. @override
  5. _VideoListState createState() => _VideoListState();
  6. }
  7. class _VideoListState extends State<VideoList> {
  8. var list = <DataSource>[
  9. DataSource.network(
  10. "https://www.sample-videos.com/video123/mp4/360/big_buck_bunny_360p_30mb.mp4"),
  11. DataSource.network(
  12. "https://www.sample-videos.com/video123/mp4/360/big_buck_bunny_360p_30mb.mp4"),
  13. DataSource.asset("assets/sample1.mp4")
  14. ];
  15. var map = <DataSource, IjkMediaController>{};
  16. @override
  17. void initState() {
  18. super.initState();
  19. for (var data in list) {
  20. var controller = IjkMediaController();
  21. map[data] = controller;
  22. // controller.setDataSource(data);
  23. }
  24. }
  25. @override
  26. void dispose() {
  27. map.values.forEach((c) {
  28. c.dispose();
  29. });
  30. super.dispose();
  31. }
  32. @override
  33. Widget build(BuildContext context) {
  34. return Scaffold(
  35. appBar: AppBar(
  36. title: Text("列表中IJKPlayer"),
  37. ),
  38. body: ListView.separated(
  39. itemBuilder: _buildItem,
  40. separatorBuilder: (BuildContext context, int index) {
  41. return Container(
  42. height: 10.0,
  43. color: Colors.blue,
  44. );
  45. },
  46. itemCount: list.length,
  47. ),
  48. );
  49. }
  50. Widget _buildItem(BuildContext context, int index) {
  51. return AspectRatio(
  52. child: VideoItem(list[index]),
  53. aspectRatio: 1280 / 500,
  54. );
  55. }
  56. }
  57. class VideoItem extends StatefulWidget {
  58. final DataSource dataSource;
  59. VideoItem(this.dataSource);
  60. @override
  61. _VideoItemState createState() => _VideoItemState();
  62. }
  63. class _VideoItemState extends State<VideoItem> {
  64. IjkMediaController controller;
  65. var isInit = false;
  66. var isLoading = false;
  67. @override
  68. void initState() {
  69. super.initState();
  70. controller = IjkMediaController();
  71. }
  72. @override
  73. void dispose() {
  74. controller?.dispose();
  75. super.dispose();
  76. }
  77. @override
  78. Widget build(BuildContext context) {
  79. if (!isInit) {
  80. Widget stateButton = IconButton(
  81. icon: Icon(Icons.play_arrow),
  82. onPressed: _play,
  83. color: Colors.white,
  84. );
  85. if (isLoading) {
  86. stateButton = CircularProgressIndicator();
  87. }
  88. var center = Center(
  89. child: Container(
  90. width: 60.0,
  91. height: 60.0,
  92. child: stateButton,
  93. ),
  94. );
  95. return Stack(
  96. children: <Widget>[
  97. Container(
  98. color: Colors.black,
  99. ),
  100. center,
  101. ],
  102. );
  103. }
  104. var ijkPlayer = IjkPlayer(
  105. mediaController: controller,
  106. controllerWidgetBuilder: _buildControllerWidget,
  107. );
  108. return ijkPlayer;
  109. }
  110. void _play() async {
  111. setState(() {
  112. isLoading = true;
  113. });
  114. await controller.setDataSource(widget.dataSource, autoPlay: true);
  115. await controller.pauseOtherController();
  116. setState(() {
  117. isLoading = false;
  118. isInit = true;
  119. });
  120. }
  121. Widget _buildControllerWidget(IjkMediaController controller) {
  122. return DefaultIJKControllerWidget(
  123. controller: controller,
  124. verticalGesture: false,
  125. );
  126. }
  127. }
  128. class PauseOtherNotification extends Notification {}