Flutter使用T扩展接口创建通用函数

问题描述

上下文

在我的代码中,我有一个名为AbstactDataModel的接口,该接口用作所有数据模型类的起点。这样做是为了使我知道无论我需要什么xyzModel类,它都会有一个fromJson(Map<String,dynamic> json)函数,该函数将返回使用给定json和{{ 1}}。

type

这是扩展// In abstract_model.dart abstract class AbstractDataModel { /// /// returns a String containing the class name /// For example,the class ColumnModel will return 'column' /// String get type; /// /// Will call the [.fromJson] constructor and return a new instance of the /// object /// dynamic fromJson(Map<String,dynamic> json); } 的DataModel类的示例:

AbstractDataModel

“破损”代码

我做了一个将API请求发送到服务器的函数,然后将json响应解析为DataModel类型的对象。为了避免代码重复并使源代码更易于维护,我想创建一个通用函数,如下所示:

// in group_model.dart
class GroupModel extends AbstractDataModel {
  int _id;
  String _name;

  // Constructors
  GroupModel.empty();
  GroupModel.fromJson(Map<String,dynamic> json) {
    _id = parsetoInt(json['id'].toString());
    _name = parsetoString(json['name'].toString());
  }

  // Getters for private fields
  int get id => _id;
  String get name => _name;
  @override
  String get type => 'group';

  @override
  GroupModel fromJson(Map<String,dynamic> json) => GroupModel.fromJson(json);
}

我期望使用它的方式如下:

// inside the API class (which is a singleton)
Future<T> getobject<T extends AbstractDataModel>({
@required String command,@required Map<String,dynamic> params,}) async {
    final Response response = await _sendRequest(
        command: command,params: params,);
    T object;
    final Map<String,dynamic> body =
        jsonDecode(response.body)['result'] as Map<String,dynamic>;
    if (body == null) {
        print('Request Failed.');
        throw const Failure('Failed request to fetch object.');
    } else {
        object = (T as AbstractDataModel).fromJson(body) as T;
        print('Successfully fetched ${object.type}');
        return object;
    }
}

预期的行为

我希望GroupModel group = await API().getobject<GroupModel>(); 函数知道,由于getobject扩展了T,因此AbstractDataModel函数存在,并使用它来创建新的{{1} }对象,同时只接受扩展fromJson(...)的对象,即抛出GroupModel错误,说类似'int不会扩展AbstractDataModel`。

实际行为

在执行过程中,我收到一个未处理的错误,指出类型_Type不是AbstractDataModel的子类型,因此,强制转换getobject<int>()是无效的。

另外,设置一个断点并通过调试器检查一些值,我测试了以下语句:

AbstractDataModel

所以我什至无法通过(T as AbstractDataModel)语句来处理它,因为即使我调用T is AbstractDataModel: false T is GroupModel: true T is AnyOtherDataModelThatExtendsAbstractDataModel: true ,例如,语句switch仍被评估为true 。关于我在做什么的任何指示?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)