gpt4 book ai didi

flutter - 仅基于Type实例在Dart中进行类型继承检查

转载 作者:行者123 更新时间:2023-12-03 03:39:49 27 4
gpt4 key购买 nike

给定Dart(Flutter)中的两个Type实例,是否可以确定一种类型是继承还是实现另一种类型?

final Type first = aTypeFromSomewhere;
final Type second = aTypeFromSomewhereElse;

// How can I determine if first inherits from second?

The Type class似乎没有任何功能。

最佳答案

您可以使用dart:mirrors来做到这一点:

import 'dart:mirrors';

class A {}

class B extends A {}

void main() {
final typeA = A().runtimeType;
final typeB = B().runtimeType;

final classMirrorA = reflectClass(typeA);
final classMirrorB = reflectClass(typeB);

print(classMirrorA.isSubclassOf(classMirrorB)); // false
print(classMirrorB.isSubclassOf(classMirrorA)); // true
}

使用 reflectable包可以做很多更复杂的事情(但受flutter支持)。该软件包有很多限制,使用起来并不是那么好。但是它可以在构建阶段构建所需的反射。

我制作了以下示例,该示例与之前的示例相同,但现在没有使用dart:mirrors:
import 'package:reflectable/reflectable.dart';
import 'main.reflectable.dart';

@MyReflectable()
class A {}

@MyReflectable()
class B extends A {}

class MyReflectable extends Reflectable {
const MyReflectable()
: super(typeRelationsCapability, superclassQuantifyCapability);
}

const myReflectable = const MyReflectable();

void main() {
initializeReflectable();

final typeA = A().runtimeType;
final typeB = B().runtimeType;

final classMirrorA = myReflectable.reflectType(typeA);
final classMirrorB = myReflectable.reflectType(typeB);

print(classMirrorA.isSubtypeOf(classMirrorB)); // false
print(classMirrorB.isSubtypeOf(classMirrorA)); // true
}

要使用此功能,您需要将以下依赖项添加到pubspec.yaml中:

reflectable: ^2.1.0
build_runner: ^1.6.0
build_runner_core: ^3.0.0

并运行以下命令(如果您反射(reflect)的类在bin中):

并非您要使用isSubtypeOf的所有类都需要具有自身以及使用“@MyReflectable()”指定的所有父类(super class),以便预编译器可以检测到它。
pub run build_runner build bin/

关于flutter - 仅基于Type实例在Dart中进行类型继承检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57846367/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com