【flutter better_player_plus实现普通播放器功能】

引入better_player_plus: ^1.1.5

dart 复制代码
import 'package:better_player_plus/better_player_plus.dart';

late BetterPlayerController _videoController;
@override
  void initState() {
    // TODO: implement initState
    super.initState();
    //BoxFit.contain + fullScreenByDefault=true + autoDetectFullscreenAspectRatio = true,设置后播放器播放时默认按视频的宽高比例放大填充父布局
    final betterPlayerConfiguration = BetterPlayerConfiguration(
          fit: BoxFit.contain,
          autoPlay: true,
          looping: true,
          fullScreenByDefault: true,
          autoDetectFullscreenAspectRatio: true,
          controlsConfiguration: const BetterPlayerControlsConfiguration(
            showControls: false, // 是否显示控制栏
            enableSkips: false, // 禁用快进/快退
          )
      );

     _videoController = BetterPlayerController(betterPlayerConfiguration,betterPlayerDataSource: dataSource);
     _videoController.addEventsListener(_videoListener);
    }

_videoListener(BetterPlayerEvent event) async {
    switch(event.betterPlayerEventType){
      case BetterPlayerEventType.initialized:
        setState(() {
          _isVideoInit = true;
          double? videoWidth = _videoController.videoPlayerController?.value.size?.width;
          double? videoHeight = _videoController.videoPlayerController?.value.size?.height;
          print('_videoWidth= $videoWidth  _videoHeight= $videoHeight');

          if(videoWidth != null && videoHeight != null){
            double aspectRatio = videoHeight / videoWidth;
            _logic.videoAspectRatio = aspectRatio;
          }
          _videoController.play();
        });
        break;
      case BetterPlayerEventType.progress:
        Duration res = _videoController.videoPlayerController!.value.position;
        Duration? totalDuration = _videoController.videoPlayerController?.value.duration;
        if (_videoController.isPlaying() == true && _key.currentState != null) {
          /// 减少build次数
          _key.currentState!.setPosition(
            position: res,
            totalDuration: totalDuration,
          );
        }
        break;
      case BetterPlayerEventType.bufferingStart:
        _isBuffering = true;
        break;
      case BetterPlayerEventType.bufferingEnd:
        _isBuffering = false;
        break;
        case BetterPlayerEventType.exception:
          esLoadingToast('视频加载失败');
          print('视频播放器问题:${_videoController.videoPlayerController!.value.errorDescription} =====');
        break;
        default:
          break;
    }
  }

@override
  void dispose() {
    // TODO: implement dispose
    _videoController.removeEventsListener(_videoListener);
    _videoController.dispose();
    super.dispose();
  }


@override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
      backgroundColor: Colors.black,
      body: BetterPlayer(controller: _videoController),
    );
  }

只配置fit: BoxFit.contain时,播放时显示区域虽然按视频比例,但是不会尽可能大的充满屏幕

BoxFit.contain + fullScreenByDefault=true + autoDetectFullscreenAspectRatio = true,播放时显示区域按视频比例比例尽可能大的充满屏幕

相关推荐
yuanlaile8 小时前
2026年全新Flutter 跨平台开发全栈学习资料整理
flutter·getx·鸿蒙 next·flutter开发鸿蒙·flutter入门实战·flutter全栈
恋猫de小郭19 小时前
Genkit Dart 1.0 发布,Flutter 原生的 AI Agent 终于完整了
android·前端·flutter
第10086个小白19 小时前
flutter桌面端打包方式(Inno Setup Compiler)版本
前端·flutter
陆断枫1 天前
Flutter 3.47 动画引擎盘点:Impeller 全平台,和那些"新特性"
flutter
程序员老刘1 天前
Flet 1.0 思路很好,可惜来晚了
flutter·ai编程·客户端
m0_738185822 天前
Flutter 鸿蒙化实战:qr_code_scanner_plus 适配 OpenHarmony,二维码扫描
flutter·华为·harmonyos·鸿蒙
恋猫de小郭2 天前
Flutter + EmbeddingGemma 2,谷歌发布完全端侧的 AI Edge Foresight
android·前端·flutter
君赏2 天前
基于 FlutterPatch 快速接入 Flutter 热更新
flutter
律宏阔3 天前
Dart FFI 内存管理:用 using + Arena 替代嵌套 try-finally
前端·flutter
律宏阔3 天前
Flutter 调用 Go:从 c-shared + ffigen 到 @Native + Native Assets 踩坑记录
前端·flutter