Flutter代码生成插件riverfit_generator的使用
Flutter代码生成插件riverfit_generator的使用
Riverfit
概述
Riverfit 是一个Dart代码生成库,旨在集成 riverpod_generator
和 retrofit_generator
的功能。
为什么使用Riverfit?
这种集成适用于依赖于Riverpod进行状态管理和Retrofit进行API交互的项目。
当你使用 @Riverpod
注解时,可以选择注解一个函数或类。我更倾向于使用基于类的注解,特别是在组织、可读性和可维护性方面。
- 更好的封装:类将相关的逻辑和数据组合在一起,使理解并管理provider的行为更加容易。
- 改进的可读性:通过专用的类,可以立即了解provider所代表的内容,并添加额外的方法或属性来扩展其功能。
- 可扩展性:类允许你添加与provider状态直接相关的额外方法、属性或计算值。
然而,目前无法在同一类上使用 riverpod_generator
和 retrofit_generator
的注解,因为 @Riverpod
需要一个具体的类,而 @RestApi
需要一个抽象类。
Riverfit通过分析带有 @Riverfit
注解的类来解决这个问题:
- 委托provider代码生成到Riverpod Generator。
- 生成一个包含转发调用到Retrofit成员的provider扩展类。这消除了手动代理样板的需求。
子项目
1. riverfit_annotation
提供用于标记类以进行Riverfit处理的 @Riverfit()
/@riverfit
注解。可以用它作为 @Riverpod()
或 @riverpod
注解的替代品。
使用方法
- 创建你的标准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);
}
- 创建一个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;
}
}
- 生成代码
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
,生成的代码将包括:
- 为
ApiClient
生成的Riverpod provider。 - 到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
更多关于Flutter代码生成插件riverfit_generator的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
riverpod_generator
是一个用于简化 Riverpod 代码的代码生成插件。它可以帮助你自动生成 Provider、StateProvider、FutureProvider 等代码,减少手动编写重复代码的工作量。
以下是如何使用 riverpod_generator
插件的步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 riverpod_generator
和 build_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,如 StateProvider
、FutureProvider
等。你可以通过在方法上使用不同的注解来生成不同类型的 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';
}