Advanced

Decoders

Einleitung

Decoders sind ein in Nylo Website eingeführtes Konzept, das es Ihnen ermöglicht, Daten in Objekte oder Klassen zu dekodieren. Sie werden Decoders wahrscheinlich verwenden, wenn Sie mit der Networking-Klasse arbeiten oder wenn Sie den api-Helfer in Nylo Website verwenden möchten.

Standardmäßig befindet sich die Datei für Decoders in lib/config/decoders.dart

Die Datei decoders.dart enthält zwei Variablen:

Model-Decoders

Model-Decoders sind neu in Nylo Website und bieten eine Möglichkeit, Daten-Payloads in Model-Darstellungen umzuwandeln.

Die Hilfsmethode network() verwendet die Variable modelDecoders in Ihrer config/decoders.dart-Datei, um den zu verwendenden Decoder zu bestimmen.

Hier ist ein Beispiel.

So verwendet der network-Helfer 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"),
    );
  }
...

Die Methode fetchUsers dekodiert automatisch den Payload der Anfrage in einen User.

Wie funktioniert das?

Sie haben eine User-Klasse wie die folgende.

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

Sie können sehen, dass diese Klasse eine fromJson-Methode hat, die uns eine Möglichkeit bietet, die Klasse zu initialisieren.

Wir können diese Klasse initialisieren, indem wir die folgende Methode aufrufen.

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

Um nun unsere Decoders einzurichten, müssen wir Folgendes tun.

Datei: config/decoders.dart

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

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

  // ...
};

In der modelDecoders-Datei müssen wir den Type als Schlüssel angeben und die Umwandlung im Wert behandeln, wie im obigen Beispiel.

Das Argument data enthält den Payload der API-Anfrage.

API-Decoders

API-Decoders werden beim Aufruf der api-Hilfsmethode verwendet.

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

Der api-Helfer ordnet den richtigen API-Service mithilfe von Generics zu, sodass Sie den folgenden Helfer aufrufen können, um auf Ihren Service zuzugreifen.

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

Bevor Sie den api-Helfer verwenden, müssen Sie zunächst Ihren API-Service in lib/config/decoders.dart > apiDecoders hinzufügen.

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

  // ...
};