request method

  1. @override
Future request([
  1. String? x
])
override

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