I was making a-la Instagram grid view. Every time when I picked a new file I should update my thumbnail.
But my Stateful widget was not recognizing the update.
The dispose method wasn't launching.
Finally I came up with this.
Hope this will help someone.
class _SelectedVideo extends StatefulWidget {
const _SelectedVideo({
Key? key,
required this.file,
}) : super(key: key);
final File file;
@override
State<_SelectedVideo> createState() => _SelectedVideoState();
}
class _SelectedVideoState extends State<_SelectedVideo> {
VideoPlayerController? _controller;
void _initVideoPlayer(File file) async {
_controller = VideoPlayerController.file(
file,
);
await _controller!.initialize();
_controller!.setVolume(0);
_controller!.play();
setState(() {});
}
@override
void initState() {
super.initState();
_initVideoPlayer(widget.file);
}
@override
void didUpdateWidget(covariant _SelectedVideo oldWidget) {
// I'm disposing controller all the time when widget updates
_controller?.dispose();
_initVideoPlayer(widget.file);
super.didUpdateWidget(oldWidget);
}
@override
void dispose() {
_controller?.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
if (_controller == null) return Container();
return Container(
color: Colors.black,
height: 375,
width: double.infinity,
child: FittedBox(
fit: BoxFit.cover,
clipBehavior: Clip.hardEdge,
child: SizedBox(
width: _controller!.value.size.width,
height: _controller!.value.size.height,
child: AspectRatio(
aspectRatio: _controller!.value.aspectRatio,
child: VideoPlayer(_controller!),
),
),
),
);
}
}