Files
kitchen/lib/src/app_binding.dart
2026-04-19 04:17:54 +08:00

109 lines
5.5 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 2026-04-09 | AppBinding | 全局Binding | Web端跳过permission注册
// 2026-04-10 | 移除 CartController 注册(收藏功能统一使用 FavoritesController
// 2026-04-10 | 新增 ShoppingListController 全局注册(首页需要使用)
// 2026-04-11 | 统一控制器生命周期管理 | 新增ToolsController/HotController/WhatToEatController全局注册 | 移除路由级重复注册
// 2026-04-15 | 修复ANR: 非首屏控制器改用lazyPut延迟初始化避免5个网络请求同时发出导致原生ANR杀进程
import 'package:flutter/foundation.dart';
import 'package:get/get.dart';
import 'package:mom_kitchen/src/controllers/feed/action_controller.dart';
import 'package:mom_kitchen/src/controllers/feed/hot_controller.dart';
import 'package:mom_kitchen/src/controllers/data/favorites_controller.dart';
import 'package:mom_kitchen/src/controllers/feed/feed_controller.dart';
import 'package:mom_kitchen/src/controllers/home/home_controller.dart';
import 'package:mom_kitchen/src/controllers/user/preference_controller.dart';
import 'package:mom_kitchen/src/controllers/user/profile_controller.dart';
import 'package:mom_kitchen/src/controllers/user/personalization_controller.dart';
import 'package:mom_kitchen/src/controllers/home/main_navigation_controller.dart';
import 'package:mom_kitchen/src/controllers/data/meal_record_controller.dart';
import 'package:mom_kitchen/src/controllers/recipe/search_controller.dart';
import 'package:mom_kitchen/src/controllers/data/shopping_list_controller.dart';
import 'package:mom_kitchen/src/controllers/data/cooking_note_controller.dart';
import 'package:mom_kitchen/src/controllers/data/browse_history_controller.dart';
import 'package:mom_kitchen/src/controllers/data/rating_records_controller.dart';
import 'package:mom_kitchen/src/controllers/tools/tools_controller.dart';
import 'package:mom_kitchen/src/controllers/tools/what_to_eat_controller.dart';
import 'package:mom_kitchen/src/controllers/data/weekly_menu_controller.dart';
import 'package:mom_kitchen/src/controllers/tools/bedtime_reminder_controller.dart';
import 'package:mom_kitchen/src/services/core/app_service.dart';
import 'package:mom_kitchen/src/services/ui/theme_service.dart';
import 'package:mom_kitchen/src/services/data/offline_service.dart';
import 'package:mom_kitchen/src/services/data/data_export_service.dart';
import 'package:mom_kitchen/src/services/user/taste_preference_service.dart';
/// 全局Binding - 应用启动时注册所有全局控制器和服务
/// 所有 permanent:true 的控制器在此统一管理路由级Binding禁止重复注册
///
/// 初始化策略:
/// - Get.put: 首屏必需的控制器,立即初始化
/// - Get.lazyPut: 非首屏控制器首次访问时才初始化避免ANR
class AppBinding extends Bindings {
@override
void dependencies() {
// --- 服务层lazyPut + fenix: 允许被回收后自动重建) ---
Get.lazyPut(() => AppService.instance.api, fenix: true);
Get.lazyPut(() => AppService.instance.storage, fenix: true);
if (!kIsWeb && AppService.instance.permission != null) {
Get.lazyPut(() => AppService.instance.permission!, fenix: true);
}
Get.lazyPut(() => AppService.instance.logger, fenix: true);
Get.lazyPut(() => AppService.instance.animation, fenix: true);
Get.lazyPut(() => AppService.instance.screenUtil, fenix: true);
Get.lazyPut(() => AppService.instance.appInfo, fenix: true);
Get.lazyPut(() => AppService.instance.toast, fenix: true);
// --- 离线服务 ---
Get.put(OfflineService(), permanent: true);
// --- 数据导出服务 ---
Get.put(DataExportService(), permanent: true);
// --- 口味偏好服务 ---
Get.put(TastePreferenceService(), permanent: true);
// --- 主题与个性化(首屏必需) ---
if (!Get.isRegistered<ThemeService>()) {
Get.put(ThemeService.instance, permanent: true);
}
Get.put(PersonalizationController(), permanent: true);
// --- 首屏必需控制器立即初始化仅HomeController发网络请求 ---
Get.put(MainNavigationController(), permanent: true);
Get.put(HomeController(), permanent: true);
Get.put(ActionController(), permanent: true);
// --- 非首屏控制器延迟初始化切换Tab时才创建避免ANR ---
Get.lazyPut(() => FeedController(), fenix: true);
Get.lazyPut(() => HotController(), fenix: true);
Get.lazyPut(() => WhatToEatController(), fenix: true);
Get.lazyPut(() => ToolsController(), fenix: true);
Get.lazyPut(() => PreferenceController(), fenix: true);
Get.lazyPut(() => ProfileController(), fenix: true);
Get.lazyPut(() => FavoritesController(), fenix: true);
Get.lazyPut(() => ShoppingListController(), fenix: true);
Get.lazyPut(() => CookingNoteController(), fenix: true);
Get.lazyPut(() => BrowseHistoryController(), fenix: true);
Get.lazyPut(() => WeeklyMenuController(), fenix: true);
Get.lazyPut(() => BedtimeReminderController(), fenix: true);
Get.lazyPut(() => MealRecordController(), fenix: true);
Get.lazyPut(() => RatingRecordsController(), fenix: true);
}
}
/// 搜索页Binding - SearchController仅搜索页使用按需创建
class SearchBinding extends Bindings {
@override
void dependencies() {
Get.lazyPut(() => SearchController());
}
}
/// 营养页Binding - MealRecordController带注册检查避免重复
class NutritionBinding extends Bindings {
@override
void dependencies() {
if (!Get.isRegistered<MealRecordController>()) {
Get.put(MealRecordController(), permanent: true);
}
}
}