介观电子输运:有效质量与态密度的计算原理与应用
2026/7/30 8:04:13
你是否还在用这些方式组织项目?
“所有页面放 lib/screens,逻辑塞进 StatefulWidget”
“状态管理用 GetX,全局变量满天飞”
“业务一复杂,文件就上千行,新人不敢动”
但现实是:
在 2025 年,架构不是“过度设计”,而是应对复杂度、保障团队协作、支撑产品长期演进的基础设施。而 Flutter 虽然上手简单,但若不从第一天就建立清晰的边界、依赖规则与模块契约,极易演变为“意大利面条式代码”。
本文将带你构建一套面向百万行级、支持百人协作、可独立测试/部署的现代化 Flutter 架构体系:
目标:让你的代码库即使增长到 50 万行,依然清晰如初。
| 问题 | 表现 | 后果 |
|---|---|---|
| 逻辑混杂 | UI、网络、状态全在 Widget 中 | 修改风险高,测试困难 |
| 全局污染 | GetX 全局 Controller 随处调用 | 状态不可预测,调试地狱 |
| 紧耦合 | Repository 直接引用 Dio 实例 | 无法 Mock,单元测试写不了 |
| 包膨胀 | 所有代码在一个 lib 下 | 编译慢,增量更新难 |
📉关键洞察:短期快,长期死——没有架构的项目终将失控。
lib/ ├── core/ # 基础设施(无业务) │ ├── constants/ │ ├── exceptions/ │ ├── network/ # Dio 封装、拦截器 │ └── utils/ │ ├── domain/ # 业务核心(纯 Dart) │ ├── entities/ # 业务实体(User, Order) │ ├── repositories/ # 抽象接口(abstract class) │ └── usecases/ # 业务用例(GetUser, Login) │ ├── data/ # 数据实现 │ ├── datasources/ # 远程/本地数据源 │ ├── models/ # JSON 映射模型 │ └── repositories/ # 接口实现(implements domain/repositories) │ └── presentation/ # UI 层 ├── pages/ # 页面路由 ├── widgets/ # 可复用组件 └── providers/ # Riverpod 状态容器✅优势:每层职责单一,修改影响范围可控。
packages/ ├── core/ # 公共基础包(Dart-only) ├── auth/ # 认证模块(含 UI + 逻辑) │ ├── lib/ │ │ ├── src/ │ │ └── auth.dart # 导出公共 API │ └── pubspec.yaml # 依赖 core/domain ├── profile/ # 用户资料模块 ├── chat/ # 聊天模块 └── app/ # 主应用壳(聚合所有 feature)🔒效果:模块可独立开发、测试、甚至作为私有插件发布。
// domain/repositories/auth_repository.dartabstractclassAuthRepository{Future<User>login(String email,String password);}// data/repositories/auth_repository_impl.dartclassAuthRepositoryImplimplementsAuthRepository{finalAuthRemoteDataSource remoteDataSource;AuthRepositoryImpl(this.remoteDataSource);@overrideFuture<User>login(String email,String password)async{finaldto=awaitremoteDataSource.login(email,password);returndto.toEntity();}}// core/di/injection.dartfinalauthRepositoryProvider=Provider<AuthRepository>((ref){finalremoteDataSource=AuthRemoteDataSourceImpl(dio:ref.read(dioProvider),);returnAuthRepositoryImpl(remoteDataSource);});// presentation/providers/auth_notifier.dart@riverpodclassAuthNotifierextends_$AuthNotifier{@overrideFutureOr<AuthState>build()=>AuthState.initial();Future<void>login(String email,String password)async{finalrepo=ref.read(authRepositoryProvider);// 依赖抽象finaluser=awaitrepo.login(email,password);state=AuthState.success(user);}}🔄价值:UI 层仅依赖抽象,测试时可轻松替换为 Fake/Mock。
domain和data包;// core/platform/device_info.dartabstractclassDeviceInfo{Stringgetmodel;boolgetisSimulator;}// data/datasources/device_info_mobile.dart (iOS/Android)classMobileDeviceInfoimplementsDeviceInfo{@overrideStringgetmodel=>DeviceInfoPlugin().model;}// data/datasources/device_info_web.dartclassWebDeviceInfoimplementsDeviceInfo{@overrideStringgetmodel=>'Web';}// core/platform/device_info_stub.dartexport'device_info_mobile.dart'if(dart.library.html)'device_info_web.dart';🌐成果:业务逻辑复用率 ≥85%,多端一致性保障。
# melos.yamlpackages:-packages/**-examples/**command:analyze:run:melos exec--flutter analyzetest:run:melos exec--flutter test// turbo.json{"pipeline":{"build":{"dependsOn":["^build"],"outputs":[".dart_tool/**","build/**"]},"test":{"dependsOn":["build"],"cache":true}}}⚡效果:增量构建提速 3–5 倍,CI 成本大幅降低。
// scripts/validate_dependencies.dartvoidmain(){finalgraph=DependencyGraph.load('pubspec.yaml');for(finalpkgingraph.packages){if(pkg.name.startsWith('feature_')){assert(!pkg.dependencies.any((d)=>d.startsWith('feature_')),'Feature packages must not depend on each other!');}}}test('domain layer has no external dependencies',(){finalfiles=Filesystem.findFiles('packages/domain/lib');for(finalfileinfiles){expect(file.content,isNot(contains('package:flutter')));expect(file.content,isNot(contains('package:dio')));}});🚧CI 集成:违反架构规则,PR 自动阻断。
core和domain层(纯 Dart,无风险);| 反模式 | 风险 | 修复 |
|---|---|---|
| Presentation 层直接调用 Dio | 网络逻辑散落各处 | 强制通过 Repository |
| Domain 层引用 Flutter 包 | 无法单元测试 | 移除所有 flutter 依赖 |
| Feature 包互相 import | 循环依赖,编译失败 | 通过事件/导航解耦 |
| 所有状态放一个 Provider | 状态爆炸 | 按功能拆分为多个 Notifier |
每一层边界,都是对职责的承诺;
每一个包隔离,都是对未来的投资。
在 2025 年,不做架构设计的项目,等于主动放弃规模化可能。
Flutter 已为你提供强大的工程能力——现在,轮到你用清晰结构驾驭复杂度。
欢迎大家加入[开源鸿蒙跨平台开发者社区] (https://openharmonycrossplatform.csdn.net),一起共建开源鸿蒙跨平台生态。