Flutter 整洁架构如何实现

Flutter 整洁架构的具体实现步骤是什么?能否分享一个清晰的分层结构和代码示例,特别是如何处理数据层、领域层和表现层之间的依赖关系?感觉网上资料比较零散,希望有经验的大佬指点一下。

2 回复

Flutter 整洁架构通过分层实现:

  1. 领域层:业务逻辑与实体,独立于框架。
  2. 数据层:数据源与仓库实现,为领域层提供数据。
  3. 表示层:UI 与状态管理(如 Bloc),依赖领域层。
    各层依赖向内,外层可依赖内层,保持低耦合与可测试性。

更多关于Flutter 整洁架构如何实现的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


Flutter 整洁架构(Clean Architecture)通过分层设计实现关注点分离,使代码更易维护和测试。以下是核心实现步骤:


1. 分层结构

┌─────────────────┐
│   Presentation  │  UI层(页面/组件)
├─────────────────┤
│    Domain       │ 业务逻辑层(用例/实体)
├─────────────────┤
│    Data         │ 数据层(仓库实现/数据源)
└─────────────────┘

2. 各层职责与实现

① Domain层(核心业务逻辑)

  • Entity:纯Dart对象,定义核心业务模型
class User {
  final String id;
  final String name;
  
  User({required this.id, required this.name});
}
  • Repository抽象:定义数据操作接口
abstract class UserRepository {
  Future<User> getUser(String id);
  Future<void> saveUser(User user);
}
  • UseCase:单个业务操作单元
class GetUserUseCase {
  final UserRepository repository;
  
  GetUserUseCase(this.repository);
  
  Future<User> execute(String id) => repository.getUser(id);
}

② Data层(数据获取与存储)

  • 实现Domain层的Repository接口
class UserRepositoryImpl implements UserRepository {
  final RemoteDataSource remoteDataSource;
  final LocalDataSource localDataSource;

  @override
  Future<User> getUser(String id) async {
    try {
      final user = await remoteDataSource.getUser(id);
      localDataSource.cacheUser(user);
      return user;
    } catch (e) {
      return localDataSource.getUser(id);
    }
  }
}

③ Presentation层(UI展示)

  • 使用BLoC/Provider/Riverpod等状态管理
class UserBloc {
  final GetUserUseCase getUserUseCase;
  final StreamController<User> _userController = StreamController();

  Stream<User> get user => _userController.stream;

  void fetchUser(String id) async {
    final user = await getUserUseCase.execute(id);
    _userController.add(user);
  }
}

3. 依赖规则

  • 向内依赖:外层可依赖内层,内层不感知外层
  • 依赖注入:使用get_it或构造函数注入
// 依赖配置
void setupDependencies() {
  get_it.registerSingleton<UserRepository>(UserRepositoryImpl());
  get_it.registerFactory(() => GetUserUseCase(get_it()));
}

4. 关键优势

  • 可测试性:可单独测试UseCase(模拟Repository)
  • 框架无关:Domain层不依赖Flutter
  • 易维护:各层职责明确,修改影响局部化

示例项目结构

lib/
├── presentation/
│   ├── pages/
│   └── widgets/
├── domain/
│   ├── entities/
│   ├── repositories/
│   └── usecases/
└── data/
    ├── repositories/
    ├── datasources/
    └── models/

通过这种架构,Flutter应用能有效解耦业务逻辑、UI和数据层,提升代码质量和可维护性。

回到顶部