Flutter注解插件usecase_annotation的功能使用
Flutter注解插件usecase_annotation的功能使用
usecase_annotation
允许你从存储库类生成用例类。它需要 usecase_generator
包来生成 .uc.dart
文件。
添加包
在你的 pubspec.yaml
文件中,添加 usecase_annotation
包作为依赖项,并将 usecase_generator
包和 build_runner
包作为开发依赖项:
dependencies:
flutter:
sdk: flutter
usecase_annotation: latest
dev_dependencies:
flutter_test:
sdk: flutter
build_runner: any
usecase_generator: latest
快速教程
创建一个 auth_repo.dart
类文件,并使用 [@UseCase](/user/UseCase)()
注解来为每个函数生成用例类:
注意:存储库类必须是抽象的!
import 'package:usecase_annotation/usecase_annotation.dart';
[@UseCase](/user/UseCase)()
abstract class AuthRepository {
void m1(); // 普通方法
Future<String> m2(int param1); // 异步方法
}
class AuthRepositoryImpl implements AuthRepository {
[@override](/user/override)
void m1() {
// 具体实现
}
[@override](/user/override)
Future<String> m2(int param1) async {
// 具体实现
return "result";
}
}
运行构建命令:
flutter packages pub run build_runner build --delete-conflicting-outputs
这将在 auth_repo.uc.dart
文件中生成以下类:
M1UseCase
,调用authRepository.m1()
M2UseCase
,调用authRepository.m2()
重要事项
为了将所有用例文件放在同一文件夹中,你需要在 pubspec.yaml
文件旁边创建一个 build.yaml
文件。在此文件中,添加以下内容:
targets:
$default:
builders:
usecase_generator|usecase_gen:
options:
build_extensions:
{
"^lib/domain/repositories/{{}}.dart": "lib/domain/usecases/{{}}.uc.dart",
}
你可以根据自己的需求更新键值对。
动机
此包是为了遵循 Uncle Bob 的整洁架构方法并为您的存储库类创建用例类而构建的。
Riverpod 依赖注入
该包支持 Riverpod 依赖注入。你需要在 pubspec.yaml
文件中添加 flutter_riverpod
包。
默认情况下,此包带有 Riverpod 依赖注入。要关闭 Riverpod DI,你需要在 build.yaml
中将 isInjectableDI
构建器选项设置为 true
:
targets:
$default:
builders:
usecase_generator|usecase_gen:
options:
isInjectableDI: false
Injectable 依赖注入
此包还可以与 injectable
包一起工作。
首先,你需要将 isInjectableDI
设置为 true
。
然后,由于所有用例类都以 -UseCase
结尾,因此你需要在 pubspec.yaml
文件旁边创建一个 build.yaml
文件,并在其中添加以下内容:
targets:
$default:
builders:
usecase_generator|usecase_gen:
options:
isInjectableDI: true
injectable_generator:injectable_builder:
options:
auto_register: true
class_name_pattern: "UseCase$"
完整示例 Demo
以下是完整的示例代码,展示了如何使用 usecase_annotation
插件:
import 'package:usecase_annotation/usecase_annotation.dart';
// 使用 UseCase 注解标记抽象类
[@UseCase](/user/UseCase)()
abstract class AuthRepo {
// 普通方法
void m1();
// 异步方法
Future<String> m2(int param1);
}
// 实现抽象类
class AuthRepoImpl implements AuthRepo {
[@override](/user/override)
void m1() {
// 具体实现
print("Method 1 executed");
}
[@override](/user/override)
Future<String> m2(int param1) async {
// 具体实现
return "Result from method 2 with param: $param1";
}
}
void main() async {
final authRepo = AuthRepoImpl();
// 调用普通方法
authRepo.m1();
// 调用异步方法
final result = await authRepo.m2(42);
print(result);
}
更多关于Flutter注解插件usecase_annotation的功能使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter注解插件usecase_annotation的功能使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何使用 usecase_annotation
插件的示例代码。这个插件通常用于Flutter项目中,以便通过注解的方式简化一些常见任务,比如依赖注入、逻辑处理等。需要注意的是,具体的实现细节可能会因插件版本和具体需求而有所不同。以下示例假设你已经将 usecase_annotation
插件添加到了你的 pubspec.yaml
文件中。
1. 添加依赖
首先,确保在你的 pubspec.yaml
文件中添加了 usecase_annotation
依赖:
dependencies:
flutter:
sdk: flutter
usecase_annotation: ^最新版本号 # 替换为实际最新版本号
然后运行 flutter pub get
来获取依赖。
2. 定义注解和使用注解的类
假设 usecase_annotation
提供了一个 @UseCase
注解,用于标记业务逻辑类。以下是如何定义和使用这个注解的示例:
定义注解(通常插件已经定义好了,这里仅作为示例)
// 假设这是 usecase_annotation 插件内部定义的注解(实际使用时,这部分不需要你写)
class UseCase {
const UseCase();
}
使用注解
import 'package:usecase_annotation/usecase_annotation.dart'; // 根据实际导入路径调整
// 使用 @UseCase 注解标记业务逻辑类
@UseCase()
class UserUseCase {
// 模拟一个获取用户信息的函数
Future<Map<String, dynamic>> getUserInfo(String userId) async {
// 这里可以添加实际的业务逻辑,比如网络请求等
return {
'userId': userId,
'name': 'John Doe',
'email': 'john.doe@example.com',
};
}
}
3. 创建一个依赖注入容器(假设插件提供了相关功能)
虽然 usecase_annotation
插件本身可能不提供依赖注入容器的实现,但结合其他依赖注入库(如 get_it
)可以很方便地实现这一点。以下是如何结合 get_it
使用注解的示例:
添加 get_it
依赖
dependencies:
get_it: ^最新版本号 # 替换为实际最新版本号
设置 get_it
容器
import 'package:get_it/get_it.dart';
import 'user_usecase.dart'; // 导入上面定义的 UserUseCase 类
final GetIt sl = GetIt.instance;
void setupLocator() {
// 扫描所有带有 @UseCase 注解的类,并注册到 GetIt 容器中
// 注意:这里需要手动注册,因为 Dart 反射系统不支持在运行时直接扫描注解
sl.registerFactory<UserUseCase>(() => UserUseCase());
}
在应用启动时调用 setupLocator
import 'package:flutter/material.dart';
import 'locator.dart'; // 导入上面定义的 setupLocator 函数
void main() {
setupLocator(); // 设置依赖注入容器
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
使用依赖注入的类
import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';
import 'locator.dart'; // 确保已经导入了 setupLocator
import 'user_usecase.dart'; // 导入 UserUseCase 类
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final UserUseCase _userUseCase = sl<UserUseCase>(); // 从 GetIt 容器中获取 UserUseCase 实例
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Demo Home Page'),
),
body: Center(
child: FutureBuilder<Map<String, dynamic>>(
future: _userUseCase.getUserInfo('123'), // 调用 UserUseCase 的方法
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasError) {
return Text('Error: ${snapshot.error}');
} else {
return Text('User Info: ${snapshot.data?.toString()}');
}
} else {
return CircularProgressIndicator();
}
},
),
),
);
}
}
总结
上述示例展示了如何在Flutter项目中使用 usecase_annotation
插件(假设它提供了 @UseCase
注解)结合 get_it
进行依赖注入。请注意,实际使用时 usecase_annotation
插件的功能和API可能会有所不同,因此你需要参考该插件的官方文档来获取准确的用法。