data.dart 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import 'package:flutter/material.dart';
  2. import 'package:image_puzzle/models/api_helper.dart';
  3. import 'package:image_puzzle/models/cached_request.dart';
  4. import 'package:image_puzzle/models/items.dart';
  5. import 'package:image_puzzle/persistence/persistence.dart';
  6. import 'package:logging/logging.dart';
  7. final Logger _log = Logger('data.dart');
  8. class Data {
  9. final Persistence _persistence;
  10. ValueNotifier<List<Work>> completedWorks = ValueNotifier([]); // 已完成的图
  11. ValueNotifier<List<Work>> completedCollections = ValueNotifier([]); // 已完成的收藏图
  12. Data({required Persistence persistence}) : _persistence = persistence;
  13. Future<void> loadDataFromPersistence() async {
  14. completedWorks.value = _persistence.completedWorks;
  15. completedCollections.value = _persistence.completedCollections;
  16. }
  17. // 完成某个作品调用此接口记录到存储中
  18. // !!! 改造点:接受 ListItem 和可选的耗时
  19. void workDone(ListItem item, {Duration? timeSpent}) {
  20. final newWork = Work.fromListItem(item, timeSpent: timeSpent);
  21. final updatedWorks = [...completedWorks.value, newWork];
  22. completedWorks.value = updatedWorks;
  23. _persistence.completedWorks = updatedWorks; // 存储更新后的列表
  24. }
  25. // 获取当前的关卡index (基于已完成作品的数量)
  26. int get currentLevel => completedWorks.value.length;
  27. // 完成某个collection
  28. // !!! 改造点:接受 CollectionItem
  29. void collectionDone(ListItem item) {
  30. final newCollection = Work.fromListItem(item);
  31. final updatedCollections = [...completedCollections.value, newCollection];
  32. completedCollections.value = updatedCollections;
  33. _persistence.completedCollections = updatedCollections; // 存储更新后的列表
  34. }
  35. // 获取当前的合集index (基于已完成收藏的数量)
  36. int get currentCollectionIndex => completedCollections.value.length;
  37. CachedRequest? _latest;
  38. CachedRequest get latest {
  39. _latest ??= CachedRequest.fromUrl(
  40. ApiHelper.latestUri,
  41. transformFunction: (json) async {
  42. late List<ListItem> list;
  43. if (json['asset'] != null) {
  44. // from asset
  45. list = List<AssetItem>.from((json['data'] as Iterable).map((e) => AssetItem.fromJSON(e)));
  46. } else {
  47. // from remote
  48. list = List<RemoteItem>.from((json['data'] as Iterable).map((e) => RemoteItem.fromJSON(e)));
  49. }
  50. return list;
  51. },
  52. );
  53. return _latest!;
  54. }
  55. CachedRequest? _collection;
  56. CachedRequest get collection {
  57. _collection ??= CachedRequest.fromUrl(
  58. ApiHelper.collectionUri,
  59. transformFunction: (json) async {
  60. late List<ListItem> list;
  61. if (json['asset'] != null) {
  62. // from asset
  63. list = List<AssetItem>.from((json['data'] as Iterable).map((e) => AssetItem.fromJSON(e)));
  64. } else {
  65. // from remote
  66. list = List<RemoteItem>.from((json['data'] as Iterable).map((e) => RemoteItem.fromJSON(e)));
  67. }
  68. return list;
  69. },
  70. );
  71. return _collection!;
  72. }
  73. }