hydrate static method

void hydrate(
  1. Map<String, dynamic> dehydratedState, {
  2. dynamic deserialize(
    1. dynamic data,
    2. List key
    )?,
})

Restores cache records from a dehydratedState Map into the BloomData cache.

Reconstitutes QueryCacheEntry instances with their original timestamps, stale times, cache times, and stale flags. Freshly hydrated entries are immediately recognized as fresh by BloomQuery and BloomInfiniteQuery, starting in QueryStatus.success with data present and avoiding redundant SSR double-fetches.

Supply deserialize to convert raw JSON values back into domain models.

BloomData.hydrate(
  dehydratedMap,
  deserialize: (rawJson, key) {
    if (key.first == 'todos') {
      return (rawJson as List).map((e) => Todo.fromJson(e as Map<String, dynamic>)).toList();
    }
    return rawJson;
  },
);

See also:

  • dehydrate, to capture the cache into a serializable structure.
  • hydrateFromJson, for direct hydration from a raw JSON string.

Implementation

static void hydrate(
  Map<String, dynamic> dehydratedState, {
  dynamic Function(dynamic json, List<dynamic> key)? deserialize,
}) {
  final queriesRaw = dehydratedState['queries'];
  if (queriesRaw is! List) return;

  for (final item in queriesRaw) {
    if (item is! Map) continue;
    final itemMap = Map<String, dynamic>.from(item);
    final key = itemMap['key'] as List<dynamic>?;
    if (key == null) continue;

    final rawData = itemMap['data'];
    final data = deserialize != null ? deserialize(rawData, key) : rawData;

    final updatedAtStr = itemMap['updatedAt'] as String?;
    final updatedAt = updatedAtStr != null
        ? DateTime.tryParse(updatedAtStr) ?? DateTime.now()
        : DateTime.now();

    final staleTimeMs = itemMap['staleTimeMs'] as int? ??
        itemMap['staleTime'] as int? ??
        300000;
    final cacheTimeMs = itemMap['cacheTimeMs'] as int? ??
        itemMap['cacheTime'] as int? ??
        1800000;
    final isStale = itemMap['isStale'] as bool? ?? false;

    final entry = QueryCacheEntry<dynamic>(
      key: key,
      data: data,
      updatedAt: updatedAt,
      staleTime: Duration(milliseconds: staleTimeMs),
      cacheTime: Duration(milliseconds: cacheTimeMs),
      isStale: isStale,
    );

    putEntry(entry);
  }
}