Flutter Clean Architecture UseCase 模式:如何优雅处理业务逻辑
【免费下载链接】flutter_clean_architectureClean architecture flutter: A Flutter package that makes it easy and intuitive to implement Uncle Bob's Clean Architecture in Flutter. This package provides basic classes that are tuned to work with Flutter and are designed according to the Clean Architecture.项目地址: https://gitcode.com/gh_mirrors/flut/flutter_clean_architecture
Flutter Clean Architecture 是一个帮助开发者在 Flutter 应用中轻松实现 Uncle Bob 提出的 Clean Architecture 架构的强大工具包。它提供了一系列基础类,专门针对 Flutter 环境进行优化,使业务逻辑与 UI 组件分离,让代码更具可维护性和可测试性。
为什么需要 UseCase 模式?
在 Flutter 应用开发中,随着功能不断增加,业务逻辑往往会变得复杂且难以维护。UseCase 模式作为 Clean Architecture 的核心组件,能够将业务逻辑封装成独立的模块,实现以下目标:
- 关注点分离:将业务逻辑与 UI 组件完全分离
- 可测试性:独立的 UseCase 更容易进行单元测试
- 代码复用:相同的业务逻辑可以在多个地方复用
- 维护性:单一职责原则使代码更易于理解和修改
UseCase 模式的核心概念
UseCase 基类
在 Flutter Clean Architecture 中,所有业务逻辑类都应该继承自UseCase抽象类。这个基类定义了业务逻辑的基本结构和生命周期管理。
abstract class UseCase<T, Params> { Future<Stream<T?>> buildUseCaseStream(Params? params); void execute(Observer<T> observer, [Params? params]); void dispose(); }这个抽象类位于 lib/src/usecase.dart 文件中,提供了三个核心方法:构建数据流、执行用例和释放资源。
数据流转机制
UseCase 模式采用响应式编程思想,通过Stream和Observer实现数据流转:
- 构建数据流:通过
buildUseCaseStream方法创建业务逻辑处理流 - 执行用例:调用
execute方法启动业务逻辑处理 - 接收结果:通过
Observer接口接收处理结果或错误
常见 UseCase 类型
Flutter Clean Architecture 提供了多种 UseCase 类型以适应不同场景:
- 基本 UseCase:处理返回数据流的业务逻辑
- CompletableUseCase:执行任务但不返回具体值的用例
- FutureUseCase:处理单一异步请求的用例
- CompletableFutureUseCase:执行单一异步任务但不返回值的用例
如何实现一个 UseCase
步骤 1:创建参数类(如有需要)
如果你的 UseCase 需要参数,创建一个专门的参数类:
class GetUserUseCaseParams { final String userId; GetUserUseCaseParams({required this.userId}); }在示例项目中可以参考 example/lib/src/domain/usecases/get_user_usecase.dart 文件中的实现。
步骤 2:创建响应类(如有需要)
为 UseCase 的输出创建一个响应类,封装所有返回数据:
class GetUserUseCaseResponse { final User user; final bool isSuccess; GetUserUseCaseResponse({required this.user, required this.isSuccess}); }步骤 3:实现 UseCase 类
继承适当的 UseCase 基类并实现业务逻辑:
class GetUserUseCase extends FutureUseCase<GetUserUseCaseResponse, GetUserUseCaseParams> { final UsersRepository _usersRepository; GetUserUseCase(this._usersRepository); @override Future<GetUserUseCaseResponse?> buildUseCaseFuture(GetUserUseCaseParams? params) async { try { if (params == null) { throw Exception("参数不能为空"); } final user = await _usersRepository.getUser(params.userId); return GetUserUseCaseResponse(user: user, isSuccess: true); } catch (e) { logger.severe('获取用户失败: $e'); throw e; } } }步骤 4:在 Presenter 中使用 UseCase
在 Presenter 中创建 UseCase 实例并执行:
class HomePresenter { final GetUserUseCase _getUserUseCase; final HomeView _view; HomePresenter(this._view, this._getUserUseCase); void loadUser(String userId) { _view.showLoading(); _getUserUseCase.execute( _GetUserUseCaseObserver(this), GetUserUseCaseParams(userId: userId), ); } // ... 其他代码 } class _GetUserUseCaseObserver extends Observer<GetUserUseCaseResponse> { final HomePresenter _presenter; _GetUserUseCaseObserver(this._presenter); @override void onNext(GetUserUseCaseResponse? response) { if (response?.isSuccess == true) { _presenter._view.showUser(response!.user); } } @override void onError(dynamic error) { _presenter._view.showError(error.toString()); } @override void onComplete() { _presenter._view.hideLoading(); } }这段代码可以在 example/lib/src/app/pages/home/home_presenter.dart 文件中找到参考实现。
UseCase 模式的最佳实践
依赖注入
始终通过构造函数注入依赖项,特别是抽象仓库:
class LoginUseCase extends CompletableFutureUseCase<LoginUseCaseParams> { final AuthenticationRepository _authenticationRepository; // 通过构造函数注入抽象仓库 LoginUseCase(this._authenticationRepository); // ... 实现代码 }单一职责原则
每个 UseCase 应该只负责一个业务功能,避免创建"上帝类":
- ✅ 正确:
GetUserUseCase、LoginUseCase、LogoutUseCase - ❌ 错误:
UserManagementUseCase(包含所有用户相关操作)
错误处理
在 UseCase 中妥善处理错误,并通过Observer通知上层:
@override Future<void> buildUseCaseFuture(LoginUseCaseParams? params) async { try { await _authenticationRepository.login( email: params!.email, password: params.password ); } on NetworkException { throw LoginException("网络连接失败,请检查网络设置"); } on AuthenticationException { throw LoginException("邮箱或密码错误"); } catch (e) { logger.severe("登录失败: $e"); throw LoginException("登录失败,请稍后重试"); } }资源释放
使用完毕后及时调用dispose()方法释放资源:
@override void dispose() { _getUserUseCase.dispose(); _loginUseCase.dispose(); super.dispose(); }总结
UseCase 模式是 Flutter Clean Architecture 中的核心概念,它通过将业务逻辑封装成独立模块,帮助开发者构建更清晰、更可维护的 Flutter 应用。通过遵循本文介绍的实现步骤和最佳实践,你可以轻松地将复杂业务逻辑与 UI 组件分离,提高代码质量和开发效率。
要开始使用 Flutter Clean Architecture,可以通过以下命令克隆项目:
git clone https://gitcode.com/gh_mirrors/flut/flutter_clean_architecture探索项目中的示例代码,特别是 example/lib/src/domain/usecases/ 目录下的用例实现,了解如何在实际项目中应用这些概念。
【免费下载链接】flutter_clean_architectureClean architecture flutter: A Flutter package that makes it easy and intuitive to implement Uncle Bob's Clean Architecture in Flutter. This package provides basic classes that are tuned to work with Flutter and are designed according to the Clean Architecture.项目地址: https://gitcode.com/gh_mirrors/flut/flutter_clean_architecture
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考