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!),
          ),
        ),
      ),
    );
  }
}