Pārlūkot izejas kodu

组件化页面路由的调通,appRouter的扩展
组件化路由的使用

liukai 4 mēneši atpakaļ
vecāks
revīzija
653e1daa8e
58 mainītis faili ar 1099 papildinājumiem un 177 dzēšanām
  1. 22 64
      app/lib/main.dart
  2. 14 5
      app/lib/modules/splash/page/splash_page.dart
  3. 60 1
      app/lib/modules/splash/vm/splash_view_model.dart
  4. 1 1
      app/lib/modules/splash/vm/splash_view_model.g.dart
  5. 62 0
      app/lib/obs/my_navigator_observer.dart
  6. 0 0
      app/lib/obs/riverpod_observer.dart
  7. 0 17
      app/lib/router/app_page_router.dart
  8. 13 0
      app/lib/router/component/app_component_service_impl.dart
  9. 15 0
      app/lib/router/component/app_service_provider.dart
  10. 26 0
      app/lib/router/component/app_service_provider.g.dart
  11. 33 0
      app/lib/router/page/app_page_router.dart
  12. 5 22
      app/lib/router/app_page_router.gr.dart
  13. 11 0
      packages/cpt_auth/pubspec.yaml
  14. 11 0
      packages/cpt_community/pubspec.yaml
  15. 11 0
      packages/cpt_facility/pubspec.yaml
  16. 11 0
      packages/cpt_form/pubspec.yaml
  17. 18 0
      packages/cpt_main/lib/modules/feedback/page/feedback_page.dart
  18. 23 0
      packages/cpt_main/lib/modules/home/page/home_page.dart
  19. 62 0
      packages/cpt_main/lib/modules/main/page/main_page.dart
  20. 0 0
      packages/cpt_main/lib/modules/main_export.dart
  21. 34 0
      packages/cpt_main/lib/modules/me/page/me_page.dart
  22. 24 0
      packages/cpt_main/lib/modules/notification/notification_page.dart
  23. 18 0
      packages/cpt_main/lib/modules/visitor/page/visitor_page.dart
  24. 17 0
      packages/cpt_main/lib/router/component/main_component_service_impl.dart
  25. 15 0
      packages/cpt_main/lib/router/component/main_service_provider.dart
  26. 26 0
      packages/cpt_main/lib/router/component/main_service_provider.g.dart
  27. 36 0
      packages/cpt_main/lib/router/page/main_page_router.dart
  28. 139 0
      packages/cpt_main/lib/router/page/main_page_router.gr.dart
  29. 11 0
      packages/cpt_main/pubspec.yaml
  30. 11 0
      packages/cpt_notice_board/pubspec.yaml
  31. 11 0
      packages/cpt_payment/pubspec.yaml
  32. 28 0
      packages/cpt_profile/lib/modules/profile_edit/page/Profile_edit_page.dart
  33. 0 0
      packages/cpt_profile/lib/modules/profile_export.dart
  34. 15 0
      packages/cpt_profile/lib/router/component/profile_component_service_impl.dart
  35. 13 0
      packages/cpt_profile/lib/router/component/profile_service_provider.dart
  36. 27 0
      packages/cpt_profile/lib/router/component/profile_service_provider.g.dart
  37. 21 0
      packages/cpt_profile/lib/router/page/profile_page_router.dart
  38. 39 0
      packages/cpt_profile/lib/router/page/profile_page_router.gr.dart
  39. 11 0
      packages/cpt_profile/pubspec.yaml
  40. 11 0
      packages/cpt_property/pubspec.yaml
  41. 11 0
      packages/cpt_rewards/pubspec.yaml
  42. 12 0
      packages/cpt_services/pubspec.yaml
  43. 2 3
      packages/cs_initializer/lib/app_initializer.dart
  44. 1 2
      packages/cs_plugin_basic/lib/dio_interceptors/interceptor_auth_dio.dart
  45. 1 3
      packages/cs_plugin_basic/lib/dio_interceptors/interceptor_status_code_dio.dart
  46. 11 0
      packages/cs_plugin_basic/lib/provider/app_config/app_config_service.dart
  47. 1 1
      packages/cs_plugin_basic/lib/provider/app_config/app_config_service.g.dart
  48. 20 0
      packages/cs_plugin_basic/lib/provider/user_config/user_config_service.dart
  49. 1 1
      packages/cs_plugin_basic/lib/provider/user_config/user_config_service.g.dart
  50. 11 0
      packages/cs_router/lib/componentRouter/app_service.dart
  51. 62 0
      packages/cs_router/lib/componentRouter/component_service_manager.dart
  52. 4 2
      packages/cs_router/lib/componentRouter/main_service.dart
  53. 3 4
      packages/cs_router/lib/componentRouter/profile_service.dart
  54. 10 0
      packages/cs_router/lib/ext/auto_router_extensions.dart
  55. 3 0
      packages/cs_router/lib/ext/navigator_key.dart
  56. 4 0
      packages/cs_router/lib/ext/router_provider_container.dart
  57. 3 51
      packages/cs_router/lib/path/router_path.dart
  58. 34 0
      packages/cs_shared/lib/utils/ext_dart.dart

+ 22 - 64
app/lib/main.dart

@@ -1,11 +1,14 @@
+import 'package:cpt_main/router/component/main_service_provider.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
 import 'package:initializer/app_initializer.dart';
 import 'package:plugin_basic/basic_export.dart';
 import 'package:plugin_basic/provider/app_config/app_config_service.dart';
-import 'package:plugin_basic/provider/global_provider_container.dart';
 
 import 'package:cs_resources/local/theme/theme_config.dart';
+import 'package:plugin_basic/provider/global_provider_container.dart';
+import 'package:router/componentRouter/component_service_manager.dart';
+import 'package:cpt_profile/router/component/profile_service_provider.dart';
 
 import 'package:widgets/dialog/custom_toast_widget.dart';
 import 'package:widgets/dialog/custom_error_widget.dart';
@@ -14,8 +17,10 @@ import 'package:widgets/dialog/custom_success_widget.dart';
 import 'package:widgets/dialog/custom_loading_widget.dart';
 import 'package:widgets/widget_export.dart';
 
