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.

56 lines
1.9 KiB

2 years ago
  1. import 'dart:developer';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter/services.dart';
  4. import 'package:flutter_riverpod/flutter_riverpod.dart';
  5. import 'package:image_picker/image_picker.dart';
  6. import 'package:my_flutter_puzzle/application/states/image_splitter_state.dart';
  7. import 'package:my_flutter_puzzle/res/strings.dart';
  8. import 'package:my_flutter_puzzle/utils/image_splitter.dart';
  9. class ImageSplitterNotifier extends StateNotifier<ImageSplitterState> {
  10. final ImageSplitter _splitter;
  11. ImageSplitterNotifier(this._splitter) : super(const ImageSplitterState());
  12. getInitialImages({required int puzzleSize}) async {
  13. state = const ImageSplitterState.generating();
  14. try {
  15. final data = await rootBundle.load(defaultImagePath);
  16. final imageBytes = data.buffer.asUint8List();
  17. final _splitter = ImageSplitter();
  18. final palette =
  19. await _splitter.getImagePalette(const AssetImage(defaultImagePath));
  20. final images = await _splitter.runSplitterIsolate(imageBytes, puzzleSize);
  21. state = ImageSplitterState.complete(
  22. Image.asset(defaultImagePath), images, palette);
  23. } catch (e) {
  24. state = ImageSplitterState.error(message: e.toString());
  25. }
  26. }
  27. generateImages({required ImagePicker picker, required int puzzleSize}) async {
  28. state = const ImageSplitterState.generating();
  29. try {
  30. final imageBytesPalette = await _splitter.getImage(picker: picker);
  31. if (imageBytesPalette != null) {
  32. final image = imageBytesPalette.item1;
  33. final imageBytes = imageBytesPalette.item2;
  34. final palette = imageBytesPalette.item3;
  35. log('Image tuple retrieved');
  36. final images =
  37. await _splitter.runSplitterIsolate(imageBytes, puzzleSize);
  38. state = ImageSplitterState.complete(image, images, palette);
  39. }
  40. } catch (e) {
  41. debugPrint('Error: $e');
  42. state = ImageSplitterState.error(message: e.toString());
  43. }
  44. }
  45. }