requestLoading method

Future<void>? requestLoading({
  1. bool needMove = true,
  2. bool needCallback = true,
  3. Duration duration = const Duration(milliseconds: 300),
  4. Curve curve = Curves.linear,
})

make the footer enter loading state,and callback onLoading

Implementation

Future<void>? requestLoading({bool needMove = true, bool needCallback = true, Duration duration = const Duration(milliseconds: 300), Curve curve = Curves.linear}) {
  assert(position != null, 'Try not to call requestLoading() before build,please call after the ui was rendered');
  if (isLoading) return Future.value();
  StatefulElement? indicatorElement = _findIndicator(position!.context.storageContext, LoadIndicator);

  if (indicatorElement == null || _refresherState == null) return null;
  (indicatorElement.state as LoadIndicatorState).floating = true;
  if (needMove && _refresherState!.mounted) _refresherState!.setCanDrag(false);
  if (needMove) {
    return Future.delayed(const Duration(milliseconds: 50)).then((_) async {
      await position?.animateTo(position!.maxScrollExtent, duration: duration, curve: curve).then((_) {
        if (_refresherState != null && _refresherState!.mounted) {
          _refresherState!.setCanDrag(true);
          if (needCallback) {
            footerMode!.value = LoadStatus.loading;
          } else {
            footerMode!.setValueWithNoNotify(LoadStatus.loading);
            if (indicatorElement.state.mounted) (indicatorElement.state as LoadIndicatorState).setState(() {});
          }
        }
      });
    });
  } else {
    return Future.value().then((_) {
      footerMode!.value = LoadStatus.loading;
    });
  }
}