import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:frequency_app/core/constants/app_colors.dart';
import 'package:video_player/video_player.dart';
import 'package:chewie/chewie.dart';
/// **Video Player Controller Provider**
final videoPlayerControllerProvider = FutureProvider.autoDispose((ref) async {
final controller = VideoPlayerController.networkUrl(
Uri.parse('https://flutter.github.io/assets-for-ap ... os/bee.mp4'),
videoPlayerOptions: VideoPlayerOptions(
allowBackgroundPlayback: false,
mixWithOthers: true,
),
);
await controller.initialize();
// await controller.play();
controller.setLooping(true);
/// **Listener to track progress and buffering**
controller.addListener(() {
final videoValue = controller.value;
final currentPosition = videoValue.position.inMilliseconds;
final duration = videoValue.duration.inMilliseconds;
if (videoValue.isBuffering) {
print("Video is buffering...");
ref.read(isBufferingProvider.notifier).state = true;
} else if (videoValue.isPlaying) {
ref.read(isBufferingProvider.notifier).state = false;
}else {
ref.read(isBufferingProvider.notifier).state = false;
ref.read(playPauseProvider.notifier).resumeAfterBuffering(controller); // Resume video after buffering
}
ref.read(videoProgressProvider.notifier).state =
videoValue.duration.inMilliseconds > 0
? videoValue.position.inMilliseconds / videoValue.duration.inMilliseconds
: 0.0;
if (videoValue.isPlaying && currentPosition > 500 && currentPosition < duration) {
ref.read(isBufferingProvider.notifier).state = false;
}
if (!controller.value.isBuffering &&
!controller.value.isPlaying) {
controller.play();
}
final progress = duration > 0 ? currentPosition / duration : 0.0;
ref.read(videoProgressProvider.notifier).state = progress;
});
ref.onDispose(() {
controller.pause();
controller.dispose();
});
return controller;
});
/// **Chewie Controller Provider**
final chewieControllerProvider = FutureProvider.autoDispose((ref) async {
final videoController = await ref.watch(videoPlayerControllerProvider.future);
if (!videoController.value.isInitialized) {
await videoController.initialize();
}
final chewieController = ChewieController(
videoPlayerController: videoController,
autoPlay: false,
looping: true,
showControls: true,
showControlsOnInitialize: true,
aspectRatio: videoController.value.aspectRatio > 0 ? videoController.value.aspectRatio : 16 / 9,
allowFullScreen: true,
allowMuting: true,
allowPlaybackSpeedChanging: true,
customControls: CustomChewieControls(),
progressIndicatorDelay: Duration.zero,
);
ref.onDispose(() {
chewieController.dispose();
});
return chewieController;
});
class CustomChewieControls extends ConsumerWidget {
const CustomChewieControls({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final videoController = ChewieController.of(context).videoPlayerController;
final isPlaying = ref.watch(playPauseProvider);
final isMuted = ref.watch(muteProvider);
return Stack(
children: [
//
Positioned.fill(
child: Container(color: Colors.black.withOpacity(0.3)),
),
//
Align(
alignment: Alignment.bottomCenter,
child: Padding(
padding: const EdgeInsets.only(bottom: 10.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
IconButton(
icon: Icon(Icons.fullscreen, color: Colors.white),
onPressed: () => ChewieController.of(context).enterFullScreen(),
),
],
),
),
),
],
);
}
}
< /code>
Ich habe versucht, den System UI -Stil beim Vollbild -Exit restaurieren zu>