Flutter video_player点击重新播放

视频播放完成之后,暂停视频,点击重新播放

dart 复制代码
import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';

class ListViewItemWidget extends StatefulWidget{

  @override
  State createState() {
    return _ListViewItemWidgetState();
  }
}

class _ListViewItemWidgetState extends State<ListViewItemWidget>{

  bool isPlay = false;
  bool isOver = false;
  late VideoPlayerController _controller;

  @override
  void initState() {
    _controller =  VideoPlayerController.network('https://sample-videos.com/video123/mp4/720/big_buck_bunny_720p_20mb.mp4')
        ..initialize().then((_){
          _controller.play();
          setState(() {
            _controller.pause();
          });
        })
        ..addListener(videoListener);
  }

  @override
  void dispose() {
    _controller.dispose();
    _controller.removeListener(videoListener);
    super.dispose();
  }

  void videoListener(){
    var curPlayPosition = _controller.value.position;
    var totalPlayTime = _controller.value.duration;
    if (curPlayPosition == totalPlayTime && curPlayPosition.toString() != "0:00:00.000000"){
      isOver = true;
      isPlay = false;
      _controller.initialize()
        ..then((_) {
          setState(() {

          });
        });

      setState(() {

      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        //未关注的才会显示为你推荐
        Row(
          children: [
            Container(
              width: MediaQuery.of(context).size.width - 50,
              height: 50,
              alignment: Alignment.centerLeft,
              padding: const EdgeInsets.only(left: 12.0),
              child: Text("为你推荐"),
            ),
            SizedBox(
              width: 50,
              height: 50,
              child: InkWell(
                child: Icon(Icons.close),
                onTap: (){
                  /**
                   * 关闭
                   */
                },
              ),
            )
          ],
        ),

        Stack(
          children: [
            Container(
              height: 220,
              color: Colors.blueGrey,
              margin: EdgeInsets.only(top: 10),
              child: Stack(
                children: [
                  Positioned.fill(child: GestureDetector(
                      child: AspectRatio(
                        child: VideoPlayer(_controller),
                        aspectRatio: _controller.value.aspectRatio,
                      )),
                  ),
                  Container(
                    height: 40,
                    child: Row(
                      crossAxisAlignment: CrossAxisAlignment.center,
                      children: [
                        /**
                         * 网络图片
                         */
                        // Image(image: Image.network(""))
                        Expanded(
                            flex: 1,
                            child:Icon(Icons.verified_user, color: Colors.white)
                        ),
                        Expanded(
                          flex: 6,
                          child:Column(
                            crossAxisAlignment: CrossAxisAlignment.start,
                            children: [
                              Text("userName", style: TextStyle(fontSize: 18, color: Colors.white),),
                              Text("userName", style: TextStyle(fontSize: 12, color: Colors.white),)
                            ],
                          ),
                        ),
                        Expanded(
                            flex: 1,
                            child: Text("关注",  style: TextStyle(fontSize: 12, color: Colors.white))
                        ),
                        Expanded(
                            flex: 1,
                            child:   Icon(Icons.menu, color: Colors.white)
                        )
                      ],
                    ),
                  ),
                  buildControllerWidget()
                ],
              ),

            ),
          ],
        ),

        Container(
          margin: EdgeInsets.only(top: 10),
          child: Row(
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              /**
               * 网络图片
               */
              // Image(image: Image.network(""))

              Expanded(
                  flex: 1,
                  child:Icon(Icons.favorite_border)
              ),
              Expanded(
                  flex: 1,
                  child:Icon(Icons.messenger_outline)
              ),
              Expanded(
                  flex: 1,
                  child:Icon(Icons.share_outlined)
              ),
              Expanded(
                flex: 4,
                child:Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                  ],
                ),
              ),
              Expanded(
                  flex: 1,
                  child:   Icon(Icons.collections_outlined)
              )
            ],
          ),
        ),
        Container(
          alignment: Alignment.centerLeft,
          padding: EdgeInsets.only(left: 18,top: 20),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Text("1732赞"),
              Text("hahhahah"),
              Text("总共23条评论"),
              Text("6天前")
            ],
          ),
        )
      ],
    );
  }

  //播放界面
  Widget buildControllerWidget(){
    if(isPlay){
      return Container(
        child: GestureDetector(
          onTap: (){
            _controller.pause();
            isPlay = false;
            setState(() {
            });
          },
        ),
      );
    }
    return  Positioned.fill(child: AspectRatio(
        aspectRatio: _controller.value.aspectRatio,
        child: Container(
          child: GestureDetector(
            onTap: (){
              if(isOver){
                isOver = false;
                _controller.play();
                isPlay = true;
                setState(() {
                });
              } else {
                _controller.play();
                isPlay = true;
                setState(() {
                });
              }
            },
            child: Icon(Icons.play_circle_fill, size: 44,),
          ),
        )),
    );
  }
}

pubspec.yaml依赖

dart 复制代码
  video_player: ^2.3.0

要求Android compileSdkVersion 为33

相关推荐
亘元有量-流量变现3 分钟前
ASO优化全流程实操指南:从基础到迭代,精准提升App曝光与转化
android·ios·harmonyos·aso优化·方糖试玩
李李李勃谦13 分钟前
Flutter 框架跨平台鸿蒙开发 - 家政服务预约平台
flutter·华为·harmonyos
唔6618 分钟前
flutter TextTheme 手机端适配验证
flutter·智能手机
Ww.xh22 分钟前
Flutter配置Gradle完整教程
flutter·gradle·android studio
彧翎Pro25 分钟前
跨平台开发新选择:Flutter与React Native深度对比
flutter·react native·react.js
私人珍藏库29 分钟前
【Android】GameNative 0.9.0 [特殊字符] 手机畅玩Steam游戏
android·游戏·智能手机·app·工具·软件·多功能
autumn200537 分钟前
Flutter 框架跨平台鸿蒙开发 - 本地商超优惠推送
flutter·华为·harmonyos
牛马11141 分钟前
Flutter BackdropFilter
flutter
autumn20051 小时前
Flutter 框架跨平台鸿蒙开发 - 互助服务
flutter·华为·harmonyos
诸神黄昏EX1 小时前
Android Safety 系列专题【篇七:Android AVF机制】
android