Flutter轮播视图插件flutter_reels_viewer的使用

发布于 1周前 作者 phonegap100 来自 Flutter

Flutter轮播视图插件flutter_reels_viewer的使用

Flutter Reels Viewer

pub GitHub latest tag (with filter) GitHub stars License

Flutter Reels Viewer 是一个高度可定制化的组件,用于在垂直滚动列表中展示多个视频。它为观看短视频提供了流畅的滚动体验,类似于Facebook、Instagram和YouTube等平台。

预览

Demo APK

你可以通过这里下载演示应用程序。

安装

在你的 pubspec.yaml 文件中的依赖项部分添加最新版本的包:

dependencies:
  flutter:
    sdk: flutter

  flutter_reels_viewer: ^1.0.0

然后在终端运行:

$ flutter pub get

使用方法

视频列表可以仅包含视频

List<dynamic> videos = [
  'https://assets.mixkit.co/videos/39767/39767-720.mp4',
  'https://assets.mixkit.co/videos/34487/34487-720.mp4',
  'https://assets.mixkit.co/videos/34404/34404-720.mp4'
];

或者包含带有封面图片的视频

List<dynamic> videosWithImage = [
  {
    'video': 'https://assets.mixkit.co/videos/39767/39767-720.mp4',
    'image': 'https://assets.mixkit.co/videos/39767/39767-thumb-360-0.jpg'
  },
  {
    'video': 'https://assets.mixkit.co/videos/34487/34487-720.mp4',
    'image': 'https://assets.mixkit.co/videos/34487/34487-thumb-360-0.jpg'
  },
  {
    'video': 'https://assets.mixkit.co/videos/34404/34404-720.mp4',
    'image': 'https://assets.mixkit.co/videos/34404/34404-thumb-360-0.jpg'
  },
];

简单示例

FlutterReelsViewer.network(
    height: MediaQuery.of(context).size.height,
    width: MediaQuery.of(context).size.width,
    videoSourceList: videos, // OR videosWithImage
    scrollDirection: Axis.vertical,
    preloadPagesCount: 2,
    videoBoxFit: BoxFit.cover,
    playInLoop: true,
    showControlsOverlay: true,
    showVideoProgressIndicator: true,
    onPageChanged: (videoPlayerController, index) {},
    getCurrentVideoController: (videoPlayerController) {},
    overlayBuilder: (context, index) => MyCustomVideoOverlay(index)
);

变体

Variant Description
FlutterReelsViewer.network(...) 播放来自网络视频URL列表的视频
FlutterReelsViewer.asset(...) 播放来自资产视频列表的视频
FlutterReelsViewer.file(...) 播放来自视频文件列表的视频

属性

FlutterReelsViewer(...)

Type Property Description Default
double height 设置Widget的高度 -
double width 设置Widget的宽度 -
List< dynamic > videoSourceList 视频源列表 -
Axis scrollDirection 滚动方向 Axis.vertical
int preloadPagesCount 预加载页面数量 1
ScrollPhysics scrollPhysics 页面视图对用户输入的响应方式 平台约定
bool pageSnapping 是否启用页面捕捉 true
bool reverse 页面视图是否反向滚动 false
PreloadPageController pageController 获取更多控制权限 -
BoxFit videoBoxFit 设置视频缩放模式 BoxFit.fitWidth
bool playInLoop 循环播放视频 true
VideoPlayerOptions videoPlayerOptions 提供额外配置选项(如设置音频混合模式) -
Future<ClosedCaptionFile> closedCaptionFile 闭合字幕文件 -
Map<String, String> httpHeaders HTTP头(仅限VideoPlayerController.network -
VideoFormat formatHint 覆盖Android平台的通用文件格式 true
String package 加载资源的软件包名称(仅限asset视频) true
bool showControlsOverlay 启用点击视频时显示播放/暂停控件 true
bool showVideoProgressIndicator 显示视频底部的进度条 true
Function(controller, index) onPageChanged 监听页面变化及当前索引 -
Function(controller) getCurrentVideoController 获取当前播放视频的控制器 -
Function(context, index) overlayBuilder 设计自定义小部件作为视频上的覆盖层 -

示例代码

以下是一个完整的示例代码,展示了如何在Flutter应用中使用flutter_reels_viewer插件来创建一个简单的视频轮播视图。

import 'package:flutter/material.dart';
import 'package:flutter_reels_viewer/flutter_reels_viewer.dart';
// 假设有一个名为video_repository.dart的文件,其中包含了视频数据
import 'package:flutter_reels_viewer_example/video_repository.dart';

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.black,
      body: FlutterReelsViewer.network(
        height: MediaQuery.of(context).size.height,
        width: MediaQuery.of(context).size.width,
        videoSourceList: VideoRepository.videosWithPoster,
        scrollDirection: Axis.vertical,
        preloadPagesCount: 2,
        videoBoxFit: BoxFit.cover,
        playInLoop: true,
        showControlsOverlay: true,
        showVideoProgressIndicator: true,
        onPageChanged: (videoPlayerController, index) {},
        getCurrentVideoController: (videoPlayerController) {},
        overlayBuilder: (context, index) => MyCustomVideoOverlay(index),
      ),
    );
  }
}

