Flutter代码生成插件riverfit_generator的使用

Flutter代码生成插件riverfit_generator的使用

Riverfit

Riverfit Codecov License

概述

Riverfit 是一个Dart代码生成库,旨在集成 riverpod_generatorretrofit_generator 的功能。

为什么使用Riverfit?

这种集成适用于依赖于Riverpod进行状态管理和Retrofit进行API交互的项目。

当你使用 @Riverpod 注解时,可以选择注解一个函数或类。我更倾向于使用基于类的注解,特别是在组织、可读性和可维护性方面。

  • 更好的封装:类将相关的逻辑和数据组合在一起,使理解并管理provider的行为更加容易。
  • 改进的可读性:通过专用的类,可以立即了解provider所代表的内容,并添加额外的方法或属性来扩展其功能。
  • 可扩展性:类允许你添加与provider状态直接相关的额外方法、属性或计算值。

然而,目前无法在同一类上使用 riverpod_generatorretrofit_generator 的注解,因为 @Riverpod 需要一个具体的类,而 @RestApi 需要一个抽象类。

Riverfit通过分析带有 @Riverfit 注解的类来解决这个问题:

  • 委托provider代码生成到Riverpod Generator。
  • 生成一个包含转发调用到Retrofit成员的provider扩展类。这消除了手动代理样板的需求。

子项目

1. riverfit_annotation

提供用于标记类以进行Riverfit处理的 @Riverfit()/@riverfit 注解。可以用它作为 @Riverpod()@riverpod 注解的替代品。

使用方法

  1. 创建你的标准Retrofit抽象类作为API契约。
import 'package:dio/dio.dart';
import 'package:retrofit/retrofit.dart';

part 'api.g.dart';

@RestApi(baseUrl: 'https://example.com')
abstract class Api {
  factory Api(Dio dio, {String? baseUrl}) = _Api;

  @GET('/fetchData')
  Future<dynamic> fetchData();

  @PUT('/pushData/{id}')
  Future<dynamic> pushData(String id);
}
  1. 创建一个API客户端作为被提供的类。
import 'package:riverfit_annotation/riverfit_annotation.dart';

@Riverfit(keepAlive: true, dependencies: [OtherProvider])
class ApiClient extends _$ApiClient {
  // 声明一个Retrofit成员
  late final Api _api;

  @override
  Future<ApiClient> build() async {
    // 初始化逻辑在这里...
    // 例如自定义Dio配置或添加拦截器以处理日志记录或身份验证等横切关注点
    _api = Api(Dio());
    return this;
  }
}

如果使用AutoDisposeProvider(keepAlive: false)

import 'package:riverfit_annotation/riverfit_annotation.dart';

@riverfit
class ApiClient extends _$ApiClient {
  // 声明一个Retrofit成员
  late final Api _api;

  @override
  Future<ApiClient> build() async {
    // 初始化逻辑在这里...
    // 例如自定义Dio配置或添加拦截器以处理日志记录或身份验证等横切关注点
    _api = Api(Dio());
    return this;
  }
}
  1. 生成代码
dart run build_runner build --delete-conflicting-outputs

实现

注解将所有参数代理给Riverpod注解,目前包括:

  • <code>keepAlive</code>:provider的状态是否即使在不再使用时仍应持久存在。默认为 <code>false</code>
  • <code>dependencies</code>:此类依赖的Riverpod provider列表。

2. riverfit_generator

核心生成器,联合Riverpod和Retrofit代码生成。确保正确处理注解并生成provider和扩展方法。

特点

  • 为注解的类生成Riverpod provider代码。
  • 创建无缝调用Retrofit成员的包装方法。

示例

运行 dart run build_runner build,生成的代码将包括:

  1. ApiClient 生成的Riverpod provider。
  2. 到Retrofit成员 Api 的扩展类的包装方法。

生成输出:

// 自动生成的代码 - 请勿手动修改

part of 'api_client.dart';

// Riverpod provider (传递给riverpod_generator.generate())
String _$apiClientHash() => r'XXXX';

/// 参见 [ApiClient]。
@ProviderFor(ApiClient)
final apiClientProvider = AsyncNotifierProvider<ApiClient, ApiClient>.internal(
  ApiClient.new,
  name: r'apiClientProvider',
  debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') ? null : _$apiClientHash,
  dependencies: null,
  allTransitiveDependencies: null,
);

typedef _$ApiClient = AsyncNotifier<ApiClient>;

// Retrofit成员的包装方法
extension ApiClientExtension on ApiClient {
  Future<String> fetchData() {
    return _api.fetchData();
  }

  Future<void> pushData(int id) {
    return _api.pushData(id);
  }
}

安装

在你的 pubspec.yaml 中添加以下依赖项:

dependencies:
  riverfit_annotation: ^1.0.0

dev_dependencies:
  riverfit_generator: ^1.0.0
  build_runner: ^2.4.0

更多关于Flutter代码生成插件riverfit_generator的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter代码生成插件riverfit_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


riverpod_generator 是一个用于简化 Riverpod 代码的代码生成插件。它可以帮助你自动生成 Provider、StateProvider、FutureProvider 等代码,减少手动编写重复代码的工作量。

以下是如何使用 riverpod_generator 插件的步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 riverpod_generatorbuild_runner 的依赖。

dependencies:
  flutter_riverpod: ^2.0.0
  riverpod_annotation: ^2.0.0

dev_dependencies:
  build_runner: ^2.1.0
  riverpod_generator: ^2.0.0

2. 创建 Provider

使用 [@riverpod](/user/riverpod) 注解来标记一个方法或类,riverpod_generator 会自动为你生成相应的 Provider。

import 'package:riverpod_annotation/riverpod_annotation.dart';

part 'example.g.dart'; // 自动生成的文件

[@riverpod](/user/riverpod)
String myProvider(MyProviderRef ref) {
  return 'Hello, Riverpod!';
}

3. 运行代码生成器

在终端中运行以下命令来生成代码:

flutter pub run build_runner build

这将生成一个 example.g.dart 文件,其中包含了自动生成的 Provider 代码。

4. 使用生成的 Provider

你可以像使用普通 Provider 一样使用生成的 Provider。

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'example.dart'; // 包含你的 Provider 的文件

void main() {
  runApp(ProviderScope(child: MyApp()));
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Riverpod Generator Example')),
        body: Consumer(
          builder: (context, ref, child) {
            final value = ref.watch(myProviderProvider);
            return Center(child: Text(value));
          },
        ),
      ),
    );
  }
}

5. 其他功能

riverpod_generator 还支持生成其他类型的 Provider,如 StateProviderFutureProvider 等。你可以通过在方法上使用不同的注解来生成不同类型的 Provider。

例如,生成一个 StateProvider

[@riverpod](/user/riverpod)
class Counter extends _$Counter {
  @override
  int build() => 0;

  void increment() => state++;
}

运行代码生成器后,你可以使用 counterProvider 来管理状态。

final counterProvider = CounterProvider();

6. 自动监听依赖

riverpod_generator 还支持自动监听其他 Provider 的变化。你可以在方法中使用 ref.watch 来监听其他 Provider 的状态,当依赖的 Provider 发生变化时,当前 Provider 会自动重建。

[@riverpod](/user/riverpod)
String myDependentProvider(MyDependentProviderRef ref) {
  final value = ref.watch(myProviderProvider);
  return 'Dependent on: $value';
}
回到顶部