listSet<TData> static method
Create a mutation that optimistically updates an item in a list.
Automatically:
- Updates item in list immediately (optimistic update)
- Rolls back on error
- Supports offline queueing
Example:
final updatePost = ZenMutation.listSet<Post>(
queryKey: 'posts',
mutationFn: (post) => api.updatePost(post),
where: (item, updated) => item.id == updated.id,
);
Implementation
static ZenMutation<TData, TData> listSet<TData>({
required Object queryKey,
String? mutationKey,
required Future<TData> Function(TData item) mutationFn,
required bool Function(TData item, TData updated) where,
void Function(TData data, TData item, Object? context)? onSuccess,
void Function(Object error, TData item)? onError,
}) {
return ZenMutation<TData, TData>(
mutationKey: mutationKey ?? '${queryKey}_listSet',
mutationFn: mutationFn,
onMutate: (item) async {
final oldList =
ZenQueryCache.instance.getCachedData<List<TData>>(queryKey);
ZenQueryCache.instance.setQueryData<List<TData>>(
queryKey,
(old) => old?.map((i) => where(i, item) ? item : i).toList() ?? [],
);
return oldList;
},
onSuccess: (data, item, context) => onSuccess?.call(data, item, context),
onError: (err, item, context) {
if (context != null) {
ZenQueryCache.instance.setQueryData<List<TData>>(
queryKey,
(_) => context as List<TData>,
);
}
onError?.call(err, item);
},
);
}