import 'package:flutter/material.dart'; import 'package:logging/logging.dart'; import 'package:media_kit/media_kit.dart'; import 'package:media_kit_video/media_kit_video.dart'; class MediaKitAvControl extends StatefulWidget { final String videoUrl; final double? width; final double? height; const MediaKitAvControl({ super.key, required this.videoUrl, required this.width, required this.height, }); @override State createState() => _MediaKitAvControlState(); } class _MediaKitAvControlState extends State { static final _logger = Logger('$MediaKitAvControl'); final player = Player(); VideoController? controller; var needToOpen = true; @override void initState() { super.initState(); Future.microtask(() async { _logger.info('initializing'); controller = await VideoController.create(player); _logger.info('initialized'); if (context.mounted) { setState(() {}); } }); } @override void dispose() { Future.microtask(() async { await controller?.dispose(); await player.dispose(); }); super.dispose(); } @override void deactivate() { player.pause(); super.deactivate(); } void toggleVideoPlay() async { _logger.fine('Toggling play on: ${widget.videoUrl}'); if (needToOpen) { await player.open(Media(widget.videoUrl), play: false); needToOpen = false; } player.playOrPause(); setState(() {}); } void resetPlay() async { await player.pause(); await player.seek(Duration.zero); await player.play(); setState(() {}); } double? get height => widget.height == null ? null : widget.height! - 50; double? get width => widget.width; @override Widget build(BuildContext context) { print('Building MediaKit Control'); if (controller == null) { return const Center( child: CircularProgressIndicator(), ); } return GestureDetector( onTap: toggleVideoPlay, child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Expanded( child: Video( controller: controller, width: width, height: height, ), ), Row( children: [ IconButton( icon: player.state.playing ? const Icon(Icons.pause) : const Icon(Icons.play_arrow), onPressed: toggleVideoPlay, ), IconButton(onPressed: resetPlay, icon: const Icon(Icons.replay)), ], ) ], ), ); } }