Flutter 视频video_player与缓存flutter_cache_manager
这里写自定义目录标题
1. 依赖
video_player: ^2.6.0
flutter_cache_manager: ^3.3.1
2. 缓存flutter_cache_manager
参考官方DefaultCacheManager代码,这里引入Config可以指定天数与最大个数.
文件名 video_cache.dart
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
/// The DefaultCacheManager that can be easily used directly. The code of
/// this implementation can be used as inspiration for more complex cache
/// managers.
class MyDefaultCacheManager extends CacheManager with ImageCacheManager {
static const key = 'libCachedImageData';
static final MyDefaultCacheManager _instance = MyDefaultCacheManager._();
factory MyDefaultCacheManager() {
return _instance;
}
MyDefaultCacheManager._()
: super(Config(
key,
stalePeriod: const Duration(days: 7),
maxNrOfCacheObjects: 20,
repo: JsonCacheInfoRepository(databaseName: key),
fileService: HttpFileService(),
));
}
3. 视频video_player
使用 await MyDefaultCacheManager().getSingleFile(url)) 即可
import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';
import 'video_cache.dart';
// main.dart可以打开
// void main() {
// runApp(MyApp());
// }
class MyApp extends StatefulWidget {
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
late VideoPlayerController controller;
bool isInitController = false;
List mediaList = [
{'type': 'video', 'url': 'https://static.ybhospital.net/test-video-10.MP4'},
{
'type': 'image',
'url': 'https://img-home.csdnimg.cn/images/20230817060240.png'
},
{'type': 'video', 'url': 'https://static.ybhospital.net/test-video-6.mp4'},
{'type': 'video', 'url': 'https://static.ybhospital.net/test-video-4.mp4'}
];
int index = 0;
void initState() {
super.initState();
initController();
}
initController() async {
isInitController = false;
controller = VideoPlayerController.file(
await MyDefaultCacheManager().getSingleFile(mediaList[index]['url']))
..initialize().then((_) {
setState(() {
isInitController = true;
});
controller.addListener(_videoListener);
controller.play();
});
}
void dispose() {
if (isInitController != false) {
controller.removeListener(_videoListener);
controller.dispose();
}
super.dispose();
}
_videoListener() {
if (isInitController == false) return;
if (controller.value.position == controller.value.duration) {
next();
}
}
Widget build(BuildContext context) {
return MaterialApp(
title: 'Video Player Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
body: Center(
child: Container(
child: mediaList[index]['type'] == 'video'
? (isInitController
? AspectRatio(
aspectRatio: controller.value.aspectRatio,
child: VideoPlayer(controller),
)
: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: const [
CircularProgressIndicator(),
SizedBox(height: 20),
Text('Loading'),
],
))
: Image.network(mediaList[index]['url']),
),
),
),
);
}
next() {
setState(() {
if (isInitController != false && controller.value.isInitialized) {
isInitController = false;
controller.removeListener(_videoListener);
controller.dispose();
}
index++;
if (index >= mediaList.length) {
index = 0;
}
if (mediaList[index]['type'] == 'video') {
initController();
} else {
Future.delayed(Duration(seconds: 10), next);
}
});
}
void prev() {
setState(() {
if (index > 0) {
index--;
} else {
index = mediaList.length - 1;
}
if (mediaList[index]['type'] == 'video') {
initController();
} else {
Future.delayed(Duration(seconds: 10), next);
}
});
}
}