Files
food_hub_app/lib/provider/food_provider.dart

219 lines
5.4 KiB
Dart

import 'package:flutter/material.dart';
import 'package:food_hub_app/apis/moment.dart';
import 'package:food_hub_app/apis/recipe.dart';
import 'package:food_hub_app/apis/stats.dart';
import 'package:food_hub_app/models/moment.dart';
import 'package:food_hub_app/models/recipe.dart';
import 'package:food_hub_app/models/stats.dart';
import 'package:food_hub_app/utils/date_util.dart';
import 'package:food_hub_app/utils/index.dart';
class FoodProvider with ChangeNotifier {
late FoodRecord recordFormItem;
late Moment momentFormItem;
late bool isEditing;
bool isLoading = false;
String? error;
String queryCategory = '全部菜系';
late List<String> categoryList = [];
late List<RecipeSummary> recipeSummaryList = [];
DateTime selectedDay = DateTime.now();
DateTime focusedDay = DateTime.now();
late List<FoodRecord> recordList = [];
late List<FoodRecord> selectRecordList = [];
late SummaryStats summaryStats = SummaryStats(
recipeCount: 0,
categoryCount: 0,
workCount: 0,
);
late double averageRecordCount = 0;
late List<ChartData> recordStats = [];
late List<ChartData> categoryStats = [];
late List<ChartData> rankStats = [];
List<Moment> momentList = [];
int currentPage = 1;
final int pageSize = 3;
bool hasMore = true;
void resetRecordForm() {
recordFormItem = FoodRecord.getEmpty();
notifyListeners();
}
void initRecordForm(FoodRecord record) {
recordFormItem = record;
notifyListeners();
}
void resetMomentForm() {
momentFormItem = Moment.getEmpty();
notifyListeners();
}
void initMomentForm(Moment moment) {
momentFormItem = moment;
notifyListeners();
}
Future<void> queryCategoryList() async {
try {
error = null;
notifyListeners();
final result = await queryCategoryApi();
categoryList.clear();
categoryList.add('全部菜系');
categoryList.addAll(result);
} catch (e) {
error = '加载数据失败: $e';
debugPrint('加载数据失败: $e');
} finally {
notifyListeners();
}
}
Future<void> refreshRecipeList() async {
if (isLoading) return;
try {
isLoading = true;
error = null;
notifyListeners();
final category = queryCategory == '全部菜系' ? '' : queryCategory;
final result = await queryRecipeApi(RecipeQuery(category: category));
recipeSummaryList = result;
} catch (e) {
error = '加载数据失败: $e';
debugPrint('加载数据失败: $e');
} finally {
isLoading = false;
notifyListeners();
}
}
Future<void> refreshRecordList(String? startDate, String? endDate) async {
if (isLoading) return;
try {
isLoading = true;
error = null;
notifyListeners();
startDate ??= getFirstDayOfMonth(focusedDay);
endDate ??= getLastDayOfMonth(focusedDay);
final result = await queryRecordApi(startDate, endDate);
recordList = result;
if (recordList.isNotEmpty) {
selectedDay = DateTime.parse(recordList.last.date);
} else {
selectedDay = focusedDay;
}
refreshSelectRecord();
} catch (e) {
error = '加载数据失败: $e';
debugPrint('加载数据失败: $e');
} finally {
isLoading = false;
notifyListeners();
}
}
void refreshSelectRecord() {
selectRecordList =
recordList
.where((record) => record.date == formatDateTime(selectedDay))
.toList();
}
Future<void> refreshBlogStats() async {
if (isLoading) return;
try {
isLoading = true;
error = null;
notifyListeners();
final statsResult = await queryStatsApi();
final recordStatsResult = await queryRecordStatsApi();
final categoryStatsResult = await queryCategoryStatsApi();
final rankStatsResult = await queryRankStatsApi();
summaryStats = statsResult;
recordStats = recordStatsResult;
categoryStats = categoryStatsResult;
rankStats = rankStatsResult;
if (recordStats.isNotEmpty) {
double sumValue = recordStats.fold(
0.0,
(sum, item) => sum + item.value,
);
averageRecordCount = sumValue / recordStats.length;
}
} catch (e) {
error = '加载数据失败: $e';
debugPrint('加载数据失败: $e');
} finally {
isLoading = false;
notifyListeners();
}
}
Future<void> queryMomentByPage({bool isRefresh = true}) async {
if (isLoading) return;
try {
isLoading = true;
error = null;
notifyListeners();
// 如果是刷新,重置页码
if (isRefresh) {
currentPage = 1;
}
final result = await queryMomentByPageApi(currentPage, pageSize);
// 更新数据
if (isRefresh) {
momentList = result.records;
} else {
momentList.addAll(result.records);
}
// 判断是否还有更多数据
hasMore = result.current < result.pages;
if (hasMore) {
currentPage++;
}
} catch (e) {
error = '加载数据失败: $e';
debugPrint('加载数据失败: $e');
} finally {
isLoading = false;
notifyListeners();
}
}
Future<void> loadMoreMomentList() async {
if (hasMore && !isLoading) {
await queryMomentByPage(isRefresh: false);
}
}
Future<void> refreshMomentList() async {
await queryMomentByPage(isRefresh: true);
}
}