Flutter网页视频选择展示插件web_video_pick_show的使用

简介

web_video_pick_show 是一个用于在网页端选择和展示视频的 Flutter 插件。它可以帮助开发者轻松地实现视频的选择、播放和管理功能。


注意事项

警告:
该插件仅适用于 Web 平台,并且大量使用了 html.File。在其他平台上使用此包会导致编译时错误,此问题将在未来的版本中解决。


视频选择

单个视频选择

final _controller = WebVideoPickerController();

await controller.pickVideo();

// 或者
await controller.pickMultipleVideo();

// 确保处理 WebVideoPickShowException 异常

_controller.dispose(); // 在 Stateful Widget 的 dispose 方法中调用以避免内存泄漏

多个视频选择

与单个视频选择类似,只需调用 pickMultipleVideo() 方法即可。


视频展示

通过 ListenableBuilder 来监听控制器的状态变化,并根据数据渲染视频项。

ListenableBuilder(
  listenable: controller,
  builder: (context, _) {
    final data = controller.data;
    return ... // 渲染视频项
  },
);

示例效果:

ExampleImage

如上图所示,两个红色框表示已选择的视频。您可以对这些视频进行以下操作:

controller.play(file); // 播放指定文件
controller.remove(index); // 删除指定索引的视频
controller.add(file); // 添加单个视频
controller.addMany([file1, file2]); // 批量添加多个视频
controller.addRemoveManually((item) => manage and return manually); // 手动管理添加或删除
controller.clear(); // 清空所有视频
controller.isVideoPlaying(fileWhichNeedToBeCheckedWhetherPlaying); // 检查是否正在播放某个视频

文件相等性判断

为了检查两个文件是否相等,扩展了 html.File 类:

html.File file1;
html.File file2;
print("file1.uniqueValue() == file2.uniqueValue()");

视频播放

使用内置播放器

EasyWebVideoShowWidget(
  controller: _controller,
),

自定义播放器

如果视频是从其他来源获取的,则可以使用自定义播放器:

CustomWebVideoShowWidget(
  uniqueKey: ValueKey(someUniqueValueToDifferentiateTwoFile),
  file: fileWhichMightBePickedFromSomeOtherSource,
),

错误处理

捕获并处理 WebVideoPickShowException 异常:

try {
  // Some action
} on WebVideoPickShowException catch (e, s) {
  // 使用 e.withoutOppsie() 而不是 e.toString()
  // 否则错误信息会显示为:"Oppsie! File not found!"
} catch (e, s) {
  // Handle It
}

这是一个故意设计的小 Bug,目的是提醒开发者想起某位朋友的名字。


完整示例代码

以下是完整的示例代码,展示了如何使用 web_video_pick_show 插件:

import 'dart:developer';

import 'package:example/show_custom_toast.dart';
import 'package:flutter/material.dart';
import 'package:web_video_pick_show/web_video_pick_show.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final _controller = WebVideoPickerController();

  [@override](/user/override)
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: Scaffold(
        body: SafeArea(
          child: Column(
            children: [
              WebVideoPickerButton(controller: _controller),
              WebVideoPickedItemCard(controller: _controller),
              EasyWebVideoShowWidget(controller: _controller),
            ],
          ),
        ),
      ),
    );
  }
}

class WebVideoPickerButton extends StatelessWidget {
  final WebVideoPickerController controller;

  const WebVideoPickerButton({super.key, required this.controller});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      children: [
        TextButton(
          onPressed: () async {
            _handleException(context, () async {
              await controller.pickVideo();
            });
          },
          child: const Text("Add"),
        ),
        TextButton(
          onPressed: () {
            _handleException(context, () async {
              await controller.pickMultipleVideo();
            });
          },
          child: const Text("Add Multiple"),
        ),
      ],
    );
  }

  void _handleException(BuildContext context, Future<void> Function() action) async {
    final scaffold = ScaffoldMessenger.of(context);
    try {
      await action();
    } on WebVideoPickShowException catch (e, s) {
      if (e.type == WebVideoPickShowExceptionType.noVideoPicked) return;
      scaffold.showSnackBar(errorSnackBar(e.toString()));
      log(s.toString());
    } catch (e, s) {
      scaffold.showSnackBar(errorSnackBar(e.toString()));
      log(s.toString());
    }
  }
}

class WebVideoPickedItemCard extends StatelessWidget {
  final WebVideoPickerController controller;

  const WebVideoPickedItemCard({super.key, required this.controller});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return ListenableBuilder(
      listenable: controller,
      builder: (context, _) {
        final data = controller.data;
        return Row(
          key: ValueKey(controller.data),
          children: [
            for (int i = 0; i < data.length; i++)
              Builder(builder: (context) {
                final isPlaying = controller.isVideoPlaying(data[i]);
                return Container(
                  color: Colors.red,
                  margin: const EdgeInsets.only(left: 20),
                  height: 250,
                  width: 250,
                  child: Column(
                    children: [
                      const Spacer(),
                      TextButton(
                        onPressed: () {
                          controller.remove(i);
                        },
                        child: const Text("Delete"),
                      ),
                      const Spacer(),
                      TextButton(
                        onPressed: () {
                          if (isPlaying) return;
                          controller.play(data[i]);
                        },
                        child: Text(isPlaying ? "Is Playing" : "Play"),
                      ),
                      const Spacer(),
                      Text(data[i].name),
                      const Spacer(),
                    ],
                  ),
                );
              }),
          ],
        );
      },
    );
  }
}
1 回复

更多关于Flutter网页视频选择展示插件web_video_pick_show的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


web_video_pick_show 是一个 Flutter 插件,用于在 Web 平台上选择并展示视频。它允许用户从设备中选择视频文件,并在网页上播放。以下是如何使用 web_video_pick_show 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 web_video_pick_show 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  web_video_pick_show: ^0.0.1  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

2. 导入插件

在你的 Dart 文件中导入 web_video_pick_show 插件:

import 'package:web_video_pick_show/web_video_pick_show.dart';

3. 选择并展示视频

使用 WebVideoPickShow 类来选择和展示视频。以下是一个简单的示例:

import 'package:flutter/material.dart';
import 'package:web_video_pick_show/web_video_pick_show.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: VideoPickerScreen(),
    );
  }
}

class VideoPickerScreen extends StatefulWidget {
  @override
  _VideoPickerScreenState createState() => _VideoPickerScreenState();
}

class _VideoPickerScreenState extends State<VideoPickerScreen> {
  String? _videoUrl;

  Future<void> _pickAndShowVideo() async {
    try {
      final videoUrl = await WebVideoPickShow.pickAndShowVideo();
      setState(() {
        _videoUrl = videoUrl;
      });
    } catch (e) {
      print("Error picking video: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Web Video Pick & Show'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            if (_videoUrl != null)
              VideoPlayerWidget(videoUrl: _videoUrl!),
            ElevatedButton(
              onPressed: _pickAndShowVideo,
              child: Text('Pick and Show Video'),
            ),
          ],
        ),
      ),
    );
  }
}

class VideoPlayerWidget extends StatelessWidget {
  final String videoUrl;

  VideoPlayerWidget({required this.videoUrl});

  @override
  Widget build(BuildContext context) {
    return Container(
      width: 300,
      height: 200,
      child: VideoPlayer(
        videoUrl: videoUrl,
      ),
    );
  }
}

4. 运行应用

确保你的 Flutter 项目已经配置为支持 Web 平台。然后运行以下命令来启动应用:

flutter run -d chrome
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!