getFieldValueByFullPath method

dynamic getFieldValueByFullPath(
  1. String fullPath
)

Получить значение поля объекта в том числе, можно обращаться к полям вложенных объектов через точку Например. playerId.clubId.name Возвращает значение поля, если оно существует, если нет - возвращает null В случае, если в чепочке полей не последнее поле будет отличаться от типа NsgDataReferenceField, будет возвращен null

Implementation

dynamic getFieldValueByFullPath(String fullPath) {
  var splitedPath = fullPath.split('.');
  dynamic curObject = this;
  NsgDataField? curField;
  var foundFieldName = '';
  var foundFullPath = '';
  for (var i = 0; i < splitedPath.length; i++) {
    if (foundFullPath.isEmpty) {
      foundFullPath = splitedPath[i];
    } else {
      foundFullPath += '.' + splitedPath[i];
    }
    if (curField == null) {
      curObject = this;
    } else {
      //getReferent вернет либо объект, либо Exception по умолчанию
      if (curField is NsgDataReferenceField) {
        curObject = curField.getReferent(curObject)!;
      } else if (curField is NsgDataReferenceListField) {
        //curObject = curField.getReferent(curObject)!;
        foundFieldName = splitedPath[i];
        //Если это табличная часть, то она должна быть последняя в списке. Иначе, придется перебирать все элементы, удовлетворяющие условию
        //Возможно, можно и для этого случая собрать все вложенные элементы, но мне кажется это излишним, лучше правильно писать запросы
        assert(i == splitedPath.length - 1, 'NsgDataReferenceListField type field can be last only');
        break;
      } else {
        throw Exception('Field $foundFullPath not found in object $this');
      }
    }
    var fieldList = curObject.fieldList;
    if (fieldList.fields.containsKey(splitedPath[i])) {
      foundFieldName = splitedPath[i];
      curField = curObject.fieldList.fields[foundFieldName];
    }
  }
  if (curField != null) {
    return curObject[foundFieldName];
  } else {
    return null;
  }
}