data.dart 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import 'package:flutter/material.dart';
  2. import 'package:puzzleweave/models/api_helper.dart';
  3. import 'package:puzzleweave/models/cached_request.dart';
  4. import 'package:puzzleweave/models/items.dart';
  5. import 'package:puzzleweave/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. void collectionDone(ListItem item) {
  29. final newCollection = Work.fromListItem(item);
  30. final updatedCollections = [...completedCollections.value, newCollection];
  31. completedCollections.value = updatedCollections;
  32. _persistence.completedCollections = updatedCollections; // 存储更新后的列表
  33. }
  34. // 获取当前的合集index (基于已完成收藏的数量)
  35. int get currentCollectionIndex => completedCollections.value.length;
  36. CachedRequest? _latest;
  37. CachedRequest get latest {
  38. _latest ??= CachedRequest.fromUrl(
  39. ApiHelper.latestUri,
  40. transformFunction: (json) async {
  41. late List<ListItem> list;
  42. if (json['asset'] != null) {
  43. // from asset
  44. list = List<AssetItem>.from((json['data'] as Iterable).map((e) => AssetItem.fromJSON(e)));
  45. } else {
  46. // from remote
  47. list = List<RemoteItem>.from((json['data'] as Iterable).map((e) => RemoteItem.fromJSON(e)));
  48. }
  49. return list;
  50. },
  51. );
  52. return _latest!;
  53. }
  54. CachedRequest? _collection;
  55. CachedRequest get collection {
  56. _collection ??= CachedRequest.fromUrl(
  57. ApiHelper.collectionUri,
  58. transformFunction: (json) async {
  59. late List<ListItem> list;
  60. if (json['asset'] != null) {
  61. // from asset
  62. list = List<AssetItem>.from((json['data'] as Iterable).map((e) => AssetItem.fromJSON(e)));
  63. } else {
  64. // from remote
  65. list = List<RemoteItem>.from((json['data'] as Iterable).map((e) => RemoteItem.fromJSON(e)));
  66. }
  67. return list;
  68. },
  69. );
  70. return _collection!;
  71. }
  72. }