问题描述
上下文
在我的代码中,我有一个名为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 (将#修改为@)