Decoder
Introduzione
I decoder sono un concetto introdotto in Nylo Website che ti permette di decodificare dati in oggetti o classi.
Probabilmente userai i decoder quando lavori con la classe networking o se vuoi utilizzare l'helper api in Nylo Website.
Per impostazione predefinita, la posizione dei decoder e'
lib/config/decoders.dart
Il file decoders.dart conterra' due variabili:
- modelDecoders - Gestisce tutti i decoder dei tuoi modelli
- apiDecoders - Gestisce tutti i decoder delle tue API
Model decoder
I model decoder sono una novita' in Nylo Website, forniscono un modo per trasformare i payload di dati in rappresentazioni di modelli.
Il metodo helper network() utilizzera' la variabile modelDecoders all'interno del tuo file config/decoders.dart per determinare quale decoder utilizzare.
Ecco un esempio.
Ecco come l'helper network utilizza 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"),
);
}
...
Il metodo fetchUsers decodifichera' automaticamente il payload dalla richiesta in un User.
Come funziona?
Hai una classe User come quella qui sotto.
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
};
}
Come puoi vedere, questa classe ha un metodo fromJson che ci fornisce un modo per inizializzare la classe.
Possiamo inizializzare questa classe chiamando il metodo seguente.
User user = User.fromJson({'name': 'Anthony', 'email': 'agordon@mail.com'});
Ora, per configurare i nostri decoder, dobbiamo fare quanto segue.
File: config/decoders.dart
final modelDecoders = {
List<User>: (data) => List.from(data).map((json) => User.fromJson(json)).toList(),
User: (data) => User.fromJson(data),
// ...
};
Nel file modelDecoders, dobbiamo fornire il Type come chiave e gestire la trasformazione nel valore come nell'esempio sopra.
L'argomento data conterra' il payload dalla richiesta API.
API decoder
I decoder API vengono utilizzati quando si chiama il metodo helper api.
loadUser() async {
User user = await api<ApiService>((request) => request.fetchUser());
}
L'helper api abbinera' il servizio API corretto utilizzando i generics, quindi puoi chiamare l'helper qui sotto per accedere al tuo servizio.
await api<MyService>((request) => request.callMyMethod());
Prima di utilizzare l'helper api, dovrai prima aggiungere il tuo servizio API in lib/config/decoders.dart > apiDecoders.
final Map<Type, dynamic> apiDecoders = {
ApiService: ApiService(),
// ...
};