我有一个视频预览小部件,它接受字符串 url 或视频文件。如果参数是一个字符串,它会从在线/缓存中下载文件。有了这个想法,我的实现如下:
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:hero/helpers/cache_manager/cache_manager.dart';
import 'package:video_player/video_player.dart';
import 'package:chewie/chewie.dart';
class WaveVideoPreview extends StatefulWidget {
final File? videoFile;
final String? videoUrl;
WaveVideoPreview({this.videoFile, this.videoUrl});
@override
_WaveVideoPreviewState createState() => _WaveVideoPreviewState();
}
class _WaveVideoPreviewState extends State<WaveVideoPreview> {
late VideoPlayerController? _controller;
late ChewieController _chewieController;
void initState() {
super.initState();
_initAsync();
}
void _initAsync() async {
File? _videoFile = widget.videoFile;
if (_videoFile == null) {
_videoFile = await getVideo(_videoFile);
}
_controller = VideoPlayerController.file(_videoFile!)
..initialize().then((_) {
setState(() {
_chewieController = ChewieController(
videoPlayerController: _controller!,
aspectRatio: _controller!.value.aspectRatio,
autoPlay: false,
looping: true,
allowFullScreen: false,
);
});
});
}
Future<File?> getVideo(File? _videoFile) async {
_videoFile = await MyCache.getVideo(widget.videoUrl!);
return _videoFile;
}
@override
Widget build(BuildContext context) {
return Container(
height: 200.0,
child: (_controller?.value.isInitialized ?? false)
? Chewie(
controller: _chewieController,
)
: SizedBox.shrink(),
);
}
@override
void dispose() {
_controller!.dispose();
_chewieController.dispose();
super.dispose();
}
}
与
static Future<File?> getVideo(String url) async {
DefaultCacheManager _cacheManager = DefaultCacheManager();
File? file = await _cacheManager.getSingleFile(url);
return file;
}
哪个抛出错误:
════════ Exception caught by widgets library ═══════════════════════════════════
The following LateError was thrown building WaveVideoPreview(dirty, state: _WaveVideoPreviewState#659ef):
LateInitializationError: Field '_controller@1875314998' has not been initialized.
The relevant error-causing widget was
WaveVideoPreview
lib/…/widget/wave_tile.dart:84
When the exception was thrown, this was the stack
#0 _WaveVideoPreviewState._controller (package:hero/screens/home/home_screens/views/waves/widget/video/wave_video_preview.dart)
package:hero/…/video/wave_video_preview.dart:1
#1 _WaveVideoPreviewState.build
package:hero/…/video/wave_video_preview.dart:57
有人知道怎么回事吗?我试过在可空和不可空之间更改视频播放器,但仍然无济于事。正如你所看到的,我有一个空检查,但仍然没有。
_initAsync
正在使用异步,它需要一些帧来初始化控制器。
为此使用 FutureBuilder 会更好。或者使它们可以为空,并在使用它时进行空检查。
VideoPlayerController? _controller;
ChewieController? _chewieController;
请检查您项目的minSdkVersion。 对我来说,因为添加包后,我只是热重新加载应用程序,视频显示失败而没有抛出 minSdkVersion 错误。 一旦我停止应用程序,运行“Flutter Clean”然后再次构建应用程序,它就会抛出错误,要求 minSdkVersion 至少为 24,而你的至少为 21。将其更改为 24 使其对我有用。