import 'dart:async'; import 'package:PiliPlus/plugin/pl_player/controller.dart'; import 'package:flutter/material.dart'; import 'package:media_kit/media_kit.dart'; class PlayOrPauseButton extends StatefulWidget { final double? iconSize; final Color? iconColor; final PlPlayerController plPlayerController; const PlayOrPauseButton({ super.key, this.iconSize, this.iconColor, required this.plPlayerController, }); @override PlayOrPauseButtonState createState() => PlayOrPauseButtonState(); } class PlayOrPauseButtonState extends State with SingleTickerProviderStateMixin { late final AnimationController controller; late final StreamSubscription subscription; late Player player; @override void initState() { super.initState(); player = widget.plPlayerController.videoPlayerController!; controller = AnimationController( vsync: this, value: player.state.playing ? 1 : 0, duration: const Duration(milliseconds: 200), ); subscription = player.stream.playing.listen((playing) { if (playing) { controller.forward(); } else { controller.reverse(); } }); } @override void dispose() { subscription.cancel(); controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return SizedBox( width: 42, height: 34, child: GestureDetector( behavior: HitTestBehavior.opaque, onTap: () async { if (player.state.completed) { await player.seek(Duration.zero); player.play(); } else { player.playOrPause(); } }, child: Center( child: AnimatedIcon( semanticLabel: player.state.playing ? '暂停' : '播放', progress: controller, icon: AnimatedIcons.play_pause, color: Colors.white, size: 20, ), ), ), ); } }