821 lines
29 KiB
Markdown
821 lines
29 KiB
Markdown
# 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<Object> 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<Type, Params> {
|
|
Future<Either<Failure, Type>> 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/ 基础文件
|