loadDataAndReferences method
Future<List>
loadDataAndReferences(
- Map response,
- List<
String> loadReference, - String tag, {
- NsgDataRequestParams? filter,
Загружает данные из response, представляющего из себя Map. основные объекты лежат в results, кэшируемые по названию полей основного объекта
Implementation
Future<List> loadDataAndReferences(Map response, List<String> loadReference, String tag, {NsgDataRequestParams? filter}) async {
var maps = response as Map<String, dynamic>;
//Новые основные элементы
var newItems = <NsgDataItem>[];
//Все новые элементы, включая дочитанные объекты для поиска строк табличных частей
var allItems = <NsgDataItem>[];
var useCache = (filter == null || filter.fieldsToRead == null || filter.fieldsToRead!.isEmpty);
maps.forEach((name, data) {
if (name == '_results_' || name == 'results') {
newItems = _fromJsonList(data);
allItems.addAll(newItems);
if (newItems.isNotEmpty && filter != null && filter.fieldsToRead != null && filter.fieldsToRead!.isNotEmpty) {
//Проставить полям из списка признак того, что она пустые - не прочитаны с БД
for (var fieldName in newItems.first.fieldList.fields.keys) {
if (filter.fieldsToRead!.contains(fieldName)) continue;
for (var item in newItems) {
item.setFieldEmpty(fieldName);
}
}
}
//А если там уже есть такой же элемент с ранее дочитанными полями?
if (useCache) {
NsgDataClient.client.addItemsToCache(items: newItems, tag: tag);
}
} else if (name == 'resultsCount') {
totalCount = int.tryParse(data);
} else {
// var foundField = NsgDataClient.client.getReferentFieldByFullPath(dataItemType, name);
// if (foundField != null) {
// var refItems = <NsgDataItem>[];
// data.forEach((m) {
// if (foundField is NsgDataUntypedReferenceField) {
// // var elem = NsgDataClient.client.getNewObject(foundField.referentElementType!);
// // elem.fromJson(m as Map<String, dynamic>);
// // refItems.add(elem);
// } else {
// var elem = NsgDataClient.client.getNewObject(foundField.referentElementType);
// elem.fromJson(m as Map<String, dynamic>);
// refItems.add(elem);
// }
// });
// allItems.addAll(refItems);
// if (foundField is NsgDataReferenceListField) {
// for (var tabItem in refItems) {
// var ownerItem = allItems.firstWhere((e) => tabItem.ownerId == e.id);
// foundField.addRow(ownerItem, tabItem);
// }
// } else {
// if (useCache) {
// NsgDataClient.client.addItemsToCache(items: refItems, tag: tag);
// }
// }
// } else
{
if (name.isNotEmpty) {
name = name.replaceRange(0, 1, name.substring(0, 1).toUpperCase());
}
if (NsgDataClient.client.isRegisteredByServerName(name)) {
var refItems = <NsgDataItem>[];
data.forEach((m) {
var elem = NsgDataClient.client.getNewObject(NsgDataClient.client.getTypeByServerName(name));
elem.fromJson(m as Map<String, dynamic>);
elem.state = NsgDataItemState.fill;
refItems.add(elem);
});
if (useCache) {
NsgDataClient.client.addItemsToCache(items: refItems, tag: tag);
}
} else {
debugPrint('ERROR: $dataItemType.$name not found');
}
}
}
});
await loadAllReferents(newItems, loadReference, tag: tag);
return newItems;
}