video_list.dart 3.3 KB

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