Advanced

Decodeurs

Introduction

Les decodeurs sont un concept introduit dans Nylo Website qui vous permet de decoder des donnees en objets ou classes. Vous utiliserez probablement les decodeurs lorsque vous travaillez avec la classe de mise en reseau ou si vous souhaitez utiliser le helper api dans Nylo Website.

Par defaut, l'emplacement des decodeurs est lib/config/decoders.dart

Le fichier decoders.dart contiendra deux variables :

Decodeurs de modeles

Les decodeurs de modeles sont nouveaux dans Nylo Website, ils fournissent un moyen de transformer les donnees de reponse en representations de modeles.

La methode helper network() utilisera la variable modelDecoders dans votre fichier config/decoders.dart pour determiner quel decodeur utiliser.

Voici un exemple.

Voici comment le helper network utilise les 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"),
    );
  }
...

La methode fetchUsers decodera automatiquement la charge utile de la requete en un User.

Comment cela fonctionne-t-il ?

Vous avez une classe User comme ci-dessous.

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
  };
}

Vous pouvez voir ci-dessus que cette classe a une methode fromJson qui nous fournit un moyen d'initialiser la classe.

Nous pouvons initialiser cette classe en appelant la methode suivante.

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

Maintenant, pour configurer nos decodeurs, nous devons faire ce qui suit.

Fichier : config/decoders.dart

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

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

  // ...
};

Dans le fichier modelDecoders, nous devons fournir le Type comme cle et gerer la transformation dans la valeur comme dans l'exemple ci-dessus.

L'argument data contiendra la charge utile de la requete API.

Decodeurs d'API

Les decodeurs d'API sont utilises lors de l'appel de la methode helper api.

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

Le helper api associera le bon service API en utilisant les generiques, vous pouvez donc appeler le helper ci-dessous pour acceder a votre service.

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

Avant d'utiliser le helper api, vous devrez d'abord ajouter votre service API dans lib/config/decoders.dart > apiDecoders.

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

  // ...
};