Flutter插件dioxide的介绍与使用

Flutter插件dioxide的介绍与使用

Dioxide 是一个用于类型转换的 Dio 客户端生成器。

使用Flutter插件dioxide

添加依赖

pubspec.yaml 文件中添加以下依赖:

dependencies:
  dioxide: ^lastVersion

dev_dependencies:
  build_runner: ^2.2.0
  dioxide_generator: ^lastVersion

然后运行生成器:

# dart
pub run build_runner build

# flutter
flutter pub run build_runner build

定义并生成你的API

import 'package:json_annotation/json_annotation.dart';
import 'package:dio/dio.dart';
import 'package:dioxide/dioxide.dart';

part 'example.g.dart';

[@RestApi](/user/RestApi)(baseUrl: "http://localhost:8080/api/Task")
abstract class RestClient {
  factory RestClient(Dio dio, {String baseUrl}) = _RestClient;

  [@GetRequest](/user/GetRequest)()
  Future<List<Task>> getTasks();
}

@JsonSerializable()
class Task {
  String? id;
  String? name;
  String? avatar;
  String? createdAt;

  Task({this.id, this.name, this.avatar, this.createdAt});

  factory Task.fromJson(Map<String, dynamic> json) => _$TaskFromJson(json);

  Map<String, dynamic> toJson() => _$TaskToJson(this);
}

类型转换

在使用类型转换之前,请确保为每个模型类提供了一个 factory Task.fromJson(Map<String, dynamic> json) 方法。推荐使用 json_serializable 作为序列化工具。

@JsonSerializable()
class Task {
  String name;
  Task({this.name});
  factory Task.fromJson(Map<String, dynamic> json) => _$TaskFromJson(json);
}

HTTP方法

Dioxide 支持以下 HTTP 方法:

// 获取指定ID的任务
[@GetRequest](/user/GetRequest)("/tasks/{id}")
Future<Task> getTask(@Path("id") String id);

// 查询任务
[@GetRequest](/user/GetRequest)('/demo')
Future<String> queries([@Queries](/user/Queries)() Map<String, dynamic> queries);

// 带有查询参数的任务搜索
[@GetRequest](/user/GetRequest)("/search")
Future<String> namedExample(
    @Query("name") String name,
    @Query("tag") String tag,
);

// 部分更新任务
@PatchRequest("/tasks/{id}")
Future<Task> updateTaskPart(@Path() String id, @Body() Map<String, dynamic> map);

// 更新任务
@PutRequest("/tasks/{id}")
Future<Task> updateTask(@Path() String id, @Body() Task task);

// 删除任务
@DeleteRequest("/tasks/{id}")
Future<void> deleteTask(@Path() String id);

// 创建任务
@PostRequest("/tasks")
Future<Task> createTask(@Body() Task task);

// 从文件创建新任务
@PostRequest("/post")
Future<void> createNewTaskFromFile(@Part() File file);

// 提交编码为URL表单的数据
@PostRequest("/post")
@FormUrlEncoded()
Future<String> postUrlEncodedFormData(@Field() String hello);

获取原始HTTP响应

// 获取指定ID的任务
[@GetRequest](/user/GetRequest)("/tasks/{id}")
Future<HttpResponse<Task>> getTask(@Path("id") String id);

// 获取所有任务
[@GetRequest](/user/GetRequest)("/tasks")
Future<HttpResponse<List<Task>>> getTasks();

获取Dio响应

// 获取文件
[@GetRequest](/user/GetRequest)("/file/{fileId}")
[@DioResponseType](/user/DioResponseType)(ResponseType.stream)
Future<Response<ResponseBody>> getTask(@Path("fileId") String id);

HTTP头

动态添加HTTP头
[@GetRequest](/user/GetRequest)("/tasks")
Future<Task> getTasks(@Header("Content-Type") String contentType );
静态添加HTTP头
[@GetRequest](/user/GetRequest)("/tasks")
@Headers(<String, dynamic>{
	"Content-Type" : "application/json",
	"Custom-Header" : "Your header"
})
Future<Task> getTasks();

多个端点支持

如果你想要使用多个端点到 RestClient,你应该在初始化 RestClient 时传递基础 URL。在 RestApi 中定义的任何值将被忽略。

[@RestApi](/user/RestApi)(baseUrl: "this url will be ignored if baseUrl is passed")
abstract class RestClient {
  factory RestClient(Dio dio, {String baseUrl}) = _RestClient;
}

final client = RestClient(dio, baseUrl: "your base url");

如果你希望使用 dio.option.baseUrl 的基础 URL,并且优先级最低,请不要向 RestApi 注解和 RestClient 的构造方法传递任何参数。

设置请求超时

[@RestApi](/user/RestApi)(baseUrl: 'http://localhost:8080/api/Report')
[@RequestTimeout](/user/RequestTimeout)(connectTimeout: 5000, sendTimeout: 5000, receiveTimeout: 5000)
abstract class ReportClient {
  [@GetRequest](/user/GetRequest)("/generate")
  [@RequestTimeout](/user/RequestTimeout)(sendTimeout: 15000, receiveTimeout: 30000)
  [@DioResponseType](/user/DioResponseType)(ResponseType.stream)
  Future<Response<ResponseBody>> getTask([@Queries](/user/Queries)() Map<String, dynamic> queries);
}

更多关于Flutter插件dioxide的介绍与使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter插件dioxide的介绍与使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


截至2023年,Flutter社区中有许多插件和包,用于扩展Flutter应用的功能。然而,关于名为“dioxide”的插件,目前并没有广泛记录或官方支持的插件。可能是某个特定开发者或团队创建的一个自定义插件,或者是一个新发布的插件。

如果你遇到了一个名为“dioxide”的插件,并且想要了解它的功能和使用方法,以下是一些建议的步骤:


1. 查找插件的文档

  • 访问插件的发布页面(例如 pub.dev)并搜索“dioxide”。
  • 查看插件的描述、文档和示例代码。
  • 如果插件有GitHub仓库,可以查看其README文件以获取详细信息。

2. 安装插件

如果插件发布在 pub.dev 上,可以通过以下步骤安装:

  • pubspec.yaml 文件中添加依赖项:
    dependencies:
      dioxide: ^版本号
    
  • 运行 flutter pub get 安装插件。

3. 使用插件

  • 根据插件的文档,导入插件并在代码中使用其功能。
  • 示例:
    import 'package:dioxide/dioxide.dart';
    
    void main() {
      // 使用插件的功能
      Dioxide.doSomething();
    }
回到顶部