Advanced

解码器

简介

解码器是 Nylo Website 中引入的一个概念,允许您将数据解码为对象或类。当您使用网络类或 Nylo Website 中的 api 辅助函数时,通常会用到解码器。

默认情况下,解码器的位置在 lib/config/decoders.dart

decoders.dart 文件将包含两个变量:

模型解码器

模型解码器是 Nylo Website 中的新功能,它提供了一种将数据负载转换为模型表示的方式。

network() 辅助方法将使用 config/decoders.dart 文件中的 modelDecoders 变量来确定使用哪个解码器。

以下是一个示例。

这是 network 辅助函数如何使用 modelDecoders。

class ApiService extends NyApiService {
  ApiService({BuildContext? buildContext}) 
        : super(buildContext, decoders: modelDecoders);

  @override
  String get baseUrl => "https://jsonplaceholder.typicode.com";

  Future<User?> fetchUsers() async {
    return await network<User>(
        request: (request) => request.get("/users"),
    );
  }
...

fetchUsers 方法会自动将请求的负载解码为 User

这是如何工作的?

您有一个如下所示的 User 类。

class User {
  String? name;
  String? email;

  User.fromJson(dynamic data) {
    this.name = data['name'];
    this.email = data['email'];
  }

  toJson()  => {
    "name": this.name,
    "email": this.email
  };
}

从上面可以看到,这个类有一个 fromJson 方法,为我们提供了一种初始化类的方式。

我们可以通过调用以下方法来初始化这个类。

User user = User.fromJson({'name': 'Anthony', 'email': 'agordon@mail.com'});

现在,要设置我们的解码器,我们需要执行以下操作。

文件: config/decoders.dart

final modelDecoders = {
  List<User>: (data) => List.from(data).map((json) => User.fromJson(json)).toList(),

  User: (data) => User.fromJson(data),

  // ...
};

在 modelDecoders 文件中,我们需要提供 Type 作为键,并在值中处理转换,如上面的示例。

data 参数将包含来自 API 请求的负载。

API 解码器

API 解码器在调用 api 辅助方法时使用。

loadUser() async {
    User user = await api<ApiService>((request) => request.fetchUser());
}

api 辅助函数将使用泛型匹配正确的 API 服务,因此您可以调用以下辅助函数来访问您的服务。

await api<MyService>((request) => request.callMyMethod());

在使用 api 辅助函数之前,您需要先将 API 服务添加到 lib/config/decoders.dart > apiDecoders 中。

final Map<Type, dynamic> apiDecoders = {
  ApiService: ApiService(),

  // ...
};