5

我正在从地图数据动态创建对象,填充匹配键名的字段。当在父字段上定义字段时出现问题,尝试在父字段上设置值会产生错误:

No static setter 'name' declared in class 'Skill'.

  NoSuchMethodError : method not found: 'name'

代码:

class Resource {
  String name;
  String description;

  Resource.map(Map data)
  {
    ClassMirror c = reflectClass(runtimeType);
    ClassMirror thisType = c;
    while(c != null)
    {
      for (var k in c.declarations.keys) {
        print('${MirrorSystem.getName(k)} : ${data[MirrorSystem.getName(k)]}');
        if(data[MirrorSystem.getName(k)] != null)
        {
          thisType.setField(k, data[MirrorSystem.getName(k)]);        
        }
      }
      c = c.superclass;
    }
  }
}

class Skill extends Resource
{
  Skill.map(data) : super.map(data);
}
4

2 回答 2

5

您应该使用 aObjectMirror在对象上设置字段。您的代码尝试设置一个字段,在ClassMirror该字段上尝试定义一个静态变量

class Resource {
  String name;
  String description;

  Resource.map(Map data)
  {
    ObjectMirror o = reflect(this);  // added
    ClassMirror c = reflectClass(runtimeType);
    ClassMirror thisType = c;
    while(c != null)
    {
      for (var k in c.declarations.keys) {
        print('${MirrorSystem.getName(k)} : ${data[MirrorSystem.getName(k)]}');
        if(data[MirrorSystem.getName(k)] != null)
        {
          // replace "thisType" with "o"
          o.setField(k, data[MirrorSystem.getName(k)]);
        }
      }
      c = c.superclass;
    }
  }
}

class Skill extends Resource
{
  Skill.map(data) : super.map(data);
}
于 2014-01-05T14:06:49.247 回答
3

Dart 中不继承静态方法/字段。
这里已经有一些关于这种行为的讨论。
你可以看看Dart 中这个问题的答案,使用 Mirrors,你会如何从类的实例中调用类的静态方法?

如果您尝试访问的方法/字段不是静态的,请提供更多代码(您正在反映的类/对象)

于 2014-01-05T13:57:33.407 回答