Flutter注解插件usecase_annotation的功能使用

发布于 1周前 作者 sinazl 来自 Flutter

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

1 回复

更多关于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可能会有所不同,因此你需要参考该插件的官方文档来获取准确的用法。

回到顶部