getFieldValueByFullPath method
Получить значение поля объекта в том числе, можно обращаться к полям вложенных объектов через точку Например. 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;
}
}