繁体   English   中英

具有命名构造函数的Dart抽象类通用类型

[英]Dart Abstract class of Generic Type with Named Constructor

我试图构建一个抽象类,需要Dart中的命名构造函数。 给定一些Map(m),这个泛型类型必须能够实例化它自己。

Dart编译器抛出T.fromJson -> Invalid constructor name.

我尝试编码:

abstract class JsonMap<T> {
  Map toJson();
  T.fromJson(Map m);
}

我挣扎着相同的概念(在同一个地方... API解析:)))我没有找到一个合适的解决方案。

但也许你可以在检查块模式时使用我发现的这个东西(我没有将它用于我的模型部分):

abstract class SomeBase {
  void load();
}

class Provider<T extends SomeBase> extends InheritedWidget {
  final T something;

  Provider({
    Key key,
    @required this.something,
  }): super(key: key);

  @override
  bool updateShouldNotify(_) {
    return true;
  }

  static Type _typeOf<T>() => T;

  static T of<T extends SomeBase>(BuildContext context){
    final type = _typeOf<Provider<T>>();
    Provider<T> provider = context.inheritFromWidgetOfExactType(type);
    return provider.something;
  }
}

或者只是使用它而不将其封装在继承的小部件中,并提供已经初始化的对象(如用户或您要解析的任何内容),只需从提供的JSON中加载值。

您正在创建一个名为JsonMap的类,该类在类型T上进行参数化。 T不是您的类的名称,因此T.fromJson不是T.fromJson的有效命名构造JsonMap

如果你想让JsonMap有一个命名的构造函数,它应该是JsonMap.fromJson(Map m)

未经测试,但在我的头脑中,您应该像这样编写代码:

abstract class JsonMap<T> {
  Map<String, dynamic> toJson();
  T fromJson(Map<String, dynamic> m);
}

点使得fromJson(Map m)成为T类型的构造函数,或属于类型T的静态函数。没有点,它是一个属于抽象类JsonMap的函数,返回类型T.指定映射类型是好的做法,如果你知道它会是什么(比如json)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM