获取 public static field/property 的 class 的值通过它的名称作为 dart 中的字符串通过 reflectable
Getting value of public static field/property of a class by it's name as string in dart via reflectable
假设我有一个 class:
class Icons {
static const IconData threesixty = IconData(0xe577, fontFamily: 'MaterialIcons');
}
现在我有一个字符串变量,值为 "threesixty":
String fieldName = "threesixty";
如何通过 fieldName 变量获取 Icons class 中的 threesixty 的值?
我正在使用 reflectable 包,并且已经在 flutter 中使用了 ClassMirrors 的其他功能,但不知道该怎么做。
据我所知,除非使用镜像库,否则这是不可能的。
参见:
你想要的需要使用反射。由于 tree shaking,不支持 flutter 反射。 Tree shaking 是从您的应用程序包(apk、ipa)中删除未使用的代码以减小包大小的过程。当使用反射时,所有代码都可以隐式使用,因此 flutter 无法知道要删除哪些代码部分,因此他们选择不支持反射(dart 上下文中的镜像)。
如果可能,您应该尝试使用继承来解决您的问题,或者根据您的具体问题,您可以尝试使用静态代码生成。
编辑:您可以像这样调用带有反射的静态 getter;
import 'package:reflectable/reflectable.dart';
class Reflector extends Reflectable {
const Reflector() : super(staticInvokeCapability);
}
const reflector = const Reflector();
@reflector
class ClassToReflect {
static double staticPropertyToInvoke = 15;
}
Main.dart
import 'package:reflectable/reflectable.dart';
import 'main.reflectable.dart';
void main() {
initializeReflectable();
ClassMirror x = reflector.reflectType(ClassToReflect);
var y = x.invokeGetter('staticPropertyToInvoke');
debugPrint(y);
}
P.S。 main.reflectable.dart是反射包生成的文件。
假设我有一个 class:
class Icons {
static const IconData threesixty = IconData(0xe577, fontFamily: 'MaterialIcons');
}
现在我有一个字符串变量,值为 "threesixty":
String fieldName = "threesixty";
如何通过 fieldName 变量获取 Icons class 中的 threesixty 的值?
我正在使用 reflectable 包,并且已经在 flutter 中使用了 ClassMirrors 的其他功能,但不知道该怎么做。
据我所知,除非使用镜像库,否则这是不可能的。
参见:
你想要的需要使用反射。由于 tree shaking,不支持 flutter 反射。 Tree shaking 是从您的应用程序包(apk、ipa)中删除未使用的代码以减小包大小的过程。当使用反射时,所有代码都可以隐式使用,因此 flutter 无法知道要删除哪些代码部分,因此他们选择不支持反射(dart 上下文中的镜像)。 如果可能,您应该尝试使用继承来解决您的问题,或者根据您的具体问题,您可以尝试使用静态代码生成。
编辑:您可以像这样调用带有反射的静态 getter;
import 'package:reflectable/reflectable.dart';
class Reflector extends Reflectable {
const Reflector() : super(staticInvokeCapability);
}
const reflector = const Reflector();
@reflector
class ClassToReflect {
static double staticPropertyToInvoke = 15;
}
Main.dart
import 'package:reflectable/reflectable.dart';
import 'main.reflectable.dart';
void main() {
initializeReflectable();
ClassMirror x = reflector.reflectType(ClassToReflect);
var y = x.invokeGetter('staticPropertyToInvoke');
debugPrint(y);
}
P.S。 main.reflectable.dart是反射包生成的文件。