You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

70 lines
2.3 KiB

2 years ago
2 years ago
2 years ago
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_riverpod/flutter_riverpod.dart';
  3. import 'package:my_flutter_puzzle/application/states/image_splitter_state.dart';
  4. import 'package:my_flutter_puzzle/application/states/puzzle_state.dart';
  5. import 'package:my_flutter_puzzle/models/puzzle_data.dart';
  6. import 'package:my_flutter_puzzle/providers.dart';
  7. import 'package:my_flutter_puzzle/screens/photo/photo_screen.dart';
  8. import 'package:my_flutter_puzzle/utils/puzzle_solver.dart';
  9. import 'package:rive/rive.dart';
  10. class PuzzleStarterScreen extends ConsumerStatefulWidget {
  11. final int puzzleSize;
  12. final String image;
  13. final int duration;
  14. const PuzzleStarterScreen({
  15. Key? key,
  16. required this.duration,
  17. required this.puzzleSize,
  18. required this.image,
  19. }) : super(key: key);
  20. @override
  21. ConsumerState<ConsumerStatefulWidget> createState() => _SoloScreenState();
  22. }
  23. class _SoloScreenState extends ConsumerState<PuzzleStarterScreen> {
  24. late final PuzzleSolverClient _solverClient;
  25. late RiveAnimationController _riveController;
  26. late final int _puzzleSize;
  27. late final PuzzleData _initialPuzzleData;
  28. @override
  29. void initState() {
  30. _puzzleSize = widget.puzzleSize;
  31. _riveController = SimpleAnimation('idle');
  32. _solverClient = PuzzleSolverClient(size: _puzzleSize);
  33. _initialPuzzleData = ref.read(puzzleNotifierProvider(_solverClient).notifier).generateInitialPuzzle();
  34. final state = ref.read(imageSplitterNotifierProvider);
  35. if (state is! ImageSplitterComplete) {
  36. WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
  37. ref.read(imageSplitterNotifierProvider.notifier).getInitialImages(
  38. puzzleSize: _puzzleSize,
  39. imagePath: widget.image,
  40. );
  41. });
  42. }
  43. ref.read(puzzleTypeNotifierProvider.notifier).changeToPhoto();
  44. super.initState();
  45. }
  46. @override
  47. Widget build(BuildContext context) {
  48. ref.listen(puzzleNotifierProvider(_solverClient), (previous, PuzzleState next) {
  49. if (next is PuzzleSolved) {
  50. ref.read(timerNotifierProvider.notifier).stopTimer();
  51. }
  52. });
  53. return AnimatedSwitcher(
  54. duration: const Duration(milliseconds: 400),
  55. child: PhotoScreen(
  56. solverClient: _solverClient,
  57. initialPuzzleData: _initialPuzzleData,
  58. puzzleSize: _puzzleSize,
  59. riveController: _riveController,
  60. ),
  61. );
  62. }
  63. }