
单一性原则
每个组件仅承担单一职责,避免功能混杂。例如,避免将不相关的工具方法堆砌在Common组件中,应拆分为NetworkUtils、ImageLoader等独立模块。
抽象化原则
组件的接口设计需稳定且抽象。例如,网络请求组件应封装为统一的HttpClient类,隐藏底层实现细节(如Dio或http包),仅暴露get、post等通用方法。
稳定性原则 稳定组件避免依赖易变组件。若基础组件依赖频繁变更的业务组件,可将共享代码下沉为独立模块,或通过拷贝必要代码解耦。
自完备性原则 组件应尽量减少外部依赖。例如,若业务组件仅依赖大模块中的某个工具函数,可直接将该函数内联到业务组件中。
剥离基础功能
将网络、存储、UI控件等封装为独立包(如core_network、ui_kit),通过pubspec.yaml管理。第三方库建议二次封装,例如对shared_preferences包装为StorageService。
抽象业务模块
按业务维度拆分模块(如home_module、auth_module)。初期可粗粒度划分,后续逐步细化。每个业务模块应包含自身的页面、状态管理和服务逻辑。
最小化服务能力
组件对外暴露的接口需精简。例如,用户认证组件仅提供login()、logout()方法,内部细节如Token刷新不暴露。
四象限分层法
HomePage)AuthService)CustomButton)Logger、Dio)单向依赖规则 上层可依赖下层,禁止反向或跨层依赖。例如:
HomePage(UI层)可依赖AuthService(业务层)Logger(基础层)直接调用HomePage循环依赖解决方案
EventBus通知跨层动作(如登出事件)GoRouter实现页面跳转解耦Provider或get_it传递服务实例资源隔离
图片、字体等资源按组件划分目录,如:
assets/
home_module/
images/
banner.png
auth_module/
icons/
user.png 在pubspec.yaml中按需声明资源路径,避免全局加载。
检测工具
使用dependency_validator分析pubspec.yaml,检测冗余或循环依赖
通过CI流程集成检测,例如:
steps:
- run: flutter pub run dependency_validator 典型依赖结构
dependencies:
flutter:
sdk: flutter
core_network:
path: ./modules/core_network
auth_module:
path: ./modules/auth 中间层通信示例
// 使用EventBus解耦
eventBus.fire(AuthEvent(loggedIn: true));
// 使用路由跳转
router.push('/error?code=404'); 通过上述方法,可系统化解决资源管理和依赖关系问题,确保架构的扩展性和维护性。