Repository navigation
codelessly_sdk 7.0.0: Flutter 3.47, codelessly_api 5 and stability fixes - #59
Merged
Merged
Conversation
The SDK no longer resolved on current Dart: codelessly_json_serializable needs the removed _macros package. Switch to json_annotation and json_serializable, depend on codelessly_api ^5.0.0 (overridden to the API's development branch until it is published), and upgrade the remaining dependencies to their latest majors. - EquatableMixin -> Equatable (equatable 3). - Import DateTimeConverter from codelessly_api. - Drop a `final` parameter modifier that Dart 3.13 rejects. - Map the enum values added in codelessly_api 5 to their Flutter counterparts, including FilledButton and RoundedSuperellipseBorder. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
- ListView/GridView: cacheExtent -> scrollCacheExtent (ScrollCacheExtent.pixels). - Radio: manage the group through RadioGroup instead of the deprecated Radio.groupValue/onChanged. - Slider: ShowValueIndicator.always -> onDrag. - Switch: activeColor -> activeThumbColor. - Color: red/green/blue/alpha/opacity/value -> r/g/b/a/toARGB32. - Await Hive writes inside try so storage failures are caught and logged instead of escaping. - Apply dart fix and remove an unused constant; flutter analyze now reports no issues. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
- Radio, Slider, ListTile, CircularProgressIndicator, ExpansionTile and Text now render the parameters added in codelessly_api 5. - Slider track and value indicator shapes are mapped exhaustively; the gapped track, drop and rounded rectangle indicators used to fall back to other shapes. The gapped track also needs SliderThemeData.trackGap, without which Flutter asserts. - ScopedValues.of left a late field unset when no CodelesslyContext was in the tree, so any node widget built outside a layout threw a LateInitializationError. - Add widget smoke tests for the radio and every slider shape. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
dart.library.html is false when compiling to Wasm, so the conditional export fell back to the stub and web views never rendered there. Check dart.library.js_interop, which is true for both JS and Wasm builds. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
Auth - Windows decoded IdTokenResult.toString() instead of the token, so claim checks always failed there. - Waiting for project claims had no timeout and ignored errors from getIdTokenResult, so authentication could hang forever. Wait at most 30s and propagate errors. - reset() after dispose added to a closed stream; authenticate() force-unwrapped a missing token. - Stop logging the project auth token and the auth response body. Data - A publish model stream error never completed the first-event future, so initialization waited forever (e.g. on a permission error). - Background bundle refreshes and onLoad API calls failed as unhandled async errors; report them instead. - Cloud variables kept every previous Firestore listener alive, so older queries overwrote newer results. Keep one listener per variable. - Read font bytes with ByteData.sublistView. Widgets - CodelesslyWidget.didUpdateWidget threw when an explicit context was removed, adopted (and later disposed) the caller's controller when it was removed, wrote notifiers after unmount, and threw on a missing breakpoint. - Non-blocking reactions' errors escaped as uncaught errors; a failing blocking action now stops its chain and is reported. - PageView jumped before its controller had clients; TabBar asserted when tabs shrank below the initial index; Accordion ignored isExpanded, inverted enabled, and threw with fewer than two children. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
Icons other than Material icons had no source and requested
SvgPicture.network(''), so they never showed; two-tone Material icons
built "materialiconstwo tone" into their URL.
- Material Symbols load Google's prebuilt SVGs, with fill, weight, grade
and optical size from the icon model snapped to the published variants
(verified against fonts.gstatic.com).
- Cupertino icons render from the cupertino_icons font through a
generated const map from codepoint to CupertinoIcons, which keeps icon
tree shaking working for apps (tool/generate_cupertino_icons.py).
- Icons without any source render an empty box instead of a failing
network request.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
Layouts render with a default ThemeData and no text scaling so they match the editor. Add CodelesslyConfig.useHostTheme and maxTextScaleFactor so apps can follow their own theme and, within a bound, the platform text size. The dropdown now extends the surrounding theme instead of replacing it. CodelesslyConfig.copyWith also dropped debugLog and accepted an unused staggerDownloadQueue argument. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
- Web views loaded their source once, so URLs bound to variables never updated. Reload when the resolved source changes. - TabBar ignored showDivider. - Replace print calls in library code with DebugLogger, so output follows the debugLog setting. ConditionPrinter.prettify no longer prints as a side effect. - Remove the font parser's main() CLI from the public library, which also took dart:io out of it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
- Text, divider, loading indicator and web view links called launchUrl(Uri.parse(...)), which threw on malformed URLs and left launch failures unhandled. Route them through FunctionsRepository.openLink. - LocalDatabase and CodelessCacheManager closed their Hive boxes in `void dispose() async`, so close failures were unhandled; report them. - Remove the unused uuid, intl and path_provider dependencies. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
SvgPicture.network had no errorBuilder in icons, SVG icon images and the image builder, so an offline or broken SVG reported an error instead of leaving its space empty (or showing the image error builder). Add widget tests that build thirteen node types through the real PassiveNodeTransformerManager, including an accordion with no children. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
README: the crash-report option is automaticallySendCrashReports and defaults to false; CodelesslyWidget takes publishSource, not isPreview; fix the functions snippets; document useHostTheme and maxTextScaleFactor; drop an embedded token; use absolute image URLs so they render on pub.dev. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
The API changes are merged (Codelessly/CodelesslyAPI#34). Keep the git override until codelessly_api 5.0.0 is published to pub.dev. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
5.0.0 is published, so drop the git dependency_overrides from the package and the example. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
- AuthManager: Windows reads claims from the token, postAuthSuccess completes when the claim arrives, and times out or fails instead of hanging. The claims wait is now a constructor parameter so tests do not wait 30 seconds. - DataManager: a publish model stream error fails listenToPublishModel instead of hanging. - FirestoreCloudDatabase: a new query replaces the variable's previous listener and reset() cancels them all. Each test fails against the code before its fix. The Firebase fakes are hand-written because fake_cloud_firestore and firebase_auth_mocks still require equatable 2. Export DebugLogger and ErrorLogger: DataManager's public constructor takes an ErrorLogger that apps could not name. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
callFunction discarded the app function's result, so a blocking Call Function action never waited for an async function before the next action ran, and its errors went uncaught. Return the result so the action chain awaits it and reports failures. triggerAction also catches synchronous throws from performAction now. Tests cover ordering, a failing function stopping the chain, and a failing non-blocking function letting it continue; all three fail on the previous code. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
The embedded video transformer imported webview_flutter_wkwebview and webview_flutter_android directly, pulling dart:io into web builds and making the package incompatible with WebAssembly by pub.dev's analysis. Move the platform-specific controller setup behind a conditional import, as the web view transformer already does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
pub.dev deducts static analysis points for unformatted files; 90 files predated the Dart 3.7 formatter style. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
rayliverified
added a commit
that referenced
this pull request
Oct 13, 2026
…xes (#59) Upgrade to Flutter 3.47 / Dart 3.13 and codelessly_api 5.0.0 (pub.dev), replacing the forked JSON codegen and deprecated Flutter APIs. Fix auth and startup hangs, Firestore listener leaks, uncaught action errors, Call Function actions not awaiting app functions, and widget lifecycle crashes. Render Material Symbols, Cupertino and two-tone icons and every codelessly_api 5 parameter; add opt-in host theme and text scaling. Fully WebAssembly-compatible (pana 160/160). 34 tests and CI covering format, analyze, tests and a Wasm build.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Brings the SDK up to Flutter 3.47 / Dart 3.13 and codelessly_api 5.0.0 (Codelessly/CodelesslyAPI#34, merged), fixes the crashes and hangs found in an audit, and adds tests and CI.
Toolchain and dependencies
json_annotation/json_serializablereplace the forked codegen, which no longer resolves on current Dart.uuid,intlandpath_providerremoved.scrollCacheExtent,RadioGroup,ShowValueIndicator.onDrag, SwitchactiveThumbColor, and the newColorcomponent accessors.dart.library.js_interop).Fixes
CodelesslyWidget.didUpdateWidgetand in PageView, TabBar and Accordion edge cases.ScopedValues.ofthrew outside aCodelesslyContext.Rendering
showDivider.New options
CodelesslyConfig.useHostThemeandmaxTextScaleFactor, both opt-in. The defaults keep layouts looking exactly as designed in the editor.Tests, docs and CI
flutter analyze,flutter test, and a WebAssembly web build of the example.Before publishing
codelessly_apiresolves through a gitdependency_overrideson CodelesslyAPImaster, inpubspec.yamlandexample/pubspec.yaml. Publish codelessly_api 5.0.0, remove both overrides, then publish 7.0.0.Testing
flutter analyze: no issues (lib, test, example).flutter test: 22 passing.flutter build web --wasmof the example passes, locally and in CI.🤖 Generated with Claude Code
https://claude.ai/code/session_01A67XoQYsLVvoMtiKcXXUxY
Generated by Claude Code