-import 'router/app_page_router.dart';
-import 'rp_obs/riverpod_observer.dart';
+import 'obs/my_navigator_observer.dart';
+import 'router/page/app_page_router.dart';
+import 'obs/riverpod_observer.dart';
+import 'router/component/app_service_provider.dart';
 
 void main() async {
   //运行App
@@ -23,7 +28,14 @@ void main() async {
   //交给初始化构造器去统一初始化
   await AppInitializer.initializeRunalone();
 
+  //组件路由的注入
+  final serviceManager = ComponentServiceManager()
+    ..addServiceProvider(mainServiceProvider)
+    ..addServiceProvider(appServiceProvider)
+    ..addServiceProvider(profileServiceProvider);
+
   runApp(ProviderScope(
+    parent: globalContainer,
     observers: [RiverpodObserver()],
     child: MyApp(),
   ));
@@ -87,76 +99,18 @@ class MyApp extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
 
-    // Future.microtask(() {
-    //   globalContainer.read(appConfigServiceProvider.notifier).initSize(context);
-    // });
-
     WidgetsBinding.instance.addPostFrameCallback((_) {
-      globalContainer.read(appConfigServiceProvider.notifier).initSize(context);
+      AppConfigService.getInstance().initSize(context);
     });
 
     //设置全局的状态栏文本样式
     SystemChrome.setSystemUIOverlayStyle(ThemeConfig.systemUiOverlayStyleLightThemeWhite);
-    final appRouter = AppRouter();
 
     //路由管理,状态管理,依赖管理一切都始于GetMaterialApp
     return KeyboardVisibilityBuilder(builder: (context, isKeyboardVisible) {
       return KeyboardDismissOnTap(
         dismissOnCapturedTaps: false,
-        child:
-            // MaterialApp(
-            //   //顶部是否展示Debug图标
-            //   debugShowCheckedModeBanner: true,
-            //   //是否展示Log
-            //   enableLog: true,
-            //   //默认路由与路由表的加载
-            //   initialRoute: RouterPath.splash,
-            //   getPages: PageRouter.routes + BasicPageRouter.routes + AuthPageRouter.routes + JobPageRouter.routes + LabourPageRouter.routes +
-            //       ReportPageRouter.routes + LabourSGPageRouter.routes + JobPageSGRouter.routes,
-            //   //对原生导航的兼容;SmartDialog路由配置生命周期处理
-            //   navigatorObservers: [GetXRouterObserver(), FlutterSmartDialog.observer, routeObserver],
-            //   //默认页面动画
-            //   defaultTransition: Transition.rightToLeft,
-            //   smartManagement: SmartManagement.keepFactory,
-            //   //网页Title显示
-            //   title: 'YY Employer',
-            //   //样式相关
-            //   theme: ThemeConfig.lightTheme,
-            //   darkTheme: ThemeConfig.darkTheme,
-            //   themeMode: ThemeMode.light,
-            //   //本地化相关
-            //   locale: TranslationService.locale,
-            //   fallbackLocale: TranslationService.fallbackLocale,
-            //   localizationsDelegates:  const [
-            //     GlobalMaterialLocalizations.delegate,
-            //     GlobalWidgetsLocalizations.delegate,
-            //     GlobalCupertinoLocalizations.delegate,
-            //   ],
-            //   supportedLocales: const [
-            //     Locale('en', 'US'),
-            //     Locale('zh', ''),
-            //     Locale('vi', ''),
-            //   ],
-            //   translations: TranslationService(),
-            //   //SmartDialog初始化默认Loading与Toast
-            //   builder: FlutterSmartDialog.init(
-            //     toastBuilder: (String msg) {
-            //       return CustomToastWidget(msg: msg);
-            //     },
-            //     loadingBuilder: (String msg) {
-            //       return CustomLoadingWidget(msg: msg == 'loading...' ? 'Loading...'.tr : msg);
-            //     },
-            //     notifyStyle: FlutterSmartNotifyStyle(
-            //       successBuilder: (String msg) => CustomSuccessWidget(msg: msg),
-            //       failureBuilder: (String msg) => CustomFailureWidget(msg: msg),
-            //       errorBuilder: (String msg) => CustomErrorWidget(msg: msg),
-            //       alertBuilder: (String msg) => CustomErrorWidget(msg: msg),
-            //       warningBuilder: (String msg) => CustomErrorWidget(msg: msg),
-            //     ),
-            //   ),
-            // ),
-
-        MaterialApp.router(
+        child: MaterialApp.router(
           title: 'PropertyManagementSystem',
           debugShowCheckedModeBanner: true,
           theme: ThemeData(
@@ -164,7 +118,11 @@ class MyApp extends StatelessWidget {
             useMaterial3: false,
           ),
           //AutoRouter的配置
-          routerConfig: appRouter.config(),
+          routerConfig: appRouter.config(
+            navigatorObservers: () => [
+              MyNavigatorObserver(),
+            ],
+          ),
           //SmartDialog初始化默认Loading与Toast
           builder: FlutterSmartDialog.init(
             toastBuilder: (String msg) {

+ 14 - 5
app/lib/modules/splash/page/splash_page.dart

@@ -1,20 +1,27 @@
+import 'package:app/router/page/app_page_router.dart';
 import 'package:flutter/material.dart';
 import 'package:hooks_riverpod/hooks_riverpod.dart';
 import 'package:cs_resources/generated/assets.dart';
+import 'package:router/componentRouter/app_service.dart';
+import 'package:router/path/router_path.dart';
 import 'package:shared/utils/size_config.dart';
+import 'package:widgets/dialog/custom_error_widget.dart';
+import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/my_load_image.dart';
 import 'package:auto_route/annotations.dart';
 import '../vm/splash_view_model.dart';
+import 'package:auto_route/auto_route.dart';
 
 @RoutePage()
 class SplashPage extends HookConsumerWidget {
-  SplashPage({super.key});
+  const SplashPage({super.key});
 
   @override
   Widget build(BuildContext context, WidgetRef ref) {
     SizeConfig().init(context);
 
-    ref.watch(splashViewModelProvider);
+   final viewModel = ref.watch(splashViewModelProvider.notifier)..setContext(context);
+
 
     return Scaffold(
       body: Container(
@@ -29,13 +36,15 @@ class SplashPage extends HookConsumerWidget {
             end: Alignment.bottomCenter,
           ),
         ),
-        child: const Center(
-          child: MyAssetImage(
+        child:  Center(
+          child: const MyAssetImage(
             Assets.assetsYyBusinessTopLogo,
             width: 166,
             height: 67.5,
             fit: BoxFit.contain,
-          ),
+          ).onTap((){
+            context.router.pushNamed(RouterPath.main);
+          }),
         ),
       ),
     );

+ 60 - 1
app/lib/modules/splash/vm/splash_view_model.dart

@@ -1,5 +1,10 @@
+import 'package:flutter/material.dart';
+import 'package:plugin_basic/constants/app_constant.dart';
+import 'package:plugin_basic/provider/user_config/user_config_service.dart';
+import 'package:plugin_platform/engine/sp/sp_util.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:router/componentRouter/component_service_manager.dart';
 import 'package:shared/utils/log_utils.dart';
 
 part 'splash_view_model.g.dart';
@@ -9,7 +14,61 @@ class SplashViewModel extends _$SplashViewModel {
   @override
   void build() {
     // 初始构建逻辑
-    Log.e("SplashViewModel -> 初始构建逻辑");
+    Log.d("初始构建逻辑");
+    _gotoNextPage();
   }
 
+  BuildContext? _context;
+
+  void setContext(BuildContext context) {
+    Log.d("赋值Context");
+    _context = context;
+  }
+
+  void _gotoNextPage() async {
+    await Future.delayed(const Duration(seconds: 1));
+
+    // await AppInitializer.delayInitialize(futureTasks: [
+    //   () async {
+    //     await FlutterBugly.init(
+    //       androidAppId: "12345678",
+    //       iOSAppId: "12345678",
+    //     );
+    //   },
+    // ], normalTasks: [
+    //   () {
+    //     if (DeviceUtils.isIOS || DeviceUtils.isAndroid) {
+    //       jpush.init();
+    //     }
+    //   },
+    // ]);
+
+    // 先查询原生平台有没有保存需要跳转的子路由
+    // String routerName = await AppChannel.getNativeRouterName();
+    // Log.d('SplashController - 查询原生平台有没有保存需要跳转的子路由:$routerName');
+
+    String? token = SPUtil.getString(AppConstant.storageToken);
+    final userConfigService = UserConfigService.getInstance();
+    Log.d("userConfigService对象:$userConfigService");
+    userConfigService.setToken(token);
+
+    final userConfigServiceByRef = UserConfigService.getInstance(ref: ref);
+    Log.d("userConfigServiceByRef对象:$userConfigServiceByRef");
+    Log.d("两个UserConfigService是一个对象吗:${userConfigService == userConfigServiceByRef}");
+
+    final appService = ComponentServiceManager().appService;
+    final mainService = ComponentServiceManager().mainService;
+    Log.d("appService:$appService mainService:$mainService");
+
+
+    if (UserConfigService.getState().haslogin == true) {
+      //去Attendance页面签到
+      Log.d("已经登录,去首页页面");
+      ComponentServiceManager().mainService.startMainPage();
+    } else {
+      //去登录页面
+      Log.d("没有登录,去登录页面");
+      ComponentServiceManager().mainService.startMainPage();
+    }
+  }
 }

+ 1 - 1
app/lib/modules/splash/vm/splash_view_model.g.dart

@@ -6,7 +6,7 @@ part of 'splash_view_model.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$splashViewModelHash() => r'52066538d069b52acad4fe94c270cd625938daf8';
+String _$splashViewModelHash() => r'fd8dcc6ad224bff4e340d7a877cf1bc570779af0';
 
 /// See also [SplashViewModel].
 @ProviderFor(SplashViewModel)

+ 62 - 0
app/lib/obs/my_navigator_observer.dart

@@ -0,0 +1,62 @@
+import 'package:flutter/material.dart';
+import 'package:shared/utils/log_utils.dart';
+
+class MyNavigatorObserver extends NavigatorObserver {
+
+  @override
+  void didPush(Route<dynamic> route, Route<dynamic>? previousRoute) {
+    super.didPush(route, previousRoute);
+
+    Log.d('NavigationLogmanRecord{route: ${getRouteName(route)}, action: didPush ,'
+        ' previousRoute: ${getPreviousRouteName(previousRoute)}, '
+        'parameters: ${getParameters(route)}}');
+  }
+
+  @override
+  void didPop(Route<dynamic> route, Route<dynamic>? previousRoute) {
+    super.didPop(route, previousRoute);
+    Log.d('NavigationLogmanRecord{route: ${getRouteName(route)}, action: didPush ,'
+        ' previousRoute: ${getPreviousRouteName(previousRoute)}, '
+        'parameters: ${getParameters(route)}}');
+  }
+
+  @override
+  void didRemove(Route<dynamic> route, Route<dynamic>? previousRoute) {
+    super.didRemove(route, previousRoute);
+    Log.d('NavigationLogmanRecord{route: ${getRouteName(route)}, action: didPush ,'
+        ' previousRoute: ${getPreviousRouteName(previousRoute)}, '
+        'parameters: ${getParameters(route)}}');
+  }
+
+  @override
+  void didReplace({Route<dynamic>? newRoute, Route<dynamic>? oldRoute}) {
+    super.didReplace(newRoute: newRoute, oldRoute: oldRoute);
+    Log.d('NavigationLogmanRecord{route: ${getRouteName(newRoute)}, action: didPush ,'
+        ' previousRoute: ${getPreviousRouteName(oldRoute)}, '
+        'parameters: ${getParameters(newRoute)}}');
+  }
+
+  /// 获取路由参数
+  static Map<String, dynamic> getParameters(Route<dynamic>? route) {
+    final params = <String, dynamic>{};
+    if (route?.settings.arguments != null) {
+      params['arguments'] = route!.settings.arguments;
+    }
+    if (route?.settings.name != null) {
+      params['name'] = route!.settings.name;
+    }
+    return params;
+  }
+
+  /// 获取路由名称
+  static String getRouteName(Route<dynamic>? route) {
+    return route?.settings.name ?? 'Unknown route';
+  }
+
+  /// 获取前一个路由名称
+  static String getPreviousRouteName(Route<dynamic>? previousRoute) {
+    return previousRoute?.settings.name ?? 'Unknown previous route';
+  }
+
+
+}

app/lib/rp_obs/riverpod_observer.dart → app/lib/obs/riverpod_observer.dart


+ 0 - 17
app/lib/router/app_page_router.dart

@@ -1,17 +0,0 @@
-import 'package:auto_route/auto_route.dart';
-import 'package:flutter/material.dart';
-import 'package:plugin_basic/router/basic_page_router.dart';
-import 'package:router/path/router_path.dart';
-
-import '../modules/splash/page/splash_page.dart';
-
-part 'app_page_router.gr.dart';
-
-@AutoRouterConfig(replaceInRouteName: 'Page|Screen,PageRoute')
-class AppRouter extends _$AppRouter {
-  @override
-  List<AutoRoute> get routes => [
-        AutoRoute(page: SplashPageRoute.page, initial: true, path: RouterPath.splash),
-        ...BasicPageRouter().routes,
-      ];
-}

+ 13 - 0
app/lib/router/component/app_component_service_impl.dart

@@ -0,0 +1,13 @@
+/*
+ * App 组件的组件路由
+ */
+import 'package:app/router/page/app_page_router.dart';
+import 'package:auto_route/src/router/controller/routing_controller.dart';
+import 'package:router/componentRouter/app_service.dart';
+
+class AppComponentServiceImpl extends AppService {
+  @override
+  RootStackRouter getAppRouter() {
+    return appRouter;
+  }
+}

+ 15 - 0
app/lib/router/component/app_service_provider.dart

@@ -0,0 +1,15 @@
+import 'package:flutter/material.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:riverpod_annotation/riverpod_annotation.dart';
+import 'package:router/componentRouter/app_service.dart';
+import 'package:router/componentRouter/main_service.dart';
+
+import 'app_component_service_impl.dart';
+
+
+part 'app_service_provider.g.dart';
+
+@Riverpod(keepAlive: true)
+AppService appService(Ref ref) {
+  return AppComponentServiceImpl();
+}

+ 26 - 0
app/lib/router/component/app_service_provider.g.dart

@@ -0,0 +1,26 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'app_service_provider.dart';
+
+// **************************************************************************
+// RiverpodGenerator
+// **************************************************************************
+
+String _$appServiceHash() => r'dd9b4e16b2266e082211e64d347c2dc80ec7102d';
+
+/// See also [appService].
+@ProviderFor(appService)
+final appServiceProvider = Provider<AppService>.internal(
+  appService,
+  name: r'appServiceProvider',
+  debugGetCreateSourceHash:
+      const bool.fromEnvironment('dart.vm.product') ? null : _$appServiceHash,
+  dependencies: null,
+  allTransitiveDependencies: null,
+);
+
+@Deprecated('Will be removed in 3.0. Use Ref instead')
+// ignore: unused_element
+typedef AppServiceRef = ProviderRef<AppService>;
+// ignore_for_file: type=lint
+// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package

+ 33 - 0
app/lib/router/page/app_page_router.dart

@@ -0,0 +1,33 @@
+import 'package:auto_route/auto_route.dart';
+import 'package:cpt_main/router/page/main_page_router.dart';
+import 'package:cpt_profile/router/page/profile_page_router.dart';
+import 'package:flutter/material.dart';
+import 'package:plugin_basic/router/basic_page_router.dart';
+import 'package:router/path/router_path.dart';
+
+import '../../modules/splash/page/splash_page.dart';
+
+part 'app_page_router.gr.dart';
+
+@AutoRouterConfig(replaceInRouteName: 'Page|Screen,PageRoute')
+class AppRouter extends _$AppRouter {
+  @override
+  List<AutoRoute> get routes => [
+        AutoRoute(page: SplashPageRoute.page, initial: true, path: RouterPath.splash),
+        // 合并子模块的路由配置
+        ...BasicPageRouter().routes,
+        ...MainPageRouter().routes,
+        ...ProfilePageRouter().routes,
+      ];
+
+  @override
+  Map<String, PageFactory> get pagesMap => {
+        ...super.pagesMap,
+        // 合并子模块的 pagesMap
+        ...BasicPageRouter().pagesMap,
+        ...MainPageRouter().pagesMap,
+        ...ProfilePageRouter().pagesMap,
+      };
+}
+
+final appRouter = AppRouter();

+ 5 - 22
app/lib/router/app_page_router.gr.dart

@@ -16,11 +16,9 @@ abstract class _$AppRouter extends RootStackRouter {
   @override
   final Map<String, PageFactory> pagesMap = {
     SplashPageRoute.name: (routeData) {
-      final args = routeData.argsAs<SplashPageRouteArgs>(
-          orElse: () => const SplashPageRouteArgs());
       return AutoRoutePage<dynamic>(
         routeData: routeData,
-        child: SplashPage(key: args.key),
+        child: const SplashPage(),
       );
     }
   };
@@ -28,29 +26,14 @@ abstract class _$AppRouter extends RootStackRouter {
 
 /// generated route for
 /// [SplashPage]
-class SplashPageRoute extends PageRouteInfo<SplashPageRouteArgs> {
-  SplashPageRoute({
-    Key? key,
-    List<PageRouteInfo>? children,
-  }) : super(
+class SplashPageRoute extends PageRouteInfo<void> {
+  const SplashPageRoute({List<PageRouteInfo>? children})
+      : super(
           SplashPageRoute.name,
-          args: SplashPageRouteArgs(key: key),
           initialChildren: children,
         );
 
   static const String name = 'SplashPageRoute';
 
-  static const PageInfo<SplashPageRouteArgs> page =
-      PageInfo<SplashPageRouteArgs>(name);
-}
-
-class SplashPageRouteArgs {
-  const SplashPageRouteArgs({this.key});
-
-  final Key? key;
-
-  @override
-  String toString() {
-    return 'SplashPageRouteArgs{key: $key}';
-  }
+  static const PageInfo<void> page = PageInfo<void>(name);
 }

+ 11 - 0
packages/cpt_auth/pubspec.yaml

@@ -36,6 +36,17 @@ dependencies:
   widgets:
     path: ../cs_widgets
 
+  # Riverpod核心库
+  flutter_riverpod: ^2.5.1
+
+  # Riverpod注解
+  riverpod_annotation: ^2.3.5
+
+  # Hooks 简化 Flutter 页面
+  flutter_hooks: ^0.20.5
+
+  # Hooks 简化 Riverpod 获取
+  hooks_riverpod: ^2.5.1
 
 dev_dependencies:
   flutter_test:

+ 11 - 0
packages/cpt_community/pubspec.yaml

@@ -36,6 +36,17 @@ dependencies:
   widgets:
     path: ../cs_widgets
 
+  # Riverpod核心库
+  flutter_riverpod: ^2.5.1
+
+  # Riverpod注解
+  riverpod_annotation: ^2.3.5
+
+  # Hooks 简化 Flutter 页面
+  flutter_hooks: ^0.20.5
+
+  # Hooks 简化 Riverpod 获取
+  hooks_riverpod: ^2.5.1
 
 dev_dependencies:
   flutter_test:

+ 11 - 0
packages/cpt_facility/pubspec.yaml

@@ -36,6 +36,17 @@ dependencies:
   widgets:
     path: ../cs_widgets
 
+  # Riverpod核心库
+  flutter_riverpod: ^2.5.1
+
+  # Riverpod注解
+  riverpod_annotation: ^2.3.5
+
+  # Hooks 简化 Flutter 页面
+  flutter_hooks: ^0.20.5
+
+  # Hooks 简化 Riverpod 获取
+  hooks_riverpod: ^2.5.1
 
 dev_dependencies:
   flutter_test:

+ 11 - 0
packages/cpt_form/pubspec.yaml

@@ -36,6 +36,17 @@ dependencies:
   widgets:
     path: ../cs_widgets
 
+  # Riverpod核心库
+  flutter_riverpod: ^2.5.1
+
+  # Riverpod注解
+  riverpod_annotation: ^2.3.5
+
+  # Hooks 简化 Flutter 页面
+  flutter_hooks: ^0.20.5
+
+  # Hooks 简化 Riverpod 获取
+  hooks_riverpod: ^2.5.1
 
 dev_dependencies:
   flutter_test:

+ 18 - 0
packages/cpt_main/lib/modules/feedback/page/feedback_page.dart

@@ -0,0 +1,18 @@
+import 'package:flutter/material.dart';
+import 'package:auto_route/auto_route.dart';
+
+@RoutePage()
+class FeedbackPage extends StatelessWidget {
+
+  const FeedbackPage({Key? key}) : super(key: key);
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: AppBar(title: Text("Feedback")),
+      body: Center(
+        child: Text("Feedback Page"),
+      ),
+    );
+  }
+}

+ 23 - 0
packages/cpt_main/lib/modules/home/page/home_page.dart

@@ -0,0 +1,23 @@
+import 'package:flutter/material.dart';
+import 'package:flutter/src/widgets/framework.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:auto_route/auto_route.dart';
+
+@RoutePage()
+class HomePage extends HookConsumerWidget{
+
+  const HomePage({super.key});
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    return Center(
+      child: ElevatedButton(
+        onPressed: () {
+
+        },
+        child: Text('Go to Details Page'),
+      ),
+    );
+  }
+
+}

+ 62 - 0
packages/cpt_main/lib/modules/main/page/main_page.dart

@@ -0,0 +1,62 @@
+import 'package:flutter/src/widgets/framework.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:auto_route/auto_route.dart';
+import 'package:flutter/material.dart';
+import 'package:shared/utils/ext_dart.dart';
+import '../../../router/page/main_page_router.dart';
+import 'package:router/ext/auto_router_extensions.dart';
+
+@RoutePage()
+class MainPage extends HookConsumerWidget {
+  const MainPage({super.key});
+
+  //启动当前页面
+  static void startInstance({BuildContext? context}) {
+    if (context != null) {
+      context.router.popUntilRoot();
+      context.router.replace(const MainPageRoute());
+    } else {
+      appRouter.popUntilRoot();
+      appRouter.replace(const MainPageRoute());
+    }
+  }
+
+  @override
+  Widget build(BuildContext context, WidgetRef ref) {
+    return AutoTabsScaffold(
+      routes: const [
+        HomePageRoute(),
+        VisitorPageRoute(),
+        FeedbackPageRoute(),
+        MePageRoute(),
+      ],
+      bottomNavigationBuilder: (context, tabsRouter) {
+        return BottomNavigationBar(
+          unselectedItemColor: Colors.grey[500],
+          elevation: 20,
+          type: BottomNavigationBarType.fixed,
+          currentIndex: tabsRouter.activeIndex,
+          onTap: tabsRouter.setActiveIndex,
+          items: const [
+            BottomNavigationBarItem(
+              icon: Icon(Icons.home),
+              label: 'Home',
+            ),
+            BottomNavigationBarItem(
+              icon: Icon(Icons.card_giftcard),
+              label: 'Visitor',
+            ),
+            BottomNavigationBarItem(
+              icon: Icon(Icons.feed),
+              label: 'Feedback',
+            ),
+            BottomNavigationBarItem(
+              icon: Icon(Icons.person),
+              label: 'Me',
+            ),
+          ],
+        );
+      },
+    );
+  }
+}

+ 0 - 0
packages/cpt_main/lib/modules/main_export.dart


+ 34 - 0
packages/cpt_main/lib/modules/me/page/me_page.dart

@@ -0,0 +1,34 @@
+import 'package:flutter/material.dart';
+import 'package:auto_route/auto_route.dart';
+import 'package:plugin_basic/modules/global_web_page.dart';
+import 'package:router/componentRouter/component_service_manager.dart';
+
+@RoutePage()
+class MePage extends StatelessWidget {
+  const MePage({Key? key}) : super(key: key);
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: AppBar(title: Text("Me")),
+      body:Center(
+        child: Column(
+          children: [
+            ElevatedButton(
+              onPressed: () {
+               ComponentServiceManager().profileService.startEditProfilePage(context: context);
+              },
+              child: const Text('Go to Edit Profile Page'),
+            ),
+            ElevatedButton(
+              onPressed: () {
+               GlobalWebPage.startInstance(context: context, title: "baidu", url: "https://www.baidu.com");
+              },
+              child: const Text('Go to Global Web Page'),
+            ),
+          ],
+        ),
+      ),
+    );
+  }
+}

+ 24 - 0
packages/cpt_main/lib/modules/notification/notification_page.dart

@@ -0,0 +1,24 @@
+import 'package:cpt_main/router/page/main_page_router.dart';
+import 'package:flutter/material.dart';
+import 'package:auto_route/auto_route.dart';
+
+@RoutePage()
+class NotificationPage extends StatelessWidget {
+
+  const NotificationPage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance({required BuildContext context}) {
+    context.router.push(const NotificationPageRoute());
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: AppBar(title: Text("NotificationPage")),
+      body: Center(
+        child: Text("Notification Page"),
+      ),
+    );
+  }
+}

+ 18 - 0
packages/cpt_main/lib/modules/visitor/page/visitor_page.dart

@@ -0,0 +1,18 @@
+import 'package:flutter/material.dart';
+import 'package:auto_route/auto_route.dart';
+
+@RoutePage()
+class VisitorPage extends StatelessWidget {
+
+  const VisitorPage({Key? key}) : super(key: key);
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: AppBar(title: Text("Visitor")),
+      body: Center(
+        child: Text("Visitor Page"),
+      ),
+    );
+  }
+}

+ 17 - 0
packages/cpt_main/lib/router/component/main_component_service_impl.dart

@@ -0,0 +1,17 @@
+/*
+ * Main 组件的组件路由
+ */
+import 'package:cpt_main/modules/main/page/main_page.dart';
+import 'package:flutter/material.dart';
+import 'package:router/componentRouter/main_service.dart';
+
+class MainComponentServiceImpl extends MainService {
+  @override
+  void startMainPage({BuildContext? context}) {
+    MainPage.startInstance(context: context);
+  }
+
+  @override
+  void startSettingPage({BuildContext? context}) {}
+}
+

+ 15 - 0
packages/cpt_main/lib/router/component/main_service_provider.dart

@@ -0,0 +1,15 @@
+import 'package:flutter/material.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:riverpod_annotation/riverpod_annotation.dart';
+import 'package:router/componentRouter/main_service.dart';
+
+import 'main_component_service_impl.dart';
+
+
+part 'main_service_provider.g.dart';
+
+
+@Riverpod(keepAlive: true)
+MainService mainService(Ref ref) {
+  return MainComponentServiceImpl();
+}

+ 26 - 0
packages/cpt_main/lib/router/component/main_service_provider.g.dart

@@ -0,0 +1,26 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'main_service_provider.dart';
+
+// **************************************************************************
+// RiverpodGenerator
+// **************************************************************************
+
+String _$mainServiceHash() => r'2b03917e96b42715188fa94d2aee85a3eff2227a';
+
+/// See also [mainService].
+@ProviderFor(mainService)
+final mainServiceProvider = Provider<MainService>.internal(
+  mainService,
+  name: r'mainServiceProvider',
+  debugGetCreateSourceHash:
+      const bool.fromEnvironment('dart.vm.product') ? null : _$mainServiceHash,
+  dependencies: null,
+  allTransitiveDependencies: null,
+);
+
+@Deprecated('Will be removed in 3.0. Use Ref instead')
+// ignore: unused_element
+typedef MainServiceRef = ProviderRef<MainService>;
+// ignore_for_file: type=lint
+// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package

+ 36 - 0
packages/cpt_main/lib/router/page/main_page_router.dart

@@ -0,0 +1,36 @@
+import 'package:auto_route/auto_route.dart';
+import 'package:flutter/material.dart';
+import 'package:router/ext/auto_router_extensions.dart';
+import 'package:router/path/router_path.dart';
+
+import '../../modules/feedback/page/feedback_page.dart';
+import '../../modules/home/page/home_page.dart';
+import '../../modules/main/page/main_page.dart';
+import '../../modules/me/page/me_page.dart';
+import '../../modules/notification/notification_page.dart';
+import '../../modules/visitor/page/visitor_page.dart';
+
+
+part 'main_page_router.gr.dart';
+
+/*\
+ * 全局的通用页面的路由
+ */
+@AutoRouterConfig(replaceInRouteName: 'Page|Screen,PageRoute')
+class MainPageRouter extends _$MainPageRouter {
+  @override
+  List<AutoRoute> get routes => [
+    CustomRoute(
+      page: MainPageRoute.page,
+      transitionsBuilder: applySlideTransition,
+      path: RouterPath.main,
+      children: [
+        AutoRoute(page: HomePageRoute.page, path: 'home'),
+        AutoRoute(page: VisitorPageRoute.page, path: 'visitor'),
+        AutoRoute(page: FeedbackPageRoute.page, path: 'feedback'),
+        AutoRoute(page: MePageRoute.page, path: 'me'),
+      ],
+    ),
+    CustomRoute(page: NotificationPageRoute.page, path: RouterPath.notification, transitionsBuilder: applySlideTransition),
+  ];
+}

+ 139 - 0
packages/cpt_main/lib/router/page/main_page_router.gr.dart

@@ -0,0 +1,139 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+// **************************************************************************
+// AutoRouterGenerator
+// **************************************************************************
+
+// ignore_for_file: type=lint
+// coverage:ignore-file
+
+part of 'main_page_router.dart';
+
+abstract class _$MainPageRouter extends RootStackRouter {
+  // ignore: unused_element
+  _$MainPageRouter({super.navigatorKey});
+
+  @override
+  final Map<String, PageFactory> pagesMap = {
+    FeedbackPageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: const FeedbackPage(),
+      );
+    },
+    HomePageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: const HomePage(),
+      );
+    },
+    MainPageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: const MainPage(),
+      );
+    },
+    MePageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: const MePage(),
+      );
+    },
+    NotificationPageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: const NotificationPage(),
+      );
+    },
+    VisitorPageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: const VisitorPage(),
+      );
+    },
+  };
+}
+
+/// generated route for
+/// [FeedbackPage]
+class FeedbackPageRoute extends PageRouteInfo<void> {
+  const FeedbackPageRoute({List<PageRouteInfo>? children})
+      : super(
+          FeedbackPageRoute.name,
+          initialChildren: children,
+        );
+
+  static const String name = 'FeedbackPageRoute';
+
+  static const PageInfo<void> page = PageInfo<void>(name);
+}
+
+/// generated route for
+/// [HomePage]
+class HomePageRoute extends PageRouteInfo<void> {
+  const HomePageRoute({List<PageRouteInfo>? children})
+      : super(
+          HomePageRoute.name,
+          initialChildren: children,
+        );
+
+  static const String name = 'HomePageRoute';
+
+  static const PageInfo<void> page = PageInfo<void>(name);
+}
+
+/// generated route for
+/// [MainPage]
+class MainPageRoute extends PageRouteInfo<void> {
+  const MainPageRoute({List<PageRouteInfo>? children})
+      : super(
+          MainPageRoute.name,
+          initialChildren: children,
+        );
+
+  static const String name = 'MainPageRoute';
+
+  static const PageInfo<void> page = PageInfo<void>(name);
+}
+
+/// generated route for
+/// [MePage]
+class MePageRoute extends PageRouteInfo<void> {
+  const MePageRoute({List<PageRouteInfo>? children})
+      : super(
+          MePageRoute.name,
+          initialChildren: children,
+        );
+
+  static const String name = 'MePageRoute';
+
+  static const PageInfo<void> page = PageInfo<void>(name);
+}
+
+/// generated route for
+/// [NotificationPage]
+class NotificationPageRoute extends PageRouteInfo<void> {
+  const NotificationPageRoute({List<PageRouteInfo>? children})
+      : super(
+          NotificationPageRoute.name,
+          initialChildren: children,
+        );
+
+  static const String name = 'NotificationPageRoute';
+
+  static const PageInfo<void> page = PageInfo<void>(name);
+}
+
+/// generated route for
+/// [VisitorPage]
+class VisitorPageRoute extends PageRouteInfo<void> {
+  const VisitorPageRoute({List<PageRouteInfo>? children})
+      : super(
+          VisitorPageRoute.name,
+          initialChildren: children,
+        );
+
+  static const String name = 'VisitorPageRoute';
+
+  static const PageInfo<void> page = PageInfo<void>(name);
+}

