Flutter 架构设计:Feature-First 与 Pub workspaces

Flutter 项目,我更推荐 Feature-First

Layer-First 优先按技术层组织代码。Feature-First 以功能为顶层组织单位,将同一功能相关的实现和测试聚合到同一个模块。

我更推荐 Feature-First:让功能有明确的归属和对外入口,再由主应用按需组合。

用 package 封装功能,主应用负责组合

以 auth package 和宿主应用 mobile_app 为例:

text 复制代码
project/
├── apps/mobile_app/      # 宿主应用
├── packages/auth/       # 功能 package
│   ├── lib/
│   │   ├── auth.dart     # 对外入口
│   │   └── src/          # 内部实现
│   ├── test/
│   └── pubspec.yaml
└── pubspec.yaml

auth 通过 auth.dart 暴露供外部使用的能力;mobile_app 声明依赖、接入页面并配置导航。功能的内部实现留在所属 package 中。

需要平台相关能力时,功能包可以依赖 plugin。plugin 是包含 Dart 接口和平台实现的一类 package。

用 Pub workspaces 管理这些包

Pub workspaces 让同一仓库中的多个包统一解析依赖、共享根锁文件,各包仍保留自己的依赖声明。

先在根目录的 pubspec.yaml 中登记成员:

yaml 复制代码
name: app_workspace
publish_to: none

environment:
  sdk: ^3.6.0

workspace:
  - apps/mobile_app
  - packages/auth

再让成员启用 resolution: workspace,并声明实际使用的依赖。例如 mobile_app 引用 auth:

yaml 复制代码
# apps/mobile_app/pubspec.yaml
name: mobile_app
resolution: workspace

environment:
  sdk: ^3.6.0

dependencies:
  flutter:
    sdk: flutter
  auth:
    path: ../../packages/auth

auth 包也需要启用 resolution: workspace。根包和成员包的 SDK 约束下限至少为 Dart 3.6.0,已有更高下限时保持原值;path 是这里采用的本地引用方式。

最后在根目录运行 flutter pub get。应用通过 package:auth/auth.dart 使用模块,再接入自己的页面和导航。工作区管理包,依赖声明连接包,主应用组合功能。

相关推荐
恋猫de小郭3 小时前
Flutter 下 AOT 一个你怎么都想不出来的 Bug ,JIT 正常的计算,在 AOT 居然算错了
android·前端·flutter
好的佩奇19 小时前
Dart 之扩展方法
android·flutter·dart
好的佩奇21 小时前
蓝牙之经典蓝牙
android·flutter·蓝牙
传奇开心果编程1 天前
【Flutter踩坑排雷】第19课:路由硬编码坑|字符串路由书写错误,页面跳转失败排查
android·flutter·ios·移动开发·跨平台·ui框架·声明式ui
Nerd(BUG版)2 天前
Flutter学习day5--事件手势与命中测试
学习·flutter
传奇开心果2 天前
【Flutter踩坑排雷】第5课:扩展方法冲突坑|同名扩展引发编译歧义,故障规避手段
android·flutter
雪铃儿3 天前
Flutter 双端热更新新方案:基于 Dart 官方动态模块的 flutter_patcher 1.0.0
flutter·hotfix
好的佩奇3 天前
Dart 之方法、操作符与可调用对象
android·flutter·dart
恋猫de小郭3 天前
Flutter Impeller Vulkan 内存持续上涨,问题没想到是文字阴影
android·前端·flutter