getOrOpen<R> method

Mutation<R> getOrOpen<R>(
  1. MutationKey<R> key, {
  2. MutationInitialDataCallback<R>? initialData,
  3. MutationMutateCallback<R>? initialMutate,
  4. MutationOnUpdateDataCallback<R>? onUpdateData,
  5. MutationOnUpdateErrorCallback? onUpdateError,
  6. MutationOnUpdateInitializedCallback? onUpdateInitialized,
  7. MutationOnUpdateLoadingCallback? onUpdateLoading,
  8. MutationOnOpenCallback<R>? onOpen,
  9. MutationOnCloseCallback<R>? onClose,
  10. List<MutationKey<R>> observeKeys = const [],
})

Implementation

Mutation<R> getOrOpen<R>(MutationKey<R> key,
    {MutationInitialDataCallback<R>? initialData,
    MutationMutateCallback<R>? initialMutate,
    MutationOnUpdateDataCallback<R>? onUpdateData,
    MutationOnUpdateErrorCallback? onUpdateError,
    MutationOnUpdateInitializedCallback? onUpdateInitialized,
    MutationOnUpdateLoadingCallback? onUpdateLoading,
    MutationOnOpenCallback<R>? onOpen,
    MutationOnCloseCallback<R>? onClose,
    List<MutationKey<R>> observeKeys = const []}) {
  var mutation = _data[key] as Mutation<R>?;
  if (mutation == null) {
    mutation = Mutation<R>(key,
        initialData: initialData,
        initialMutate: initialMutate,
        onUpdateData: onUpdateData,
        onUpdateError: onUpdateError,
        onUpdateInitialized: onUpdateInitialized,
        onUpdateLoading: onUpdateLoading,
        onClose: onClose);

    _onEventMapListMap[EventKey.OPEN]?[key]?.forEach((e) {
      final res = e(mutation);
      if (res != null) {
        final cancelFunc = mutation!.observe(
            onClose: (mutation) {
              res();
            },
            attach: false);
        _getOrNewInitialFunctionList(key).add(cancelFunc);
      }
    });
    for (var observeKey in observeKeys) {
      _onEventMapListMap[EventKey.OPEN]?[observeKey]?.forEach((e) {
        final res = e(mutation);
        if (res != null) {
          final cancelFunc = mutation!.observe(
              onClose: (mutation) {
                res();
              },
              attach: false);
          _getOrNewInitialFunctionList(key).add(cancelFunc);
        }
      });
    }
    if (onOpen != null) {
      final res = onOpen(mutation);
      if (res != null) {
        final cancelFunc = mutation.observe(
            onClose: (mutation) {
              res();
            },
            attach: false);
        _getOrNewInitialFunctionList(key).add(cancelFunc);
      }
    }
    final cancelFunc = mutation.observe(
        onUpdateData: (data, {before}) {
          _onUpdateData(key, data, before: before);
          for (var observeKey in observeKeys) {
            _onUpdateData(observeKey, data, before: before);
          }
        },
        onUpdateError: (error, {before}) {
          _onUpdateError(key, error, before: before);
          for (var observeKey in observeKeys) {
            _onUpdateError(observeKey, error, before: before);
          }
        },
        onUpdateInitialized: () {
          _onUpdateInitialized(key);
          for (var observeKey in observeKeys) {
            _onUpdateInitialized(observeKey);
          }
        },
        onUpdateLoading: (loading) {
          _onUpdateLoading(key, loading);
          for (var observeKey in observeKeys) {
            _onUpdateLoading(observeKey, loading);
          }
        },
        onClose: (mutation) {
          _onClose(key, mutation);
          for (var observeKey in observeKeys) {
            _onClose(observeKey, mutation);
          }
        },
        attach: false);
    _getOrNewInitialFunctionList(key).add(cancelFunc);
    _data[key] = mutation;
    _retainCount[key] = 0;
  }
  return mutation;
}