+ 11 - 0
packages/cpt_main/pubspec.yaml

@@ -36,6 +36,17 @@ dependencies:
   widgets:
     path: ../cs_widgets
 
+  # Riverpod核心库
+  flutter_riverpod: ^2.5.1
+
+  # Riverpod注解
+  riverpod_annotation: ^2.3.5
+
+  # Hooks 简化 Flutter 页面
+  flutter_hooks: ^0.20.5
+
+  # Hooks 简化 Riverpod 获取
+  hooks_riverpod: ^2.5.1
 
 dev_dependencies:
   flutter_test:

+ 11 - 0
packages/cpt_notice_board/pubspec.yaml

@@ -36,6 +36,17 @@ dependencies:
   widgets:
     path: ../cs_widgets
 
+  # Riverpod核心库
+  flutter_riverpod: ^2.5.1
+
+  # Riverpod注解
+  riverpod_annotation: ^2.3.5
+
+  # Hooks 简化 Flutter 页面
+  flutter_hooks: ^0.20.5
+
+  # Hooks 简化 Riverpod 获取
+  hooks_riverpod: ^2.5.1
 
 dev_dependencies:
   flutter_test:

+ 11 - 0
packages/cpt_payment/pubspec.yaml

@@ -36,6 +36,17 @@ dependencies:
   widgets:
     path: ../cs_widgets
 
