handleContexts method

ObserverHandleContextsResultModel<GridViewObserveModel>? handleContexts({
  1. bool isForceObserve = false,
  2. bool isFromObserveNotification = false,
  3. bool isDependObserveCallback = true,
  4. bool isIgnoreInnerCanHandleObserve = true,
})
inherited

Handle all buildContext

Implementation

ObserverHandleContextsResultModel<M>? handleContexts({
  bool isForceObserve = false,
  bool isFromObserveNotification = false,
  bool isDependObserveCallback = true,
  bool isIgnoreInnerCanHandleObserve = true,
}) {
  if (!isIgnoreInnerCanHandleObserve) {
    if (!innerCanHandleObserve) return null;
    updateInnerCanHandleObserve();
  }

  final isForbidObserveCallback =
      widget.sliverController?.isForbidObserveCallback ?? false;
  final onObserve = isForbidObserveCallback ? null : widget.onObserve;
  final onObserveAll = isForbidObserveCallback ? null : widget.onObserveAll;
  if (isDependObserveCallback) {
    if (onObserve == null && onObserveAll == null) return null;
  }

  final isHandlingScroll =
      widget.sliverController?.innerIsHandlingScroll ?? false;
  if (isHandlingScroll) return null;

  List<BuildContext> ctxs = fetchTargetSliverContexts();

  Map<BuildContext, M> resultMap = {};
  Map<BuildContext, M> changeResultMap = {};
  M? changeResultModel;
  for (var i = 0; i < ctxs.length; i++) {
    final ctx = ctxs[i];
    final targetObserveModel = handleObserve(ctx);
    if (targetObserveModel == null) continue;
    resultMap[ctx] = targetObserveModel;

    if (isForceObserve ||
        widget.triggerOnObserveType ==
            ObserverTriggerOnObserveType.directly) {
      changeResultMap[ctx] = targetObserveModel;
    } else {
      final lastResultModel = lastResultMap[ctx];
      if (lastResultModel == null) {
        changeResultMap[ctx] = targetObserveModel;
      } else if (lastResultModel != targetObserveModel) {
        changeResultMap[ctx] = targetObserveModel;
      }
    }

    // Getting observed result for first listView.
    if (i == 0 && changeResultMap[ctx] != null) {
      changeResultModel = changeResultMap[ctx];
    }
  }

  lastResultMap = resultMap;

  if (isDependObserveCallback &&
      onObserve != null &&
      changeResultModel != null) {
    onObserve(changeResultModel);
  }

  if (isDependObserveCallback &&
      onObserveAll != null &&
      changeResultMap.isNotEmpty) {
    onObserveAll(changeResultMap);
  }

  return ObserverHandleContextsResultModel(
    changeResultModel: changeResultModel,
    changeResultMap: changeResultMap,
  );
}