challenge_add_vm.dart 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. // features/challenge/add/add_challenge_viewmodel.dart
  2. import 'package:flutter_riverpod/flutter_riverpod.dart';
  3. import 'package:japp_flutter/core/models/challenge_model.dart';
  4. import 'package:japp_flutter/core/proviers/repository_providers.dart';
  5. import 'package:japp_flutter/core/repositories/challenge_repository.dart';
  6. final addChallengeProvider = AsyncNotifierProvider<AddChallengeViewModel, ChallengeModel>(
  7. AddChallengeViewModel.new,
  8. );
  9. class AddChallengeViewModel extends AsyncNotifier<ChallengeModel> {
  10. ChallengeRepository get _repository => ref.read(challengeRepositoryProvider);
  11. @override
  12. Future<ChallengeModel> build() async {
  13. // 初始化为空挑战模板
  14. return ChallengeModel(
  15. id: null,
  16. title: '',
  17. description: '',
  18. startDate: DateTime.now(),
  19. endDate: DateTime.now().add(const Duration(days: 30)),
  20. participants: 0,
  21. completed: false,
  22. difficulty: '中等',
  23. );
  24. }
  25. /// 更新挑战标题
  26. void updateTitle(String title) {
  27. state = AsyncData(state.value!.copyWith(title: title));
  28. }
  29. /// 更新挑战描述
  30. void updateDescription(String description) {
  31. state = AsyncData(state.value!.copyWith(description: description));
  32. }
  33. /// 更新难度级别
  34. void updateDifficulty(String difficulty) {
  35. state = AsyncData(state.value!.copyWith(difficulty: difficulty));
  36. }
  37. /// 更新日期范围
  38. void updateDateRange(DateTime start, DateTime end) {
  39. state = AsyncData(state.value!.copyWith(
  40. startDate: start,
  41. endDate: end,
  42. ));
  43. }
  44. /// 提交新挑战
  45. Future<void> submitChallenge() async {
  46. if (state.value == null) return;
  47. state = const AsyncLoading();
  48. state = await AsyncValue.guard(() => _repository.addChallenge(state.value!));
  49. }
  50. }