import 'package:fl_clash/common/common.dart'; import 'package:fl_clash/enum/enum.dart'; import 'package:fl_clash/providers/providers.dart'; import 'package:fl_clash/state.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; class StartButton extends StatefulWidget { const StartButton({super.key}); @override State createState() => _StartButtonState(); } class _StartButtonState extends State with SingleTickerProviderStateMixin { late AnimationController _controller; bool isStart = false; @override void initState() { super.initState(); isStart = globalState.appState.runTime != null; _controller = AnimationController( vsync: this, value: isStart ? 1 : 0, duration: const Duration(milliseconds: 200), ); } @override void dispose() { _controller.dispose(); super.dispose(); } handleSwitchStart() { isStart = !isStart; updateController(); debouncer.call( DebounceTag.updateStatus, () { globalState.appController.updateStatus(isStart); }, duration: moreDuration, ); } updateController() { if (isStart) { _controller.forward(); } else { _controller.reverse(); } } @override Widget build(BuildContext context) { return Consumer( builder: (_, ref, child) { final state = ref.watch(startButtonSelectorStateProvider); if (!state.isInit || !state.hasProfile) { return Container(); } ref.listenManual( runTimeProvider.select((state) => state != null), (prev, next) { if (next != isStart) { isStart = next; updateController(); } }, fireImmediately: true, ); final textWidth = globalState.measure .computeTextSize( Text( utils.getTimeDifference( DateTime.now(), ), style: context.textTheme.titleMedium?.toSoftBold, ), ) .width + 16; return AnimatedBuilder( animation: _controller.view, builder: (_, child) { return SizedBox( width: 56 + textWidth * _controller.value, height: 56, child: FloatingActionButton( heroTag: null, onPressed: () { handleSwitchStart(); }, child: Row( children: [ Container( width: 56, height: 56, alignment: Alignment.center, child: AnimatedIcon( icon: AnimatedIcons.play_pause, progress: _controller, ), ), Expanded( child: ClipRect( child: OverflowBox( maxWidth: textWidth, child: Container( alignment: Alignment.centerLeft, child: child!, ), ), ), ), ], ), ), ); }, child: child, ); }, child: Consumer( builder: (_, ref, __) { final runTime = ref.watch(runTimeProvider); final text = utils.getTimeText(runTime); return Text( text, style: Theme.of(context) .textTheme .titleMedium ?.toSoftBold .copyWith(color: context.colorScheme.onPrimaryContainer), ); }, ), ); } }