# RWA Android App - Claude Code 开发指南 ## 项目概述 Flutter 移动端应用,采用 **3层 Clean Architecture + Riverpod** 架构。 - **Presentation**: Pages + Widgets + Providers (Riverpod) - **Domain**: Entities + UseCases + Repository接口 - **Data**: Models + DataSources + Repository实现 --- ## 初始化任务 ### 任务1: 创建目录结构 在 `lib/` 下执行以下结构创建: ``` lib/ ├── main.dart # 保留,后续修改 ├── main_development.dart # 新建 ├── main_production.dart # 新建 ├── app.dart # 新建 ├── bootstrap.dart # 新建 │ ├── core/ │ ├── constants/ │ │ ├── app_constants.dart │ │ ├── api_endpoints.dart │ │ ├── storage_keys.dart │ │ └── chain_constants.dart │ │ │ ├── errors/ │ │ ├── exceptions.dart │ │ ├── failures.dart │ │ └── error_handler.dart │ │ │ ├── network/ │ │ ├── dio_client.dart │ │ ├── api_interceptors.dart │ │ ├── network_info.dart │ │ └── api_response.dart │ │ │ ├── blockchain/ │ │ ├── web3_client.dart │ │ ├── wallet_utils.dart │ │ ├── mnemonic_utils.dart │ │ ├── transaction_utils.dart │ │ └── chain_config.dart │ │ │ ├── storage/ │ │ ├── secure_storage.dart │ │ ├── local_storage.dart │ │ └── cache_manager.dart │ │ │ ├── utils/ │ │ ├── validators.dart │ │ ├── formatters.dart │ │ ├── date_utils.dart │ │ ├── number_utils.dart │ │ ├── clipboard_utils.dart │ │ └── logger.dart │ │ │ ├── extensions/ │ │ ├── context_extensions.dart │ │ ├── string_extensions.dart │ │ ├── num_extensions.dart │ │ └── list_extensions.dart │ │ │ ├── theme/ │ │ ├── app_theme.dart │ │ ├── app_colors.dart │ │ ├── app_text_styles.dart │ │ ├── app_shadows.dart │ │ ├── app_gradients.dart │ │ └── app_dimensions.dart │ │ │ └── di/ │ └── injection_container.dart │ ├── features/ │ ├── auth/ │ │ ├── data/ │ │ │ ├── datasources/ │ │ │ │ ├── auth_local_datasource.dart │ │ │ │ └── auth_remote_datasource.dart │ │ │ ├── models/ │ │ │ │ ├── wallet_model.dart │ │ │ │ ├── mnemonic_model.dart │ │ │ │ └── user_model.dart │ │ │ └── repositories/ │ │ │ └── auth_repository_impl.dart │ │ ├── domain/ │ │ │ ├── entities/ │ │ │ │ ├── wallet_entity.dart │ │ │ │ ├── mnemonic_entity.dart │ │ │ │ └── user_entity.dart │ │ │ ├── repositories/ │ │ │ │ └── auth_repository.dart │ │ │ └── usecases/ │ │ │ ├── create_wallet.dart │ │ │ ├── import_wallet.dart │ │ │ ├── generate_mnemonic.dart │ │ │ ├── verify_mnemonic.dart │ │ │ ├── backup_mnemonic.dart │ │ │ └── check_login_status.dart │ │ └── presentation/ │ │ ├── providers/ │ │ │ ├── auth_provider.dart │ │ │ ├── wallet_provider.dart │ │ │ └── mnemonic_provider.dart │ │ ├── pages/ │ │ │ ├── splash_page.dart │ │ │ ├── onboarding_page.dart │ │ │ ├── create_wallet_page.dart │ │ │ ├── backup_mnemonic_page.dart │ │ │ ├── verify_mnemonic_page.dart │ │ │ ├── wallet_created_page.dart │ │ │ └── import_wallet_page.dart │ │ └── widgets/ │ │ ├── mnemonic_grid.dart │ │ ├── mnemonic_word_chip.dart │ │ ├── address_display_card.dart │ │ └── wallet_type_selector.dart │ │ │ ├── ranking/ │ │ ├── data/ │ │ │ ├── datasources/ │ │ │ │ └── ranking_remote_datasource.dart │ │ │ ├── models/ │ │ │ │ ├── ranking_item_model.dart │ │ │ │ └── ranking_list_model.dart │ │ │ └── repositories/ │ │ │ └── ranking_repository_impl.dart │ │ ├── domain/ │ │ │ ├── entities/ │ │ │ │ ├── ranking_item_entity.dart │ │ │ │ └── ranking_type.dart │ │ │ ├── repositories/ │ │ │ │ └── ranking_repository.dart │ │ │ └── usecases/ │ │ │ ├── get_daily_ranking.dart │ │ │ ├── get_weekly_ranking.dart │ │ │ └── get_monthly_ranking.dart │ │ └── presentation/ │ │ ├── providers/ │ │ │ └── ranking_provider.dart │ │ ├── pages/ │ │ │ └── ranking_page.dart │ │ └── widgets/ │ │ ├── ranking_tab_bar.dart │ │ ├── ranking_filter_bar.dart │ │ ├── ranking_list_item.dart │ │ └── ranking_crown_badge.dart │ │ │ ├── mining/ │ │ ├── data/ │ │ │ ├── datasources/ │ │ │ │ ├── mining_local_datasource.dart │ │ │ │ └── mining_remote_datasource.dart │ │ │ ├── models/ │ │ │ │ ├── mining_status_model.dart │ │ │ │ ├── hash_power_model.dart │ │ │ │ └── mining_reward_model.dart │ │ │ └── repositories/ │ │ │ └── mining_repository_impl.dart │ │ ├── domain/ │ │ │ ├── entities/ │ │ │ │ ├── mining_status_entity.dart │ │ │ │ ├── hash_power_entity.dart │ │ │ │ └── mining_reward_entity.dart │ │ │ ├── repositories/ │ │ │ │ └── mining_repository.dart │ │ │ └── usecases/ │ │ │ ├── start_mining.dart │ │ │ ├── stop_mining.dart │ │ │ ├── get_mining_status.dart │ │ │ ├── get_hash_power.dart │ │ │ └── claim_mining_reward.dart │ │ └── presentation/ │ │ ├── providers/ │ │ │ ├── mining_provider.dart │ │ │ └── hash_power_provider.dart │ │ ├── pages/ │ │ │ └── mining_page.dart │ │ └── widgets/ │ │ ├── mining_status_circle.dart │ │ ├── hash_power_card.dart │ │ ├── team_power_card.dart │ │ └── mining_control_button.dart │ │ │ ├── trading/ │ │ ├── data/ │ │ │ ├── datasources/ │ │ │ │ └── trading_remote_datasource.dart │ │ │ ├── models/ │ │ │ │ ├── balance_model.dart │ │ │ │ ├── transaction_model.dart │ │ │ │ └── exchange_rate_model.dart │ │ │ └── repositories/ │ │ │ └── trading_repository_impl.dart │ │ ├── domain/ │ │ │ ├── entities/ │ │ │ │ ├── balance_entity.dart │ │ │ │ ├── transaction_entity.dart │ │ │ │ ├── token_type.dart │ │ │ │ └── transaction_status.dart │ │ │ ├── repositories/ │ │ │ │ └── trading_repository.dart │ │ │ └── usecases/ │ │ │ ├── get_balance.dart │ │ │ ├── calculate_settlement.dart │ │ │ ├── exchange_dst_to_usdt.dart │ │ │ └── get_transaction_history.dart │ │ └── presentation/ │ │ ├── providers/ │ │ │ ├── trading_provider.dart │ │ │ └── balance_provider.dart │ │ ├── pages/ │ │ │ ├── trading_page.dart │ │ │ └── transaction_history_page.dart │ │ └── widgets/ │ │ ├── balance_card.dart │ │ ├── token_selector.dart │ │ ├── settlement_button.dart │ │ └── exchange_button.dart │ │ │ ├── deposit/ │ │ ├── data/ │ │ │ ├── datasources/ │ │ │ │ └── deposit_remote_datasource.dart │ │ │ ├── models/ │ │ │ │ ├── deposit_address_model.dart │ │ │ │ └── deposit_record_model.dart │ │ │ └── repositories/ │ │ │ └── deposit_repository_impl.dart │ │ ├── domain/ │ │ │ ├── entities/ │ │ │ │ ├── deposit_address_entity.dart │ │ │ │ ├── chain_network.dart │ │ │ │ └── deposit_record_entity.dart │ │ │ ├── repositories/ │ │ │ │ └── deposit_repository.dart │ │ │ └── usecases/ │ │ │ ├── get_deposit_address.dart │ │ │ ├── confirm_deposit.dart │ │ │ └── get_deposit_records.dart │ │ └── presentation/ │ │ ├── providers/ │ │ │ └── deposit_provider.dart │ │ ├── pages/ │ │ │ └── deposit_page.dart │ │ └── widgets/ │ │ ├── network_tab_bar.dart │ │ ├── qr_code_card.dart │ │ ├── address_copy_card.dart │ │ └── confirm_deposit_button.dart │ │ │ ├── planting/ │ │ ├── data/ │ │ │ ├── datasources/ │ │ │ │ └── planting_remote_datasource.dart │ │ │ ├── models/ │ │ │ │ ├── planting_order_model.dart │ │ │ │ ├── location_model.dart │ │ │ │ └── planting_price_model.dart │ │ │ └── repositories/ │ │ │ └── planting_repository_impl.dart │ │ ├── domain/ │ │ │ ├── entities/ │ │ │ │ ├── planting_order_entity.dart │ │ │ │ ├── location_entity.dart │ │ │ │ └── planting_config_entity.dart │ │ │ ├── repositories/ │ │ │ │ └── planting_repository.dart │ │ │ └── usecases/ │ │ │ ├── get_planting_price.dart │ │ │ ├── calculate_max_quantity.dart │ │ │ ├── get_provinces.dart │ │ │ ├── get_cities.dart │ │ │ └── submit_planting.dart │ │ └── presentation/ │ │ ├── providers/ │ │ │ ├── planting_provider.dart │ │ │ └── location_provider.dart │ │ ├── pages/ │ │ │ ├── planting_quantity_page.dart │ │ │ └── planting_location_page.dart │ │ └── widgets/ │ │ ├── quantity_selector.dart │ │ ├── price_info_card.dart │ │ ├── province_dropdown.dart │ │ ├── city_dropdown.dart │ │ ├── location_warning.dart │ │ └── confirm_planting_dialog.dart │ │ │ ├── profile/ │ │ ├── data/ │ │ │ ├── datasources/ │ │ │ │ ├── profile_local_datasource.dart │ │ │ │ └── profile_remote_datasource.dart │ │ │ ├── models/ │ │ │ │ ├── profile_model.dart │ │ │ │ ├── community_info_model.dart │ │ │ │ ├── referral_model.dart │ │ │ │ └── earnings_model.dart │ │ │ └── repositories/ │ │ │ └── profile_repository_impl.dart │ │ ├── domain/ │ │ │ ├── entities/ │ │ │ │ ├── profile_entity.dart │ │ │ │ ├── community_entity.dart │ │ │ │ ├── referral_entity.dart │ │ │ │ ├── earnings_entity.dart │ │ │ │ └── community_level.dart │ │ │ ├── repositories/ │ │ │ │ └── profile_repository.dart │ │ │ └── usecases/ │ │ │ ├── get_profile.dart │ │ │ ├── update_profile.dart │ │ │ ├── update_avatar.dart │ │ │ ├── get_community_info.dart │ │ │ ├── get_referral_list.dart │ │ │ ├── get_earnings_summary.dart │ │ │ └── claim_earnings.dart │ │ └── presentation/ │ │ ├── providers/ │ │ │ ├── profile_provider.dart │ │ │ ├── community_provider.dart │ │ │ └── earnings_provider.dart │ │ ├── pages/ │ │ │ ├── profile_page.dart │ │ │ ├── edit_profile_page.dart │ │ │ ├── referral_list_page.dart │ │ │ └── earnings_detail_page.dart │ │ └── widgets/ │ │ ├── profile_header.dart │ │ ├── avatar_widget.dart │ │ ├── community_stats_card.dart │ │ ├── referral_item.dart │ │ ├── earnings_card.dart │ │ ├── countdown_timer.dart │ │ ├── claim_button.dart │ │ ├── community_level_badge.dart │ │ └── avatar_picker_sheet.dart │ │ │ ├── security/ │ │ ├── data/ │ │ │ ├── datasources/ │ │ │ │ └── security_local_datasource.dart │ │ │ └── repositories/ │ │ │ └── security_repository_impl.dart │ │ ├── domain/ │ │ │ ├── repositories/ │ │ │ │ └── security_repository.dart │ │ │ └── usecases/ │ │ │ ├── setup_google_auth.dart │ │ │ ├── verify_google_auth.dart │ │ │ ├── change_password.dart │ │ │ └── bind_email.dart │ │ └── presentation/ │ │ ├── providers/ │ │ │ └── security_provider.dart │ │ ├── pages/ │ │ │ ├── google_auth_page.dart │ │ │ ├── change_password_page.dart │ │ │ └── bind_email_page.dart │ │ └── widgets/ │ │ └── security_option_tile.dart │ │ │ └── home/ │ └── presentation/ │ ├── providers/ │ │ └── navigation_provider.dart │ ├── pages/ │ │ └── home_shell_page.dart │ └── widgets/ │ └── bottom_nav_bar.dart │ ├── shared/ │ ├── widgets/ │ │ ├── buttons/ │ │ │ ├── primary_button.dart │ │ │ ├── secondary_button.dart │ │ │ ├── text_button.dart │ │ │ └── icon_button.dart │ │ ├── cards/ │ │ │ ├── info_card.dart │ │ │ ├── stat_card.dart │ │ │ └── gradient_card.dart │ │ ├── dialogs/ │ │ │ ├── confirm_dialog.dart │ │ │ ├── warning_dialog.dart │ │ │ ├── success_dialog.dart │ │ │ └── loading_dialog.dart │ │ ├── inputs/ │ │ │ ├── text_input.dart │ │ │ ├── password_input.dart │ │ │ ├── search_input.dart │ │ │ └── dropdown_input.dart │ │ ├── loading/ │ │ │ ├── loading_indicator.dart │ │ │ ├── shimmer_loading.dart │ │ │ └── full_screen_loading.dart │ │ ├── lists/ │ │ │ ├── empty_state.dart │ │ │ ├── error_state.dart │ │ │ └── pull_to_refresh.dart │ │ ├── app_bar/ │ │ │ ├── custom_app_bar.dart │ │ │ └── transparent_app_bar.dart │ │ └── misc/ │ │ ├── copy_text.dart │ │ ├── countdown_text.dart │ │ ├── badge_widget.dart │ │ └── divider_with_text.dart │ ├── providers/ │ │ ├── app_state_provider.dart │ │ ├── connectivity_provider.dart │ │ └── locale_provider.dart │ └── mixins/ │ ├── loading_mixin.dart │ └── toast_mixin.dart │ ├── l10n/ │ ├── app_localizations.dart │ ├── arb/ │ │ ├── app_zh.arb │ │ └── app_en.arb │ └── l10n.dart │ └── routes/ ├── app_router.dart ├── route_names.dart ├── route_paths.dart └── route_guards.dart ``` ### 任务2: 创建与 lib 同级的目录 在项目根目录 `rwa_android_app/` 下创建: ``` rwa_android_app/ ├── lib/ # (任务1已创建) │ ├── assets/ # 📦 资源文件 │ ├── images/ # 图片资源 │ │ ├── logo/ │ │ ├── backgrounds/ │ │ ├── avatars/ │ │ └── illustrations/ │ ├── icons/ # 图标资源 │ │ ├── nav/ # 导航图标 │ │ ├── tokens/ # 代币图标(USDT/DST/BNB等) │ │ └── actions/ # 操作图标 │ ├── fonts/ # 字体文件 │ └── lottie/ # Lottie动画 │ ├── mining_animation.json # 挖矿动画 │ └── success_animation.json# 成功动画 │ ├── test/ # 🧪 测试 │ ├── unit/ # 单元测试 │ │ ├── core/ │ │ ├── features/ │ │ │ ├── auth/ │ │ │ ├── mining/ │ │ │ ├── ranking/ │ │ │ ├── trading/ │ │ │ ├── deposit/ │ │ │ ├── planting/ │ │ │ ├── profile/ │ │ │ └── security/ │ │ └── mocks/ │ ├── widget/ # Widget测试 │ └── integration/ # 集成测试 │ ├── integration_test/ # E2E测试 │ └── app_test.dart │ ├── scripts/ # 脚本 │ ├── build_android.sh │ ├── build_ios.sh │ └── generate_icons.sh │ ├── android/ # (flutter create 已生成) ├── ios/ # (flutter create 已生成) ├── web/ # (flutter create 已生成) ├── linux/ # (flutter create 已生成) ├── macos/ # (flutter create 已生成) ├── windows/ # (flutter create 已生成) ├── pubspec.yaml # (需更新) ├── analysis_options.yaml # (保留) ├── README.md # (保留) └── CLAUDE.md # (本文件) ``` ### 任务3: 更新 pubspec.yaml 替换 `dependencies` 和 `dev_dependencies` 部分: ```yaml name: rwa_android_app description: RWA榴莲皇后移动应用 publish_to: 'none' version: 1.0.0+1 environment: sdk: '>=3.2.0 <4.0.0' dependencies: flutter: sdk: flutter flutter_localizations: sdk: flutter # 状态管理 flutter_riverpod: ^2.5.1 riverpod_annotation: ^2.3.5 # 路由 go_router: ^14.2.0 # 网络 dio: ^5.4.3+1 connectivity_plus: ^6.0.3 # 区块链 web3dart: ^2.7.3 bip39: ^1.0.6 ed25519_hd_key: ^2.3.0 hex: ^0.2.0 # 本地存储 shared_preferences: ^2.2.3 flutter_secure_storage: ^9.0.0 hive: ^2.2.3 hive_flutter: ^1.1.0 # UI组件 flutter_svg: ^2.0.10+1 cached_network_image: ^3.3.1 shimmer: ^3.0.0 lottie: ^3.1.0 qr_flutter: ^4.1.0 flutter_screenutil: ^5.9.0 # 工具 intl: ^0.19.0 logger: ^2.2.0 equatable: ^2.0.5 dartz: ^0.10.1 uuid: ^4.3.3 image_picker: ^1.0.7 permission_handler: ^11.3.1 url_launcher: ^6.2.6 share_plus: ^8.0.3 # 生物识别 local_auth: ^2.2.0 dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^3.0.2 # 代码生成 build_runner: ^2.4.9 riverpod_generator: ^2.4.0 freezed: ^2.5.2 freezed_annotation: ^2.4.1 json_serializable: ^6.7.1 hive_generator: ^2.0.1 # 测试 mocktail: ^1.0.3 flutter: uses-material-design: true assets: - assets/images/ - assets/images/logo/ - assets/images/backgrounds/ - assets/images/avatars/ - assets/images/illustrations/ - assets/icons/ - assets/icons/nav/ - assets/icons/tokens/ - assets/icons/actions/ - assets/lottie/ ``` --- ## 核心文件内容模板 ### app_colors.dart 位置: `lib/core/theme/app_colors.dart` ```dart import 'package:flutter/material.dart'; class AppColors { AppColors._(); // 主色调 - 金黄色系 static const Color primary = Color(0xFFD4A84B); static const Color primaryLight = Color(0xFFF5E6C8); static const Color primaryDark = Color(0xFFB8923F); // 背景色 static const Color background = Color(0xFFFAF8F5); static const Color cardBackground = Color(0xFFFFFDF8); static const Color surface = Color(0xFFFFFFFF); // 文字色 static const Color textPrimary = Color(0xFF333333); static const Color textSecondary = Color(0xFF666666); static const Color textHint = Color(0xFF999999); static const Color textOnPrimary = Color(0xFFFFFFFF); // 功能色 static const Color success = Color(0xFF52C41A); static const Color warning = Color(0xFFFFAA00); static const Color error = Color(0xFFFF4D4F); static const Color info = Color(0xFF1890FF); // 边框色 static const Color border = Color(0xFFE8E8E8); static const Color divider = Color(0xFFF0F0F0); // 排行榜皇冠色 static const Color crownGold = Color(0xFFFFD700); static const Color crownSilver = Color(0xFFC0C0C0); static const Color crownBronze = Color(0xFFCD7F32); } ``` ### failures.dart 位置: `lib/core/errors/failures.dart` ```dart import 'package:equatable/equatable.dart'; abstract class Failure extends Equatable { final String message; const Failure(this.message); @override List get props => [message]; } class ServerFailure extends Failure { const ServerFailure([super.message = '服务器错误']); } class NetworkFailure extends Failure { const NetworkFailure([super.message = '网络连接失败']); } class CacheFailure extends Failure { const CacheFailure([super.message = '缓存错误']); } class AuthFailure extends Failure { const AuthFailure([super.message = '认证失败']); } class WalletFailure extends Failure { const WalletFailure([super.message = '钱包操作失败']); } class BlockchainFailure extends Failure { const BlockchainFailure([super.message = '区块链交互失败']); } ``` ### UseCase 基类 位置: `lib/core/usecases/usecase.dart` ```dart import 'package:dartz/dartz.dart'; import '../errors/failures.dart'; abstract class UseCase { Future> call(Params params); } class NoParams { const NoParams(); } ``` --- ## MCP 工具使用规范 ### 从 UIPro 获取 UI 代码 当需要获取 Figma 设计的 UI 代码时: 1. 调用 UIPro MCP 获取 Widget 代码 2. 将代码放入对应的 `features/[module]/presentation/widgets/` 目录 3. 执行以下适配: - 替换硬编码颜色 → `AppColors.xxx` - 替换硬编码文字 → `context.l10n.xxx` - 替换硬编码尺寸 → `AppDimensions.xxx` 或 `.w` `.h` (screenutil) - 添加 Riverpod `ref.watch()` / `ref.read()` 状态绑定 ### 示例适配 **UIPro 原始代码:** ```dart Container( color: Color(0xFFD4A84B), child: Text('挖矿中', style: TextStyle(color: Colors.white)), ) ``` **适配后:** ```dart Container( color: AppColors.primary, child: Text(context.l10n.miningInProgress, style: AppTextStyles.bodyWhite), ) ``` --- ## 开发顺序 按以下顺序开发各模块: | 优先级 | 模块 | 说明 | |-------|------|------| | P0 | `core/` | 基础设施 (theme, errors, network, blockchain, storage) | | P0 | `shared/widgets/` | 公共组件 | | P1 | `features/auth/` | 钱包创建/导入 (入口) | | P1 | `features/home/` | 底部导航 Shell | | P2 | `features/mining/` | 矿机 (核心功能) | | P2 | `features/ranking/` | 龙虎榜 | | P2 | `features/trading/` | 交易 | | P2 | `features/profile/` | 个人中心 | | P3 | `features/deposit/` | 充值 | | P3 | `features/planting/` | 认种 | | P3 | `features/security/` | 安全设置 | | P4 | `routes/` | 路由配置 | | P4 | `l10n/` | 国际化 | --- ## 路由配置 路由路径定义 (`lib/routes/route_paths.dart`): ```dart class RoutePaths { RoutePaths._(); // Auth static const splash = '/'; static const onboarding = '/onboarding'; static const createWallet = '/auth/create'; static const backupMnemonic = '/auth/backup-mnemonic'; static const verifyMnemonic = '/auth/verify-mnemonic'; static const walletCreated = '/auth/wallet-created'; static const importWallet = '/auth/import'; // Main tabs static const ranking = '/ranking'; static const mining = '/mining'; static const trading = '/trading'; static const profile = '/profile'; // Sub pages static const editProfile = '/profile/edit'; static const referralList = '/profile/referrals'; static const earningsDetail = '/profile/earnings'; static const deposit = '/deposit'; static const plantingQuantity = '/planting/quantity'; static const plantingLocation = '/planting/location'; static const googleAuth = '/security/google-auth'; static const changePassword = '/security/password'; static const bindEmail = '/security/email'; static const transactionHistory = '/trading/history'; } ``` --- ## 命名规范 | 类型 | 命名规则 | 示例 | |-----|---------|------| | 文件 | snake_case | `mining_page.dart` | | 类 | PascalCase | `MiningPage` | | 变量/方法 | camelCase | `getMiningStatus()` | | 常量 | camelCase 或 SCREAMING_SNAKE | `primaryColor` 或 `API_BASE_URL` | | Provider | camelCase + Provider | `miningProvider` | | Entity | PascalCase + Entity | `MiningStatusEntity` | | Model | PascalCase + Model | `MiningStatusModel` | | UseCase | PascalCase (动词+名词) | `GetMiningStatus` | --- ## 当前任务 > **初始化项目结构** > > 1. [ ] 创建 lib/ 目录结构 > 2. [ ] 创建 assets/ 目录结构 > 3. [ ] 更新 pubspec.yaml > 4. [ ] 运行 flutter pub get > 5. [ ] 实现 core/theme/ 基础文件 > 6. [ ] 实现 core/errors/ 基础文件