Динамическое заполнение родительского поля в Dart

Я динамически создаю объекты из данных карты, заполняя поля для соответствия именам ключей. Проблема возникает, когда поля определены в родительском поле, где попытка установить значение в родительском поле приводит к ошибке:

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);
}

person Todd Chambery    schedule 05.01.2014    source источник


Ответы (2)


Вы должны использовать ObjectMirror для установки поля в вашем объекте. Ваш код пытается установить поле в 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);
}
person Alexandre Ardhuin    schedule 05.01.2014
comment
Есть ли способ получить все унаследованные поля без обхода иерархии? - person Todd Chambery; 05.01.2014
comment
Я думаю, вам нужно пройти через иерархию. - person Alexandre Ardhuin; 05.01.2014

Статические методы/поля не наследуются в Dart.
Здесь уже обсуждалось такое поведение.
Вы можете посмотреть ответ на этот вопрос в Dart, используя зеркала, как бы вы вызвали статический метод класса из экземпляра класса?

Если методы/поля, к которым вы пытаетесь получить доступ, не являются статическими, предоставьте больше кода (классы/объекты, о которых вы размышляете)

person Günter Zöchbauer    schedule 05.01.2014