task_provider.dart 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import 'dart:convert';
  2. import 'package:flutter/foundation.dart';
  3. import 'package:http/http.dart' as http;
  4. import '../models/task.dart';
  5. class TaskProvider extends ChangeNotifier {
  6. List<Task> _tasks = [];
  7. int _pageNum = 1;
  8. int _pageSize = 10;
  9. int _total = 0;
  10. String? _statusFilter;
  11. bool _loading = false;
  12. List<Task> get tasks => _tasks;
  13. int get pageNum => _pageNum;
  14. int get pageSize => _pageSize;
  15. int get total => _total;
  16. String? get statusFilter => _statusFilter;
  17. bool get loading => _loading;
  18. // TODO: 抽到配置
  19. final String baseUrl = 'http://localhost:8003';
  20. Future<void> fetchTasks({String? status, int? pageNum, int? pageSize}) async {
  21. _loading = true;
  22. notifyListeners();
  23. _statusFilter = status ?? _statusFilter;
  24. _pageNum = pageNum ?? _pageNum;
  25. _pageSize = pageSize ?? _pageSize;
  26. final query = <String, String>{
  27. 'pageNum': _pageNum.toString(),
  28. 'pageSize': _pageSize.toString(),
  29. };
  30. if (_statusFilter != null && _statusFilter!.isNotEmpty) {
  31. query['status'] = _statusFilter!;
  32. }
  33. final uri = Uri.parse('$baseUrl/api/v1/tasks/list').replace(
  34. queryParameters: query,
  35. );
  36. try {
  37. final resp = await http.get(uri);
  38. if (resp.statusCode == 200) {
  39. final body = json.decode(resp.body) as Map<String, dynamic>;
  40. final data = body['data'] as Map<String, dynamic>;
  41. final records = data['records'] as List<dynamic>? ?? [];
  42. _total = (data['total'] ?? 0) as int;
  43. _tasks = records
  44. .map((e) => Task.fromJson(e as Map<String, dynamic>))
  45. .toList();
  46. } else {
  47. if (kDebugMode) {
  48. print('fetchTasks failed: ${resp.statusCode} ${resp.body}');
  49. }
  50. }
  51. } catch (e) {
  52. if (kDebugMode) {
  53. print('fetchTasks error: $e');
  54. }
  55. } finally {
  56. _loading = false;
  57. notifyListeners();
  58. }
  59. }
  60. Future<Task?> fetchTaskDetail(String taskId) async {
  61. final uri = Uri.parse('$baseUrl/api/v1/tasks/$taskId/detail');
  62. try {
  63. final resp = await http.get(uri);
  64. if (resp.statusCode == 200) {
  65. final body = json.decode(resp.body) as Map<String, dynamic>;
  66. final data = body['data'] as Map<String, dynamic>;
  67. return Task.fromJson(data);
  68. }
  69. } catch (e) {
  70. if (kDebugMode) {
  71. print('fetchTaskDetail error: $e');
  72. }
  73. }
  74. return null;
  75. }
  76. Future<void> deleteTask(String taskId) async {
  77. final uri = Uri.parse('$baseUrl/api/v1/tasks/$taskId');
  78. try {
  79. final resp = await http.delete(uri);
  80. if (resp.statusCode == 200) {
  81. _tasks.removeWhere((t) => t.id == taskId);
  82. _total = _total > 0 ? _total - 1 : 0;
  83. notifyListeners();
  84. }
  85. } catch (e) {
  86. if (kDebugMode) {
  87. print('deleteTask error: $e');
  88. }
  89. }
  90. }
  91. }