useAsyncValueProvider<T> function

AsyncValueCached<T> useAsyncValueProvider<T>(
  1. ProviderBase<AsyncValue<T>> provider
)

Implementation

AsyncValueCached<T> useAsyncValueProvider<T>(
  ProviderBase<AsyncValue<T>> provider,
) {
  final context = useContext();
  final container = ProviderScope.containerOf(context);
  final cached = useState<AsyncValue<T>>(const AsyncLoading());

  useEffect(
    () {
      final sub = container.listen(
        provider,
        (_, AsyncValue<T> value) {
          if (value is AsyncData<T> || value is AsyncError) {
            cached.value = value;
          }
        },
        fireImmediately: true,
      );
      return sub.close;
    },
    [
      container,
      provider,
    ],
  );

  void refresh({bool reset = false}) {
    if (reset) {
      cached.value = const AsyncLoading();
    }
    container.refresh(provider);
  }

  return AsyncValueCached<T>(
    cached: cached.value,
    refresh: refresh,
  );
}