28 KiB
28 KiB
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 部分:
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
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
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
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 代码时:
- 调用 UIPro MCP 获取 Widget 代码
- 将代码放入对应的
features/[module]/presentation/widgets/目录 - 执行以下适配:
- 替换硬编码颜色 →
AppColors.xxx - 替换硬编码文字 →
context.l10n.xxx - 替换硬编码尺寸 →
AppDimensions.xxx或.w.h(screenutil) - 添加 Riverpod
ref.watch()/ref.read()状态绑定
- 替换硬编码颜色 →
示例适配
UIPro 原始代码:
Container(
color: Color(0xFFD4A84B),
child: Text('挖矿中', style: TextStyle(color: Colors.white)),
)
适配后:
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):
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 |
当前任务
初始化项目结构
- 创建 lib/ 目录结构
- 创建 assets/ 目录结构
- 更新 pubspec.yaml
- 运行 flutter pub get
- 实现 core/theme/ 基础文件
- 实现 core/errors/ 基础文件