首页 > 解决方案 > Flutter 中的通用 CRUD Http 函数

问题描述

我想让基本的 http crud 函数在我的颤振应用程序中通用。整个事情应该是这样的:

class HttpGenericClient {
  static Future<T> create<T>(String path, {required T data}) async {
    final Map<String, dynamic> parsedData = data.toJson();
    final Response<Map<String, dynamic>> response = await httpClient.post<Map<String, dynamic>>(path, data: data);

    final T preparedData = T.fromJson(response.data);

    return preparedData;
  }
}

HttpGenericClient.create<User>('/users', user);

我正在使用创建 fromJson 和 toJson 方法的 json_serializable 包。问题是我不能在 T 型上调用它们。有谁知道如何最好地解决这个问题?

此外,如果您必须在每次调用时都给出路径,我认为这不是很好。这里没有更好的解决方案,我可以以某种方式定义模型中的路径并访问它吗?

标签: flutterdartgenericsdio

解决方案


有很多方法可以做到这一点,例如,您可以将 HTTP 调用作为方法添加到模型类。在以下示例中,有一个简单的MyObject类和一个create可以调用以在数据库中创建的方法。

import 'package:http/http.dart' as http;
import 'dart:convert';
import 'dart:io';

class MyObject {
  int? id;
  String name;
  MyObject({required this.name}) : super();

  MyObject.fromJson(Map<String, dynamic> json)
      : id = json['id'],
        name = json['name'];

  Map<String, dynamic> toJson() => {
        'id': id,
        'name': name,
      };

  Future<bool> create() async {
    try {
      final response = await http.post(Uri.https(<YOUR_API_BASE_URL>, '/myobject'),
          headers: {'authorization': <YOUR_AUTH_TOKEN>}, // if needed
          body: jsonEncode(<String, dynamic>{
            'data': this.toJson(),
          }));

      if (response.statusCode == 200) {
        // let's say you get back id of the created record
        // in "data" tag
        id = jsonDecode(response.body)["data"];
        return true;
      } else {
        // handler errors
        return false;
      }
    } on SocketException {
      // do something when there is a network error
      return false;
    }
  }
}

之后,您可以创建一个新实例并像这样保存它:

  final myObject = MyObject(name: 'SomeNewName');
  if (!await myObject.create()) {
    // handle errors
  }

如果成功,您将拥有新数据myObject,包括idPOST调用返回的数据。这只是一个示例,请根据您的逻辑进行调整。


推荐阅读