+  # Riverpod核心库
+  flutter_riverpod: ^2.5.1
+
+  # Riverpod注解
+  riverpod_annotation: ^2.3.5
+
+  # Hooks 简化 Flutter 页面
+  flutter_hooks: ^0.20.5
+
+  # Hooks 简化 Riverpod 获取
+  hooks_riverpod: ^2.5.1
 
 dev_dependencies:
   flutter_test:

+ 28 - 0
packages/cpt_profile/lib/modules/profile_edit/page/Profile_edit_page.dart

@@ -0,0 +1,28 @@
+import 'package:cpt_profile/router/page/profile_page_router.dart';
+import 'package:flutter/material.dart';
+import 'package:auto_route/auto_route.dart';
+import 'package:router/ext/auto_router_extensions.dart';
+
+@RoutePage()
+class ProfileEditPage extends StatelessWidget {
+  const ProfileEditPage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance({BuildContext? context}) {
+    if (context != null) {
+      context.router.push(const ProfileEditPageRoute());
+    } else {
+      appRouter.push(const ProfileEditPageRoute());
+    }
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: AppBar(title: Text("Profile Edit Page")),
+      body: Center(
+        child: Text("Profile Edit Page"),
+      ),
+    );
+  }
+}

+ 0 - 0
packages/cpt_profile/lib/modules/profile_export.dart


