通过可反射性以Dart中的字符串名称获取类的公共静态字段/属性的值

时间:2019-02-07 09:42:12

标签: reflection dart flutter dart-mirrors

说我有一堂课:

class Icons {
       static const IconData threesixty = IconData(0xe577, fontFamily: 'MaterialIcons');
 }

现在我有一个值为“ threesixty”的字符串变量:

String fieldName = "threesixty";

如何通过fieldName变量获取Icons类中的Threesixty的值?

我正在使用reflectable软件包,并且已经在混乱中使用了ClassMirrors的其他功能,但是不知道该怎么做。

2 个答案:

答案 0 :(得分:6)

您想要的内容需要使用反射。在颤动下,由于树木摇晃,不支持反射。摇树是从应用程序包(apk,ipa)中删除未使用的代码以减小程序包大小的过程。当使用反射时,所有代码都可以隐式使用,因此flutter无法知道要删除哪些代码,因此他们选择不支持反射(在dart上下文中为镜像)。 如果可能,您应该尝试通过继承解决问题,或者根据您的特定问题,尝试使用静态代码生成。

编辑:您可以像这样调用可反射的静态吸气剂;

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是可反射包生成的文件。

答案 1 :(得分:-1)

据我所知,除非使用镜像库,否则这是不可能的。

请参阅: Get access to an object's property using bracket notation in dart