request method
Implementation
@override
Future request([String? x]) async {
//
// cancelando la consulta anterior
_currentTask?.cancel();
pendingForResult = true;
// preparando la consulta nueva
var tarea = _currentTask = AbortableTask((status) async {
// si esta en cualquier estado diferente a completado
// if (_state == SearchState.busy || _state == SearchState.started) return;
// trata el parametro search
args.search.resetTo(value: x ?? args.search.value);
args.offset.resetTo(value: 0);
// si se esta editando una tabla pasa el key
var e = edit;
if (e != null && e.source.parent != null) {
args.key.resetTo(value: e.source.parent?.get()['id']);
}
// si cancela antes de consultar
if (status.canceled) {
_currentTask = null;
return;
}
// almacenando el estado
var last = _state;
// actualizando el estado
_state = _state == SearchState.inactive
? SearchState.started
: SearchState.busy;
// realizando la consutal
var param = args.get();
// agrega uno al limite... para determinar si habra mas
param['limit']++;
List r = await app.request(urlForSearch.path, data: param);
// si se cancela despues de la consulta
if (status.canceled) {
_currentTask = null;
// recuperando el estado anterior
_state = last;
// deteniendo proceso
return;
}
// si no hay mas datos
if (r.isEmpty) {
_state = SearchState.noData;
} else if (r.length <= args.limit.value) {
_state = SearchState.noMore;
} else {
_state = SearchState.completed;
r.removeLast();
}
resetTo(value: r);
refresh();
if (scrollController.hasClients && scrollController.position.pixels > 0) {
scrollController.animateTo(0,
duration: const Duration(seconds: 1), curve: Curves.fastOutSlowIn);
}
pendingForResult = false;
trigger('request');
_currentTask = null;
pendingForResult = false;
});
tarea.onCancel(() async => null);
// inicia la tarea
tarea.done().catchError((e) => null);
}