如何从扩展 class 中调用方法?
How do I call a method from an extended class?
我没有扩展 classes 的经验
所以不要感到震惊...这就是我得到的:
'basic class' 我想在我的模型中扩展
避免每 2 行重复 fromJson/toJson
import 'dart:convert';
class BaseModel {
Map<String, dynamic> json2Map(String json) => jsonDecode(json);
String map2Json(Map<String, dynamic> map) => jsonEncode(map);
json2List(String jsonList) {
List<Map<String, dynamic>> _list = [];
jsonDecode(jsonList).forEach((_json) => _list.add(jsonDecode(_json)));
return _list;
}
mapList2Json(List<Map<String,dynamic>> list) {
List<String> jsonList= [];
list.forEach((_map) => jsonList.add(map2Json(_map)));
return jsonEncode(jsonList);
}
}
这是扩展此的 class 之一:
import 'package:bloc_hub/models/base_model.dart';
class Info extends BaseModel {
final String name;
final String company;
Info({this.name,this.company});
factory Info.fromMap(Map<String, dynamic> json) => new Info(
name: json['name'],
company: json['company'],
);
Map<String, dynamic> toMap() {
var map = new Map<String, dynamic>();
map['name'] = name;
map['company'] = company;
return map;
}
}
(我在 streambuilder 中 client.info 是 json)
然后...当我尝试调用 'json2map'
这是来自扩展 class...
Info info = Info.fromMap(json2Map(client.info));
我明白了:
[dart] The method 'json2Map' isn't defined for the class 'ListPage'. [undefined_method]
我做错了什么?
如果我不清楚,请不要问我任何事情
感谢您的帮助
[编辑:奖金问题
mixin 与我正在做的有何不同?]
json2Map
是 BaseModel
的实例方法,因此为了调用它,您必须使用 BaseModel
的实例或扩展它的 class (例如Info
), 如:
var b = new BaseModel();
b.json2Map(something);
错误消息说您正在从 ListPage
调用它,因此找不到该方法。
或者,您可以将方法设为静态并像 BaseModel.json2Map(...)
那样调用它(没有实例)。
有一些关于 mixins 的很好的解释 here(有 Python 个例子,但 Dart 的概念是相同的)。我想在您的示例中,使用具有 JSON 相关函数的混合会更有意义,因为您可以在其他类型的对象中使用它们。
我没有扩展 classes 的经验 所以不要感到震惊...这就是我得到的:
'basic class' 我想在我的模型中扩展 避免每 2 行重复 fromJson/toJson
import 'dart:convert';
class BaseModel {
Map<String, dynamic> json2Map(String json) => jsonDecode(json);
String map2Json(Map<String, dynamic> map) => jsonEncode(map);
json2List(String jsonList) {
List<Map<String, dynamic>> _list = [];
jsonDecode(jsonList).forEach((_json) => _list.add(jsonDecode(_json)));
return _list;
}
mapList2Json(List<Map<String,dynamic>> list) {
List<String> jsonList= [];
list.forEach((_map) => jsonList.add(map2Json(_map)));
return jsonEncode(jsonList);
}
}
这是扩展此的 class 之一:
import 'package:bloc_hub/models/base_model.dart';
class Info extends BaseModel {
final String name;
final String company;
Info({this.name,this.company});
factory Info.fromMap(Map<String, dynamic> json) => new Info(
name: json['name'],
company: json['company'],
);
Map<String, dynamic> toMap() {
var map = new Map<String, dynamic>();
map['name'] = name;
map['company'] = company;
return map;
}
}
(我在 streambuilder 中 client.info 是 json) 然后...当我尝试调用 'json2map' 这是来自扩展 class...
Info info = Info.fromMap(json2Map(client.info));
我明白了:
[dart] The method 'json2Map' isn't defined for the class 'ListPage'. [undefined_method]
我做错了什么? 如果我不清楚,请不要问我任何事情
感谢您的帮助
[编辑:奖金问题 mixin 与我正在做的有何不同?]
json2Map
是 BaseModel
的实例方法,因此为了调用它,您必须使用 BaseModel
的实例或扩展它的 class (例如Info
), 如:
var b = new BaseModel();
b.json2Map(something);
错误消息说您正在从 ListPage
调用它,因此找不到该方法。
或者,您可以将方法设为静态并像 BaseModel.json2Map(...)
那样调用它(没有实例)。
有一些关于 mixins 的很好的解释 here(有 Python 个例子,但 Dart 的概念是相同的)。我想在您的示例中,使用具有 JSON 相关函数的混合会更有意义,因为您可以在其他类型的对象中使用它们。