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

问题描述 投票:1回答:2

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

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

我尝试编码:

abstract class JsonMap<T> {
  Map toJson();
  T.fromJson(Map m);
}
dart
2个回答
2
投票

我挣扎着相同的概念(在同一个地方... 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中加载值。


0
投票

您正在创建一个名为JsonMap的类,该类在T类型上进行参数化。 T不是你班级的名字,所以T.fromJson不是JsonMap的有效命名构造函数。

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

© www.soinside.com 2019 - 2024. All rights reserved.