+ 15 - 0
packages/cpt_profile/lib/router/component/profile_component_service_impl.dart

@@ -0,0 +1,15 @@
+/*
+ * Main 组件的组件路由
+ */
+import 'package:flutter/cupertino.dart';
+import 'package:router/componentRouter/profile_service.dart';
+
+import '../../modules/profile_edit/page/Profile_edit_page.dart';
+
+class ProfileComponentServiceImpl extends ProfileService {
+  @override
+  void startEditProfilePage({BuildContext? context}) {
+    ProfileEditPage.startInstance(context: context);
+  }
+
+}

+ 13 - 0
packages/cpt_profile/lib/router/component/profile_service_provider.dart

@@ -0,0 +1,13 @@
+import 'package:flutter/material.dart';
+import 'package:hooks_riverpod/hooks_riverpod.dart';
+import 'package:riverpod_annotation/riverpod_annotation.dart';
+import 'package:router/componentRouter/profile_service.dart';
+
+import 'profile_component_service_impl.dart';
+
+part 'profile_service_provider.g.dart';
+
+@Riverpod(keepAlive: true)
+ProfileService profileService(Ref ref) {
+  return ProfileComponentServiceImpl();
+}

+ 27 - 0
packages/cpt_profile/lib/router/component/profile_service_provider.g.dart

@@ -0,0 +1,27 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+part of 'profile_service_provider.dart';
+
+// **************************************************************************
+// RiverpodGenerator
+// **************************************************************************
+
+String _$profileServiceHash() => r'e0aa8bdee39ee2b1dff16b7ce13a6f32e7b17b76';
+
+/// See also [profileService].
+@ProviderFor(profileService)
+final profileServiceProvider = Provider<ProfileService>.internal(
+  profileService,
+  name: r'profileServiceProvider',
+  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
+      ? null
+      : _$profileServiceHash,
+  dependencies: null,
+  allTransitiveDependencies: null,
+);
+
+@Deprecated('Will be removed in 3.0. Use Ref instead')
+// ignore: unused_element
+typedef ProfileServiceRef = ProviderRef<ProfileService>;
+// ignore_for_file: type=lint
+// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package

+ 21 - 0
packages/cpt_profile/lib/router/page/profile_page_router.dart

@@ -0,0 +1,21 @@
+import 'package:auto_route/auto_route.dart';
+import 'package:flutter/material.dart';
+import 'package:router/ext/auto_router_extensions.dart';
+import 'package:router/path/router_path.dart';
+
+import '../../modules/profile_edit/page/Profile_edit_page.dart';
+
+
+part 'profile_page_router.gr.dart';
+
+/*\
+ * 全局的通用页面的路由
+ */
+@AutoRouterConfig(replaceInRouteName: 'Page|Screen,PageRoute')
+class ProfilePageRouter extends _$ProfilePageRouter {
+  @override
+  List<AutoRoute> get routes => [
+
+    CustomRoute(page: ProfileEditPageRoute.page, path: RouterPath.profileEdit, transitionsBuilder: applySlideTransition),
+  ];
+}

+ 39 - 0
packages/cpt_profile/lib/router/page/profile_page_router.gr.dart

@@ -0,0 +1,39 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+// **************************************************************************
+// AutoRouterGenerator
+// **************************************************************************
+
+// ignore_for_file: type=lint
+// coverage:ignore-file
+
+part of 'profile_page_router.dart';
+
+abstract class _$ProfilePageRouter extends RootStackRouter {
+  // ignore: unused_element
+  _$ProfilePageRouter({super.navigatorKey});
+
+  @override
+  final Map<String, PageFactory> pagesMap = {
+    ProfileEditPageRoute.name: (routeData) {
+      return AutoRoutePage<dynamic>(
+        routeData: routeData,
+        child: const ProfileEditPage(),
+      );
+    }
+  };
+}
+
+/// generated route for
+/// [ProfileEditPage]
+class ProfileEditPageRoute extends PageRouteInfo<void> {
+  const ProfileEditPageRoute({List<PageRouteInfo>? children})
+      : super(
+          ProfileEditPageRoute.name,
+          initialChildren: children,
+        );
+
+  static const String name = 'ProfileEditPageRoute';
+
+  static const PageInfo<void> page = PageInfo<void>(name);
+}

+ 11 - 0
packages/cpt_profile/pubspec.yaml

@@ -36,6 +36,17 @@ dependencies:
   widgets:
     path: ../cs_widgets
 
+  # Riverpod核心库
+  flutter_riverpod: ^2.5.1
+
+  # Riverpod注解
+  riverpod_annotation: ^2.3.5
+
+  # Hooks 简化 Flutter 页面
+  flutter_hooks: ^0.20.5
+
+  # Hooks 简化 Riverpod 获取
+  hooks_riverpod: ^2.5.1
 
 dev_dependencies:
   flutter_test:

+ 11 - 0
packages/cpt_property/pubspec.yaml

@@ -36,6 +36,17 @@ dependencies:
   widgets:
     path: ../cs_widgets
 
+  # Riverpod核心库
+  flutter_riverpod: ^2.5.1
+
+  # Riverpod注解
+  riverpod_annotation: ^2.3.5
+
+  # Hooks 简化 Flutter 页面
+  flutter_hooks: ^0.20.5
+
+  # Hooks 简化 Riverpod 获取
+  hooks_riverpod: ^2.5.1
 
 dev_dependencies:
   flutter_test:

+ 11 - 0
packages/cpt_rewards/pubspec.yaml

@@ -36,6 +36,17 @@ dependencies:
   widgets:
     path: ../cs_widgets
 
+  # Riverpod核心库
+  flutter_riverpod: ^2.5.1
+
+  # Riverpod注解
+  riverpod_annotation: ^2.3.5
+
+  # Hooks 简化 Flutter 页面
+  flutter_hooks: ^0.20.5
+
+  # Hooks 简化 Riverpod 获取
+  hooks_riverpod: ^2.5.1
 
 dev_dependencies:
   flutter_test:

+ 12 - 0
packages/cpt_services/pubspec.yaml

@@ -36,6 +36,18 @@ dependencies:
   widgets:
     path: ../cs_widgets
 
+  # Riverpod核心库
+  flutter_riverpod: ^2.5.1
+
+  # Riverpod注解
+  riverpod_annotation: ^2.3.5
+
+  # Hooks 简化 Flutter 页面
+  flutter_hooks: ^0.20.5
+
+  # Hooks 简化 Riverpod 获取
+  hooks_riverpod: ^2.5.1
+
 dev_dependencies:
   flutter_test:
     sdk: flutter

+ 2 - 3
packages/cs_initializer/lib/app_initializer.dart

@@ -1,7 +1,6 @@
 import 'package:flutter/foundation.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
-import 'package:plugin_basic/provider/global_provider_container.dart';
 import 'package:plugin_platform/engine/directory/directory_util.dart';
 import 'package:plugin_platform/engine/sp/sp_util.dart';
 import 'package:shared/utils/log_utils.dart';