class MyCustomVideoOverlay extends StatelessWidget {
  final int index;

  const MyCustomVideoOverlay(this.index, {super.key});

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: Row(
        crossAxisAlignment: CrossAxisAlignment.end,
        children: [
          Expanded(
            child: Column(
              children: [
                const Spacer(),
                Row(
                  children: [
                    CircleAvatar(
                      radius: 24,
                      backgroundImage: NetworkImage(
                          "https://generated.photos/vue-static/home/hero/${(index % 8) + 1}.png"),
                    ),
                    const SizedBox(width: 8.0),
                    Text(
                      "@User Name $index",
                      style: const TextStyle(
                        color: Colors.white,
                        fontSize: 16.0,
                        fontWeight: FontWeight.bold,
                      ),
                    )
                  ],
                ),
                const SizedBox(height: 8),
                const Text(
                  "A Flutter widget that displays multiple videos in a vertically scrollable list, providing a smooth scrolling experience while watching short videos...",
                  style: TextStyle(
                    color: Colors.white,
                    fontSize: 16.0,
                  ),
                )
              ],
            ),
          ),
          Wrap(
            alignment: WrapAlignment.end,
            crossAxisAlignment: WrapCrossAlignment.center,
            spacing: 20,
            direction: Axis.vertical,
            children: [
              IconText(
                const Icon(Icons.thumb_up, color: Colors.white, size: 38.0),
                "234",
                () {},
              ),
              IconText(
                const Icon(Icons.comment, color: Colors.white, size: 38.0),
                "57",
                () {},
              ),
              IconText(
                const Icon(Icons.share, color: Colors.white, size: 38.0),
                "342",
                () {},
              ),
              const Icon(Icons.more_vert, color: Colors.white, size: 38.0),
            ],
          )
        ],
      ),
    );
  }
}

class IconText extends StatelessWidget {
  final Icon icon;
  final String text;
  final Function onPressed;

  const IconText(this.icon, this.text, this.onPressed, {super.key});

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisSize: MainAxisSize.min,
      children: [
        IconButton(icon: icon, onPressed: () => onPressed()),
        Text(text, style: const TextStyle(color: Colors.white)),
      ],
    );
  }
}

这个例子创建了一个全屏的黑色背景Scaffold,并在其上放置了FlutterReelsViewer.network小部件,该小部件接收了一系列带有封面图像的视频,并以垂直滚动的方式展示它们。同时,我们还定义了一个自定义的覆盖层MyCustomVideoOverlay,它会在每个视频上方显示一些信息,例如用户名、简介以及点赞、评论和分享按钮等交互元素。


更多关于Flutter轮播视图插件flutter_reels_viewer的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter轮播视图插件flutter_reels_viewer的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用 flutter_reels_viewer 插件来实现轮播视图效果的代码示例。flutter_reels_viewer 是一个用于在 Flutter 应用中创建轮播视图的流行插件。

首先,确保在你的 pubspec.yaml 文件中添加依赖项:

dependencies:
  flutter:
    sdk: flutter
  flutter_reels_viewer: ^最新版本号  # 请替换为实际发布的最新版本号

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

接下来,在你的 Dart 文件中,你可以使用 FlutterReelsViewer 小部件来创建一个轮播视图。下面是一个完整的示例代码:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Reels Viewer Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final List<String> imageUrls = [
    'https://example.com/image1.jpg',
    'https://example.com/image2.jpg',
    'https://example.com/image3.jpg',
    // 添加更多图片URL
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Reels Viewer Demo'),
      ),
      body: Center(
        child: FlutterReelsViewer(
          images: imageUrls,
          width: double.infinity,
          height: 300,
          autoPlay: true,
          indicatorColor: Colors.white,
          indicatorActiveColor: Colors.blue,
          indicatorSize: 10.0,
          indicatorPadding: 5.0,
          indicatorSpace: 15.0,
          borderRadius: 20.0,
          loop: true,
          onPageChanged: (index) {
            print('Current page index: $index');
          },
        ),
      ),
    );
  }
}

在这个示例中:

  1. 我们定义了一个包含图片URL的列表 imageUrls
  2. 使用 FlutterReelsViewer 小部件来显示这些图片。
  3. 设置了轮播视图的一些属性,如宽度、高度、是否自动播放、指示器的颜色、大小、间距、圆角等。
  4. onPageChanged 回调函数用于处理页面更改事件,这里我们只是简单地打印当前页面的索引。

你可以根据需要调整这些属性来适应你的应用需求。记得替换 imageUrls 列表中的图片URL为你自己的图片资源。

回到顶部