Flutter轮播视图插件flutter_reels_viewer的使用
Flutter轮播视图插件flutter_reels_viewer的使用
Flutter Reels Viewer
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
更多关于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');
},
),
),
);
}
}
在这个示例中:
- 我们定义了一个包含图片URL的列表
imageUrls
。 - 使用
FlutterReelsViewer
小部件来显示这些图片。 - 设置了轮播视图的一些属性,如宽度、高度、是否自动播放、指示器的颜色、大小、间距、圆角等。
onPageChanged
回调函数用于处理页面更改事件,这里我们只是简单地打印当前页面的索引。
你可以根据需要调整这些属性来适应你的应用需求。记得替换 imageUrls
列表中的图片URL为你自己的图片资源。