triggerCustomQuery method Null safety

Future triggerCustomQuery(
  1. {Option? options}
)

can be used to execute queries for the dependent/watcher components.

Implementation

Future triggerCustomQuery({Option? options}) async {
  // Generate query again after resetting changes
  final generatedQuery = this._generateQuery();
  if (generatedQuery.requestBody.length != 0) {
    if (isEqual(this._query, generatedQuery.requestBody)) {
      return Future.value(true);
    }
    // set the request loading to true for all the requests
    generatedQuery.orderOfQueries.forEach((id) {
      final componentInstance = this._parent!.getSearchWidget(id);
      if (componentInstance != null) {
        // Reset `from` and `after` values
        componentInstance.setFrom(0,
            options: new Options(
                triggerDefaultQuery: false,
                triggerCustomQuery: false,
                stateChanges: true));
        componentInstance.setAfter(null,
            options: new Options(
                triggerDefaultQuery: false,
                triggerCustomQuery: false,
                stateChanges: true));
        componentInstance._setRequestStatus(RequestStatus.PENDING,
            options: options);
        // Update the query
        componentInstance._updateQuery();
      }
    });
    try {
      // Re-generate query after changes
      final finalGeneratedQuery = this._generateQuery();
      final results = await this._fetchRequest({
        'query': finalGeneratedQuery.requestBody,
        'settings': this.appbaseSettings?.toJSON()
      }, false);
      // Update the state for components
      finalGeneratedQuery.orderOfQueries.forEach((id) {
        final componentInstance = this._parent!.getSearchWidget(id);
        if (componentInstance != null) {
          componentInstance._setRequestStatus(RequestStatus.INACTIVE,
              options: options);

          // Reset value for dependent components after fist query is made
          // We wait for first query to not clear filters applied by URL params
          if (this.clearOnQueryChange && this._query != null) {
            componentInstance.setValue(null,
                options: new Options(
                    triggerDefaultQuery: false,
                    triggerCustomQuery: false,
                    stateChanges: true));
          }

          // Update the results
          final prev = componentInstance.results;
          // Collect results from the response for a particular component
          Map rawResults = results[id] != null ? results[id] : {};
          // Set results
          if (rawResults['hits'] != null) {
            componentInstance.results!.setRaw(rawResults);
            componentInstance._applyOptions(
                Options(stateChanges: options?.stateChanges),
                'results',
                prev,
                componentInstance.results);
          }

          if (rawResults['aggregations'] != null) {
            componentInstance._handleAggregationResponse(
                rawResults['aggregations'],
                options: new Options(stateChanges: options?.stateChanges),
                append: false);
          }
        }
      });
      return Future.value(results);
    } catch (e) {
      return _handleError(e);
    }
  }
  return Future.value(true);
}