如何从扩展 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 与我正在做的有何不同?]

json2MapBaseModel 的实例方法,因此为了调用它,您必须使用 BaseModel 的实例或扩展它的 class (例如Info), 如:

var b = new BaseModel();
b.json2Map(something);

错误消息说您正在从 ListPage 调用它,因此找不到该方法。

或者,您可以将方法设为静态并像 BaseModel.json2Map(...) 那样调用它(没有实例)。

有一些关于 mixins 的很好的解释 here(有 Python 个例子,但 Dart 的概念是相同的)。我想在您的示例中,使用具有 JSON 相关函数的混合会更有意义,因为您可以在其他类型的对象中使用它们。