首页 > 解决方案 > 如何在 dart 中获取通用对象的主要类型和子类型,例如 Type1, 我只想要 Type1 和 Type2 分开

问题描述

我想要 Flutter 中泛型类型的主类型和子类型。因此,例如,如果我有List<int>,我想要Listandint分开。如果我这样做 <int>[1,2,3].runtimeType,它给了我List<int>。但是,如果我只对该信息的 List 或 int 部分感兴趣怎么办。

我正在创建一个类型比较器来对我的数据进行排序

int typeSortHelper(Type type1, Type type2){
  if(type1 == type2){
    return 0;
  }

  if(type2 is List){
    type2 = List;
  }

  switch(type1){
    case int: return 1;
    case double:{
      int r;
      if(type2 == int){
        r= -1;
      }else{
        r= 1;
      }
      return r;
    }
    case String:{
      int r;
      if(type2 == int || type2 == double){
        r= -1;
      }else{
        r= 1;
      }
      return r;
    }
    case List:{
      int r;
      if(type2 == int || type2 == double || type2 == String){
        r= -1;
      }else{
        r= 1;
      }
      return r;
    }
    case Map:{
      int r;
      if(type2 == int || type2 == double || type2 == String || type2 == List){
        r= -1;
      }else{
        r= 1;
      }
      return r;
    }
  }

}

所以当我这样打电话时:

r1 = typeSortHelper([1,2,3].runtimeType, 2.runtimeType);

它应该给我-1,而不是给我null。

标签: flutterdart

解决方案


可悲的是,你还不能这样做。

因此,您在 2019 年(Dart 2.5)的实现将如下所示:

switch(smth.runtimeType){
  case int: return processInt(smth);
  case Uint8List: return process Uint8List(smth):
  default: if(smth is Map<String, dynamic>){
    processMapStringDynamic(smth);  
  } else if(smth is List<int>){
    processListInt(smth);
  } else throw('unimplemented for ${smth.runtimeType}');
}

推荐阅读