import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:wow_english/common/blocs/timerbloc/timer_bloc.dart'; import 'package:wow_english/common/extension/string_extension.dart'; import 'package:wow_english/common/widgets/timer_ticker.dart'; class TimerWidget extends StatelessWidget { const TimerWidget({super.key, required this.canSendSms}); final bool canSendSms; @override Widget build(BuildContext context) { return BlocProvider( create: (_) => TimerBloc(ticker: const TimerTicker()), child: TimerWidgetView(canSendSms: canSendSms,), ); } } class TimerWidgetView extends StatelessWidget { final bool canSendSms; const TimerWidgetView({super.key, required this.canSendSms}); @override Widget build(BuildContext context) { return BlocListener( listener: (context, s) { if (s is FinishedState) { ///重置计时器 context.read().add(ResetEvent()); } }, child: _buildCountdownWidget(), ); } Widget _buildCountdownWidget() => BlocBuilder( buildWhen: (prev, state) => prev.runtimeType != state.runtimeType, builder: (context,state) { final bloc = BlocProvider.of(context); return GestureDetector( onTap: () { print(bloc.isCountTimer); if (canSendSms && !bloc.isCountTimer ) { print(state.duration); bloc.add(StartEvent(duration: state.duration)); } }, child: Container( decoration: BoxDecoration( image: DecorationImage( image: AssetImage( canSendSms && !bloc.isCountTimer ? 'securitycode'.assetPng:'securitycode_dis'.assetPng ), fit: BoxFit.fill ), ), padding: const EdgeInsets.symmetric(horizontal:12.0,vertical: 15.0), child: Row( children: [ if (state is RunningState)...[ const TimerText() ] else ...[ const Text('获取验证码') ] ], ), ), ); }, ); } class TimerText extends StatelessWidget { const TimerText({super.key}); @override Widget build(BuildContext context) { final duration = context.select((TimerBloc bloc) => bloc.state.duration); final secondsStr = duration.toString().padLeft(2, '0'); return Text( '${secondsStr}s后再次获取', ); } }