【问题标题】:Getting value of public static field/property of a class by it's name as string in dart via reflectable通过可反射的 dart 中的字符串的名称获取类的公共静态字段/属性的值
【发布时间】:2019-02-07 09:42:11
【问题描述】:

假设我有一堂课:

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

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

String fieldName = "threesixty";

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

我正在使用 reflectable 包,并且已经在 Flutter 中使用过 ClassMirrors 的其他功能,但不知道如何执行此操作。

【问题讨论】:

    标签: reflection dart flutter dart-mirrors


    【解决方案1】:

    你想要的需要使用反射。由于树抖动,不支持颤振反射。摇树是从您的应用程序包(apk、ipa)中删除未使用的代码以减小包大小的过程。当使用反射时,所有代码都可以隐式使用,因此颤振将无法知道要删除哪些代码部分,因此他们选择不支持反射(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);
    }
    

    附: main.reflectable.dart 是反射包生成的文件。

    【讨论】:

    • 我正在使用pub.dartlang.org/packages/reflectable 并使用了它的其他功能。我唯一想要的是如何使用镜子本身来做这件事只是假设我们没有使用颤振而且我并不关心包装大小
    • @SaeidRaei 这不是您要寻找的答案吗?
    • 是的,但仍然存在问题。我无法反映 Icons 类,因为我无法将 @reflector 注释添加到 Icons 类。我正在考虑扩展 Icons 类并使用我的扩展类来获取值,但无法做到。难道不能扩展这个类吗?
    • @Mertus 我最初投了反对票,因为您的原始答案不是答案
    • @SaeidRaei 我也尝试过这样做,但无法扩展 Icons 类://此类不打算实例化或扩展;这个构造函数 // 防止实例化和扩展。图标._();
    【解决方案2】:

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

    见: Get access to an object's property using bracket notation in dart

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-09
      • 1970-01-01
      • 1970-01-01
      • 2010-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多