簡體   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