mohsen zamani
2 years ago
11 changed files with 235 additions and 83 deletions
-
8lib/application/notifiers/image_splitter_notifier.dart
-
6lib/cubits/base_cubit_type.dart
-
18lib/cubits/count_down_timer_cubit.dart
-
13lib/main.dart
-
61lib/screens/photo/photo_screen_large.dart
-
12lib/screens/puzzle/puzzle_starter_screen.dart
-
102lib/widgets/solo_screen/count_down_timer_widget.dart
-
1lib/widgets/solo_screen/countdown_widget.dart
-
16lib/widgets/solo_screen/game_button_widget.dart
-
32pubspec.lock
-
1pubspec.yaml
@ -0,0 +1,6 @@ |
|||
class BaseCubitType<T> { |
|||
BaseCubitType({this.eventName, this.data}); |
|||
|
|||
T? eventName; |
|||
dynamic data; |
|||
} |
@ -0,0 +1,18 @@ |
|||
import 'package:flutter_bloc/flutter_bloc.dart'; |
|||
import 'package:my_flutter_puzzle/cubits/base_cubit_type.dart'; |
|||
|
|||
class CountDownTimerCubit extends Cubit<BaseCubitType<CountDownTimerState>> { |
|||
CountDownTimerCubit() : super(BaseCubitType(eventName: CountDownTimerState.empty)); |
|||
|
|||
void empty() => emit(BaseCubitType(eventName: CountDownTimerState.empty)); |
|||
|
|||
void start() => emit(BaseCubitType(eventName: CountDownTimerState.start)); |
|||
|
|||
void stop() => emit(BaseCubitType(eventName: CountDownTimerState.stop)); |
|||
} |
|||
|
|||
enum CountDownTimerState { |
|||
empty, |
|||
start, |
|||
stop, |
|||
} |
@ -0,0 +1,102 @@ |
|||
import 'dart:async'; |
|||
|
|||
import 'package:flutter/material.dart'; |
|||
import 'package:flutter_bloc/flutter_bloc.dart'; |
|||
import 'package:my_flutter_puzzle/cubits/base_cubit_type.dart'; |
|||
import 'package:my_flutter_puzzle/cubits/count_down_timer_cubit.dart'; |
|||
|
|||
class CountDownTimerWidget extends StatefulWidget { |
|||
final int duration; |
|||
final Function() finishCallback; |
|||
|
|||
const CountDownTimerWidget({Key? key, required this.duration, required this.finishCallback}) : super(key: key); |
|||
|
|||
@override |
|||
State<CountDownTimerWidget> createState() => _CountDownTimerWidgetState(); |
|||
} |
|||
|
|||
class _CountDownTimerWidgetState extends State<CountDownTimerWidget> { |
|||
Timer? _countdownTimer; |
|||
Duration? myDuration; |
|||
late final CountDownTimerCubit _cubit; |
|||
|
|||
@override |
|||
void initState() { |
|||
_cubit = BlocProvider.of<CountDownTimerCubit>(context); |
|||
myDuration = Duration(minutes: widget.duration); |
|||
super.initState(); |
|||
} |
|||
|
|||
void startTimer() { |
|||
myDuration = Duration(minutes: widget.duration); |
|||
_countdownTimer = Timer.periodic(const Duration(seconds: 1), (_) => setCountDown()); |
|||
} |
|||
|
|||
void stopTimer() { |
|||
setState(() => _countdownTimer!.cancel()); |
|||
} |
|||
|
|||
void resetTimer() { |
|||
stopTimer(); |
|||
setState(() => myDuration = const Duration(days: 5)); |
|||
} |
|||
|
|||
void setCountDown() { |
|||
const reduceSecondsBy = 1; |
|||
setState(() { |
|||
final seconds = myDuration!.inSeconds - reduceSecondsBy; |
|||
if (seconds < 0) { |
|||
widget.finishCallback.call(); |
|||
_countdownTimer!.cancel(); |
|||
} else { |
|||
myDuration = Duration(seconds: seconds); |
|||
} |
|||
}); |
|||
} |
|||
|
|||
@override |
|||
Widget build(BuildContext context) { |
|||
String strDigits(int n) => n.toString().padLeft(2, '0'); |
|||
final hours = strDigits(myDuration!.inHours.remainder(24)); |
|||
final minutes = strDigits(myDuration!.inMinutes.remainder(60)); |
|||
final seconds = strDigits(myDuration!.inSeconds.remainder(60)); |
|||
return BlocBuilder<CountDownTimerCubit, BaseCubitType<CountDownTimerState>>( |
|||
builder: (context, state) { |
|||
switch (state.eventName!) { |
|||
case CountDownTimerState.empty: |
|||
break; |
|||
case CountDownTimerState.start: |
|||
WidgetsBinding.instance.addPostFrameCallback((timeStamp) { |
|||
startTimer(); |
|||
_cubit.empty(); |
|||
}); |
|||
break; |
|||
case CountDownTimerState.stop: |
|||
WidgetsBinding.instance.addPostFrameCallback((timeStamp) { |
|||
stopTimer(); |
|||
_cubit.empty(); |
|||
}); |
|||
break; |
|||
} |
|||
return Row( |
|||
children: [ |
|||
Text( |
|||
'$hours:$minutes:$seconds', |
|||
style: const TextStyle( |
|||
fontSize: 30, |
|||
fontWeight: FontWeight.bold, |
|||
color: Colors.white, |
|||
), |
|||
), |
|||
const SizedBox(width: 8), |
|||
const Icon( |
|||
Icons.timer, |
|||
color: Colors.white, |
|||
size: 30, |
|||
) |
|||
], |
|||
); |
|||
}, |
|||
); |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue