bloom_framework 0.2.1
bloom_framework: ^0.2.1 copied to clipboard
An opinionated application framework and developer platform built on Dart and Flutter.
Changelog #
0.2.1 #
Fixed #
BloomEnvcrashed on first read of any unset key:get/getOrNull/getInt/getDouble/getBool/containsfell back tobool.hasEnvironment(key)with a runtimekey, but that constructor only accepts a compile-time constant — every call threwbool.hasEnvironment can only be used as a const constructorthe moment a requested key wasn't already loaded into the runtime map. Since routes commonly read config on their very first build, this could blank the initial frame. The dynamic dart-define fallback is removed; apps that need--dart-definevalues now seed them explicitly at boot via the newBloomEnv.loadDartDefines(...), using literal keys the same wayBloom.boot()already does forBLOOM_FLAVOR.- Scaffolded apps and the dev overlay showed a generic purple Material icon (
Icons.local_florist_rounded) instead of the Bloom brand mark: added a realBloomLogowidget that renders the actual five-petal gradient flower (matchingbloom-logo.tsx) and swapped it in across the CLI scaffold template, the dev inspector overlay, and both example apps.
0.2.0 #
Breaking #
- Canonical cache-key normalization:
BloomData.normalizeKeynow canonicalizes recursively —Mapsegments have their entries sorted, andIterablesegments are canonicalized element-wise. Keys whose map segments differed only by insertion order previously resolved to different cache slots and now correctly resolve to the same one. Any code that persisted or compared the raw output ofnormalizeKeymust be re-keyed.
Fixed #
- Invalidation reached only cached queries:
BloomData.invalidateQueriessignalled only queries that already held a cache entry, so a query that had never completed a successful fetch (still loading, or in the error state) was never notified. Callinginvalidate()on a failed query is now a working retry path. Prefix matching is evaluated on:segment boundaries, so['users']matches['users','detail','42']but not['usersettings','1']. - Garbage collection could deafen live queries: expired entries were evicted and their invalidation stream controllers closed without regard for active subscribers, permanently stopping a mounted query from receiving invalidations. Eviction now requires a zero listener count, and a controller is never closed while a listener is attached. The same guard now covers
getEntry(),getQueryData()andremoveEntry(), which each closed controllers as a side effect of reading or removing an expired entry.
Added #
BloomData.releaseListener(key): releases a listener slot acquired viaBloomData.onInvalidated(key).BloomQuery.dispose()calls it automatically, so it is only needed when subscribing toonInvalidateddirectly.
0.1.0 #
- Core Runtime & Boot Lifecycle: Single-call
Bloom.boot()with dependency injection container (inject<T>(),provideSingleton<T>()). - Signals State Management: High-performance fine-grained reactivity (
signal,computed,effect,batch,Watch,SignalBuilder). - Filesystem Routing: File-based route conventions (
index.dart,[id].dart,_layout.dartShellRoutes, route guards). - Bloom Data & Offline Engine: Stale-while-revalidate caching (
BloomData.query,BloomData.mutation), deduplication, TTL GC, andOfflineMutationQueue. - Native Architecture & Prebuild: Declarative native plugin integrations (
BloomPermissions,BloomSecureStorage,BloomNotifications,BloomCamera,BloomDeepLinks). - DevTools & Dev Server: UDP broadcast discovery on port 5354, visual DevTools overlay,
BloomNetworkInspectorwith request replay. - Full-Stack Server & SSR Engine:
BloomApiRouter,BloomRequest,BloomResponse, API route handlers, and middleware. - Observability & Error Telemetry: Automatic crash capture, breadcrumbs timeline, symbol packaging, and fingerprinting.
- Full-Stack Adapters: Official Supabase and Serverpod client & repository adapters.