70 lines
1.9 KiB
Dart
70 lines
1.9 KiB
Dart
|
import 'dart:io';
|
||
|
|
||
|
import 'package:flutter/material.dart';
|
||
|
import 'package:photo_gallery/photo_gallery.dart';
|
||
|
import 'package:video_player/video_player.dart';
|
||
|
|
||
|
class VideoProvider extends StatefulWidget {
|
||
|
final String mediumId;
|
||
|
|
||
|
const VideoProvider({
|
||
|
required this.mediumId,
|
||
|
});
|
||
|
|
||
|
@override
|
||
|
_VideoProviderState createState() => _VideoProviderState();
|
||
|
}
|
||
|
|
||
|
class _VideoProviderState extends State<VideoProvider> {
|
||
|
VideoPlayerController? _controller;
|
||
|
File? _file;
|
||
|
|
||
|
@override
|
||
|
void initState() {
|
||
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||
|
initAsync();
|
||
|
});
|
||
|
super.initState();
|
||
|
}
|
||
|
|
||
|
Future<void> initAsync() async {
|
||
|
try {
|
||
|
_file = await PhotoGallery.getFile(mediumId: widget.mediumId);
|
||
|
_controller = VideoPlayerController.file(_file!);
|
||
|
_controller?.initialize().then((_) {
|
||
|
// Ensure the first frame is shown after the video is initialized, even before the play button has been pressed.
|
||
|
setState(() {});
|
||
|
});
|
||
|
} catch (e) {
|
||
|
print("Failed : $e");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@override
|
||
|
Widget build(BuildContext context) {
|
||
|
return _controller == null || !_controller!.value.isInitialized
|
||
|
? Container()
|
||
|
: Column(
|
||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||
|
children: <Widget>[
|
||
|
AspectRatio(
|
||
|
aspectRatio: _controller!.value.aspectRatio,
|
||
|
child: VideoPlayer(_controller!),
|
||
|
),
|
||
|
TextButton(
|
||
|
onPressed: () {
|
||
|
setState(() {
|
||
|
_controller!.value.isPlaying
|
||
|
? _controller!.pause()
|
||
|
: _controller!.play();
|
||
|
});
|
||
|
},
|
||
|
child: Icon(
|
||
|
_controller!.value.isPlaying ? Icons.pause : Icons.play_arrow,
|
||
|
),
|
||
|
),
|
||
|
],
|
||
|
);
|
||
|
}
|
||
|
}
|