flutter 泛型runtimeType提供_Type而不是真实的类型

uttx8gqw  于 2023-02-25  发布在  Flutter
关注(0)|答案(2)|浏览(307)

我们正在处理一个遗留的API,其中API在某些情况下会返回一个与预期不同的类型。所以我希望在Map上有一些extion来检索属性或返回null。

extension Wrapper<T> on Map<String, dynamic> {
  T? property({required String key}) {
    final value = this[key];
    
    if (T.runtimeType == value.runtimeType) {
      return value;
    } 
    return null;
  }
}

使用方法:

final String? val2 = map.property(key: "bool");

问题是T.runtimeType给出的是_Type而不是String,我怎样才能得到真实的的属性类型呢?

eqqqjvef

eqqqjvef1#

发生这种情况是因为T本身已经是类型了。当你从Type调用runtimeType时,你会得到一个Type;
尝试使用类型中的toString()方法并比较值。
对于您的情况,我做了一些更改。将泛型从Wrapper<T>移动到方法属性:

extension Wrapper on Map<String, dynamic> {
  T? property<T>({required String key}) {
    final value = this[key];

    if (T.toString() == value.runtimeType.toString()) {
      return value as T;
    }
    return null;
  }
}

然后用你的类型和每个属性调用它:

map.property<int>(key: 'intKey');
map.property<String>(key: 'someString');

下一个案例运行良好:

Map<String, dynamic> map = {'str': 'Some string', 'int': 42, 'array': []};

assert(map.property<int>(key: 'int') == 42); // true
lmyy7pcs

lmyy7pcs2#

T已经是一个Type对象,因此您可以直接比较它:

T == value.runtimeType

注意,这样的相等性检查测试 * 确切 * 类型标识;如果一个类型是另一个类型的子类型,则它不会返回true。
如果您想检查value.runtimeType是否是T的子类型,则只需使用:

value is T

相关问题