@@ -57,7 +56,7 @@ class AppInitializer {
       DirectoryUtil.getInstance(), // SD卡管控
 
       //AppConfig服务
-      globalContainer.read(appConfigServiceProvider.notifier).initAsync(),
+      AppConfigService.getInstance().initAsync(),
     ];
 
     // 如果提供了 futureTasks,调用并添加到 futures 列表
@@ -99,7 +98,7 @@ class AppInitializer {
     DirectoryUtil.getInstance(); //SD卡管控
 
     //AppConfig服务
-    await globalContainer.read(appConfigServiceProvider.notifier).initAsync();
+    await AppConfigService.getInstance().initAsync();
 
     //指定页面的展示方向为哪一种,常用的三种屏幕方向
     SystemChrome.setPreferredOrientations([

+ 1 - 2
packages/cs_plugin_basic/lib/dio_interceptors/interceptor_auth_dio.dart

@@ -3,7 +3,6 @@ import 'package:shared/utils/device_utils.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/util.dart';
 
-import '../provider/global_provider_container.dart';
 import '../provider/user_config/user_config_service.dart';
 
 
@@ -45,7 +44,7 @@ class AuthDioInterceptors extends Interceptor {
     // }
 
     //如果有通行令牌,都带上通行令牌
-    String? token = globalContainer.read(userConfigServiceProvider)?.token;
+    String? token =  UserConfigService.getState().token;
     Log.d("AuthDioInterceptors 添加用户授权Token:$token");
     if (!Utils.isEmpty(token)) {
       headers['Authorization'] = 'Bearer $token';

+ 1 - 3
packages/cs_plugin_basic/lib/dio_interceptors/interceptor_status_code_dio.dart

@@ -4,8 +4,6 @@ import 'package:plugin_platform/dio_export.dart';
 import 'package:plugin_platform/engine/dialog/dialog_engine.dart';
 import 'package:widgets/dialog/app_default_dialog.dart';
 
-import '../provider/global_provider_container.dart';
-
 /*
  * 特殊状态code处理的拦截器,
  * 401 弹出弹窗提示用户重新登录
@@ -39,7 +37,7 @@ class StatusCodeDioInterceptors extends Interceptor {
     if (!isDialogShowing) {
       //弹框就清除了数据
       //使用 UserConfigService 对象中的方法处理
-      globalContainer.read(userConfigServiceProvider.notifier).handleLogoutParams();
+      UserConfigService.getInstance().handleLogoutParams();
 
       //拦截 token 过期,弹出弹窗提示用户重新登录
       DialogEngine.show(

+ 11 - 0
packages/cs_plugin_basic/lib/provider/app_config/app_config_service.dart

@@ -1,16 +1,27 @@
 import 'package:device_info_plus/device_info_plus.dart';
 import 'package:flutter/cupertino.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
 import 'package:package_info_plus/package_info_plus.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
 import 'package:shared/utils/device_utils.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/screen_util.dart';
+import '../global_provider_container.dart';
 import 'app_config.dart';
 
 part 'app_config_service.g.dart';
 
 @Riverpod(keepAlive: true)
 class AppConfigService extends _$AppConfigService {
+  /// 静态方法获取当前单例对象
+  static AppConfigService getInstance() {
+    return globalContainer.read(appConfigServiceProvider.notifier);
+  }
+
+  static AppConfig getState() {
+    return globalContainer.read(appConfigServiceProvider);
+  }
+
   @override
   AppConfig build() {
     return AppConfig(

+ 1 - 1
packages/cs_plugin_basic/lib/provider/app_config/app_config_service.g.dart

@@ -6,7 +6,7 @@ part of 'app_config_service.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$appConfigServiceHash() => r'9b335afd361b5b0d5c354977fadec7bb7235b013';
+String _$appConfigServiceHash() => r'133b41e8af51e41f3d4e8b123da40a9b73a4da61';
 
 /// See also [AppConfigService].
 @ProviderFor(AppConfigService)

+ 20 - 0
packages/cs_plugin_basic/lib/provider/user_config/user_config_service.dart

@@ -1,3 +1,4 @@
+import 'package:flutter_riverpod/flutter_riverpod.dart';
 import 'package:plugin_basic/provider/user_config/user_config.dart';
 import 'package:plugin_platform/engine/sp/sp_util.dart';
 import 'package:riverpod_annotation/riverpod_annotation.dart';
@@ -5,6 +6,7 @@ import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/util.dart';
 
 import '../../constants/app_constant.dart';
+import '../global_provider_container.dart';
 
 part 'user_config_service.g.dart';
 
@@ -13,6 +15,24 @@ part 'user_config_service.g.dart';
  */
 @Riverpod(keepAlive: true)
 class UserConfigService extends _$UserConfigService {
+
+  /// 静态方法获取当前单例对象
+  static UserConfigService getInstance({Ref? ref}) {
+    if (ref != null) {
+      return ref.watch(userConfigServiceProvider.notifier);
+    } else {
+      return globalContainer.read(userConfigServiceProvider.notifier);
+    }
+  }
+
+  static UserConfig getState({Ref? ref}){
+    if (ref != null) {
+      return ref.watch(userConfigServiceProvider);
+    } else {
+      return globalContainer.read(userConfigServiceProvider);
+    }
+  }
+
   @override
   UserConfig build() {
     String? token = SPUtil.getString(AppConstant.storageToken);

+ 1 - 1
packages/cs_plugin_basic/lib/provider/user_config/user_config_service.g.dart

@@ -6,7 +6,7 @@ part of 'user_config_service.dart';
 // RiverpodGenerator
 // **************************************************************************
 
-String _$userConfigServiceHash() => r'b6990fa6d1ddc625877f48661e6df875a876acc6';
+String _$userConfigServiceHash() => r'1d0099a11d7e56306197ff341b4cce4aa8e91a81';
 
 /// See also [UserConfigService].
 @ProviderFor(UserConfigService)

+ 11 - 0
packages/cs_router/lib/componentRouter/app_service.dart

@@ -0,0 +1,11 @@
+/*
+ * Main 组件对应的路由抽象接口
+ */
+import 'package:auto_route/auto_route.dart';
+import 'package:flutter/cupertino.dart';
+
+abstract class AppService {
+
+  RootStackRouter getAppRouter();
+
+}

+ 62 - 0
packages/cs_router/lib/componentRouter/component_service_manager.dart

@@ -0,0 +1,62 @@
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:router/componentRouter/profile_service.dart';
+
+import '../ext/router_provider_container.dart';
+import 'app_service.dart';
+import 'main_service.dart';
+
+
+class ComponentServiceManager {
+  // 私有构造函数
+  ComponentServiceManager._internal();
+
+  // 单例实例
+  static final ComponentServiceManager _instance = ComponentServiceManager._internal();
+
+  factory ComponentServiceManager() {
+    return _instance;
+  }
+
+  // 存储 `ServiceProvider` 的 Map
+  final Map<Type, Provider> _serviceProviders = {};
+
+  // 添加 `ServiceProvider` 的方法
+  void addServiceProvider<T>(Provider<T> provider) {
+    _serviceProviders[T] = provider;
+  }
+
+  // 获取 `MainService` 的方法
+  MainService get mainService {
+    final provider = _serviceProviders[MainService];
+    if (provider == null) {
+      throw Exception('Provider for MainService not found.');
+    }
+    return routerContainer.read(provider as Provider<MainService>);
+  }
+
+  AppService get appService {
+    final provider = _serviceProviders[AppService];
+    if (provider == null) {
+      throw Exception('Provider for AppService not found.');
+    }
+    return routerContainer.read(provider as Provider<AppService>);
+  }
+
+  ProfileService get profileService {
+    final provider = _serviceProviders[ProfileService];
+    if (provider == null) {
+      throw Exception('Provider for ProfileService not found.');
+    }
+    return routerContainer.read(provider as Provider<ProfileService>);
+  }
+
+
+// 在这里可以继续添加其他具体的服务获取方法
+// OtherService get otherService {
+//   final provider = _serviceProviders[OtherService];
+//   if (provider == null) {
+//     throw Exception('Provider for OtherService not found.');
+//   }
+//   return routerContainer.read(provider as Provider<OtherService>);
+// }
+}

+ 4 - 2
packages/cs_router/lib/componentRouter/main_service.dart

@@ -1,10 +1,12 @@
 /*
  * Main 组件对应的路由抽象接口
  */
+import 'package:flutter/cupertino.dart';
+
 abstract class MainService {
 
-  void startMainPage();
+  void startMainPage({BuildContext? context});
 
-  void startSettingPage();
+  void startSettingPage({BuildContext? context});
 
 }

+ 3 - 4
packages/cs_router/lib/componentRouter/profile_service.dart

@@ -1,12 +1,11 @@
-import 'package:auto_route/auto_route.dart';
 
 /*
  * Profile 组件对应的路由抽象接口
  */
-abstract class ProfileService {
+import 'package:flutter/cupertino.dart';
 
-  void startEditProfilePage();
+abstract class ProfileService {
 
-  PageRouteInfo getProfileRouterInfo();
+  void startEditProfilePage({BuildContext? context});
 
 }

+ 10 - 0
packages/cs_router/lib/ext/auto_router_extensions.dart

@@ -1,6 +1,8 @@
 import 'package:auto_route/auto_route.dart';
 import 'package:flutter/material.dart';
 
+import '../componentRouter/component_service_manager.dart';
+
 // 扩展 RootStackRouter 类
 extension RootStackRouterExtensions on RootStackRouter {
   // SlideFadeTransition 动画效果 (平移渐变动画)
@@ -38,3 +40,11 @@ extension RootStackRouterExtensions on RootStackRouter {
     );
   }
 }
+
+//获取宿主的全局 AppRouter 对象,用于任意地方使用
+extension AppRouterExtension on Object {
+  RootStackRouter get appRouter => ComponentServiceManager().appService.getAppRouter();
+}
+
+//定义一个全局函数来获取 appRouter
+RootStackRouter get appRouter => ComponentServiceManager().appService.getAppRouter();

+ 3 - 0
packages/cs_router/lib/ext/navigator_key.dart

@@ -0,0 +1,3 @@
+import 'package:flutter/material.dart';
+
+final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();

+ 4 - 0
packages/cs_router/lib/ext/router_provider_container.dart

@@ -0,0 +1,4 @@
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+
+//全局单例的Provider 用于非UI无ref对象的场景引入
+final routerContainer = ProviderContainer();

+ 3 - 51
packages/cs_router/lib/path/router_path.dart

@@ -8,62 +8,14 @@ class RouterPath {
   static const authLogin = '/auth/login'; //用户登录注册
   static const authSignUp = '/auth/signup'; //注册
   static const authResetPassword = '/auth/rest_psd'; //重置密码
-  static const authSelectCountry = '/auth/select/country'; //切换国家
 
   //首页
   static const main = '/main';
   static const settings = '/settings';
+  static const notification = '/notification';
 
-  //工作-签到签出
-  static const jobSignInSignOut = '/job/sign_in_sign_out';
-
-  //工作-列表
-  static const jobList = '/job/list';
-  static const jobListDetail = '/job/list/detail'; //查看工作的详情
-  static const jobAppliedStaffList = '/job/applied'; //指定工作中已申请的成员列表
-  static const jobAppliedStaffEdit = '/job/applied/edit'; //指定工作中已申请的指定员工的信息修改(签到签出等修改)
-  static const jobAppliedStaffWorkflow = '/job/applied/workflow'; //指定工作中已申请的指定员工的信息与状态修改工作流
-  static const jobAppliedStaffDetail = '/job/applied/staff/detail'; //工作中员工的详细信息
-  static const jobAppliedStaffReviews = '/job/applied/staff/reviews'; //工作中员工的被评价列表
-  static const jobAttendanceReviewList = '/job/attendance/review/list'; //工作考勤的审核列表
-
-  //用工请求
-  static const jobLabourRequestList = '/labour/list'; //用工请求列表
-  static const jobLabourRequestAdd = '/labour/add'; //用工请求添加
-  static const jobLabourRequestDetail = '/labour/detail'; //用工请求详情
-  static const jobLabourRequestWorkflow = '/labour/workflow'; //用工请求修改状态的工作流
-  static const labourTemplateList = '/labour/template/list'; //模板列表
-  static const labourTemplateAdd = '/labour/template/add'; //模板添加
-  static const labourReviewList = '/labour/review/list'; //用工请求审核列表
-  static const labourReviewEdit = '/labour/review/edit'; //用工请求审核编辑
-  static const labourReviewWorkflow = '/labour/review/workflow'; //用工请求审核工作流
-
-  //其他模块和报表模块
-  static const deviceList = '/device/list'; //雇主绑定的设备列表
-  static const reportList = '/report/list'; //报表的选项
-  static const reportFinance = '/report/finance'; //金额报表
-  static const reportCasualLabour = '/report/labour'; //用工请求报表
-  static const reportLabourVN = '/report/labour/vn'; //用工请求报表(越南的单独页面)
-  static const reportStaffRequest = '/report/staff/request'; //员工申请报表
-
-  //新加坡的用工请求
-  static const jobTitleListSG = '/job/title/list/sg'; //模板的工作标题列表
-  static const jobTemplateListSG = '/job/template/list/sg'; //模板列表
-  static const jobTemplateAddSG = '/job/template/add/sg'; //模板添加
-  static const labourRequestSG = '/labour/request/sg'; //用工首页
-  static const labourRequestAddSG = '/labour/request/add/sg'; //用工请求添加
-
-  //新加坡的工作列表
-  static const jobListSG = '/job/list/sg'; //工作列表(新加坡)
-  static const jobListEditSG = '/job/list/edit'; //工作列表编辑与详情(新加坡)
-  static const jobListAppliedSG = '/job/list/applied'; //工作列表已申请列表(新加坡)
-  static const jobListAppliedStaffListSG = '/job/list/applied/staff/list'; //工作列表已申请列表添加员工列表(新加坡)
-  static const jobListAppliedStaffDetailSG = '/job/list/applied/staff/detail'; //工作列表已申请列表员工详情(新加坡)
-  static const jobListAppliedStaffReviewSG = '/job/list/applied/staff/reviews'; //工作列表已申请列表员工的评论列表(新加坡)
-  static const reviseListSG = '/revise/list'; //Revise列表(新加坡)
-  static const reviseAppliedSG = '/revise/applied'; //Applied的Revise(新加坡)
-  static const reviseLogSG = '/revise/log'; //Revise 的日志(新加坡)
-  static const reviseEditSG = '/revise/edit'; //Revise 的添加,编辑,详情(新加坡)
+  //用户
+  static const profileEdit = '/profile/edit';
 
   //全局其他
   static const previewImage = '/preview/image'; //预览图片

+ 34 - 0
packages/cs_shared/lib/utils/ext_dart.dart

@@ -1,4 +1,5 @@
 import 'dart:async';
+import 'package:flutter/material.dart';
 import 'package:flutter_riverpod/flutter_riverpod.dart';
 import 'package:shared/utils/screen_util.dart';
 import 'package:shared/utils/util.dart';
@@ -139,3 +140,36 @@ extension ThrottleExtension on Function {
     };
   }
 }
+
+//页面中可能要用到的扩展
+extension BuildContextExtensions on BuildContext {
+  ThemeData get theme => Theme.of(this);
+
+  Size get screenSize => MediaQuery.sizeOf(this);
+
+  EdgeInsets get screenPadding => MediaQuery.paddingOf(this);
+
+  TextScaler get screenTextScaleFactor => MediaQuery.textScalerOf(this);
+
+  bool get isSmallScreen => screenSize.width < 800;
+
+  bool get isMediumScreen => screenSize.width >= 800 && screenSize.width <= 1200;
+
+  bool get isLargeScreen => screenSize.width > 800 && !isMediumScreen;
+
+  bool get isPlatformDarkThemed => MediaQuery.platformBrightnessOf(this) == Brightness.dark;
+
+  void showSnackBar(SnackBar snackBar) {
+    ScaffoldMessenger.of(this).showSnackBar(snackBar);
+  }
+
+  void showSnackBarUsingText(String text) {
+    final snackBar = SnackBar(
+      content: Text(
+        text,
+        style: const TextStyle(color: Colors.white),
+      ),
+    );
+    ScaffoldMessenger.of(this).showSnackBar(snackBar);
+  }
+}