Skip to content

fix(deps): update circuit to v0.35.1 - #954

Open
renovate[bot] wants to merge 1 commit into
developfrom
renovate/circuit
Open

fix(deps): update circuit to v0.35.1#954
renovate[bot] wants to merge 1 commit into
developfrom
renovate/circuit

Conversation

@renovate

@renovate renovate Bot commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

Package Change Age Confidence
com.slack.circuit:circuit-test 0.33.10.35.1 age confidence
com.slack.circuit:circuit-codegen 0.33.10.35.1 age confidence
com.slack.circuit:circuit-codegen-annotations 0.33.10.35.1 age confidence
com.slack.circuit:circuit-overlay 0.33.10.35.1 age confidence
com.slack.circuit:circuit-runtime 0.33.10.35.1 age confidence
com.slack.circuit:circuit-foundation 0.33.10.35.1 age confidence

Warning

Some dependencies could not be looked up. Check the Dependency Dashboard for more information.


Release Notes

slackhq/circuit (com.slack.circuit:circuit-test)

v0.35.1

Compare Source

2026-07-15

New
Pluggable Screen/PopResult persistence with CircuitSaver

Circuit's saveable back stacks no longer mandate how Screens and PopResults are persisted. A new
CircuitSaver abstraction in circuit-runtime-screen converts them to and from saveable
representations. Everything that saves navigation state (rememberSaveableBackStack,
rememberSaveableNavStack, and answering results) now accepts one.

This is the first step toward removing the Parcelable supertypes from Screen and PopResult on
Android in a future release. In 0.35, both types still need to be Parcelable even when using a
serializing saver or CircuitSaver.NoOp. The default saver preserves the current Parcelable
behavior. To prepare for the later removal, implement ParcelableScreen or ParcelablePopResult
on types that should remain Parcelable, or adopt a serializing saver.

Configure a saver by passing it explicitly, providing LocalCircuitSaver at your app root via
ProvideCircuitSaver, or with Circuit.Builder.setCircuitSaver (reaches only content inside
CircuitCompositionLocals).

New artifacts: circuit-serialization and circuit-serialization-reflect

For kotlinx-serialization users, the new circuit-serialization artifact persists @Serializable
screens and pop results to SavedState via androidx.savedstate:

  • SerializableCircuitSaver(configuration): KMP-friendly; register screens and results for
    polymorphic serialization against CircuitSaveable in the SavedStateConfiguration's
    serializersModule.
  • ReflectiveSerializableCircuitSaver(configuration) (in the JVM/Android-only
    circuit-serialization-reflect artifact): resolves serializers reflectively with no registration
    needed. It embeds the R8/ProGuard rules it needs, so minified apps need no additional
    Circuit-specific rules.

Both savers can restore navigation state saved by Circuit 0.34's default saver. They restore
leniently: records that no longer decode, such as after an app update removed a screen, are dropped
rather than crashing. Pass an onRestoreError callback to observe drops. The bottom-navigation
sample demonstrates the kotlinx setup end to end.

Also new:

  • ParcelableScreen/ParcelablePopResult: common interfaces that add Parcelable on Android.
    Migrate common-code values to these to keep using the Parcelable strategy once Screen and
    PopResult drop their Parcelable supertypes.
  • CircuitSaver.NoOp: disables navigation state persistence entirely.
circuit-retained is migrating to upstream retained APIs

Compose recently introduced a retain API, which is essentially a first-party solution for what circuit-retained has long offered. While it's not fully ready to replace all the things circuit-retained covered, most of the core functionality is there. As such, we are beginning to wind down circuit-retained in favor of the first-party solution where it makes sense.

This will a multi-phase migration over multiple releases, starting with initial interop in this release to allow making circuit-retained run on top of the first-party retain APIs under the hood. This allows for testing use without migrating anything in your codebase.

  • Setting CircuitRetainedSettings.useFirstParty = true (before the first composition) backs lifecycleRetainedStateRegistry() with a root-level retain call instead of a Circuit-managed ViewModel, delegating configuration-change survival to the RetainedValuesStore installed in the composition.
  • All rememberRetained/rememberRetainedSaveable semantics are unchanged.
  • First-party retain {} can be used directly in presenters and UIs alongside rememberRetained. In navigated content, retained values follow their record's lifetime.

See the circuit-retained README for more details.

Deprecated
  • SaveableBackStack.Record.args and SaveableBackStack.push(screen, args). Pass data through the Screen itself instead; args will be removed in a future release. This matches what the new SaveableNavStack already does.
  • The Saver vals on SaveableBackStack, SaveableNavStack, and AnsweringResultHandler companions. Use the Saver(CircuitSaver) functions instead.
Fixed
  • Fixed saveable stacks restoring empty when every record is dropped. Saveable nav stacks now
    discard incomplete forward history and fall back to their initial value if the active screen or
    its back history cannot be restored.
  • Fixed stored back-stack snapshots being partially restored or associated with a different root
    when one of their records cannot be restored.
  • Fixed awaitResult suspending indefinitely when a pending pop result cannot be saved or restored.
  • SubCircuit: Fix subcircuit-codegen Metro mode (subcircuit.codegen.mode=metro). It previously
    required Dagger's @AssistedFactory even in Metro mode, generated @javax.inject.Inject instead of
    Metro's @Inject, and referenced dev.zacsweers.metro.annotations.ContributesIntoSet (wrong package).
    Metro mode now accepts dev.zacsweers.metro.AssistedFactory and emits dev.zacsweers.metro.Inject +
    dev.zacsweers.metro.ContributesIntoSet, so generated factories compile against Metro.
Changed
  • SubCircuit: @SubCircuitInject is now handled by the main circuit-codegen processor.
    circuitx-subcircuit-codegen is now a relocation pointer to circuit-codegen, but prefer
    depending on circuit-codegen directly.
  • Update Android compileSdk to 37.
  • Update Compose Runtime to 1.11.4.
  • Update Dagger to 2.60.1.
Contributors

Special thanks to the following contributors for contributing to this release!

v0.35.0

Compare Source

2026-07-15

Ignore this release, we goofed and it didn't include regenerated baseline profiles! Use 0.35.1.

v0.34.0

Compare Source

2026-05-09

New
SubCircuit

SubCircuit is a lightweight version of Circuit for rendering nested presenter/UI pairs that delegate events to an outer component rather than handling navigation themselves. Use it for nested, reusable UI components that don't need direct navigation access, and need to delegate cross-cutting concerns (navigation, dialogs) to a parent. See the SubCircuit docs for more info!

Artifacts

  • circuitx-subcircuit — core types (SubScreen, SubPresenter, SubUi, SubCircuitContent).
  • circuitx-subcircuit-codegen — KSP @​SubCircuitInject to wire presenter and UI factories into the DI graph. Supports Anvil (default) and Metro.
  • circuitx-subcircuit-test — a .test {} extension for SubPresenters, built on Molecule and Turbine.
Fixes
  • SaveableNavStack - isRecordReachable() off-by-one where depth of 0 didn't check the current record
  • SaveableBackStack — Update isRecordReachable() to match SaveableNavStack behaviour
  • [codegen] Propagate qualifier annotations from @CircuitInject declarations to generated factories.
Changes
  • Breaking: Moved NavDecoration from backstack to circuit-foundation and added a Navigator parameter to DecoratedContent. AnimatedNavDecorator now has an updateNavigator method to receive the new Navigator parameter. This gives decorations direct access to the correct Navigator for handling back gestures.
  • Breaking: Add GestureNavigationEventListener and an optional listener parameter to GestureNavigationDecorationFactory, for observing the back gesture lifecycle (e.g. analytics). It's observational only, the Navigator still drives the pop.
  • SaveableNavStack & SaveableBackStack - Made the Savers public apis
  • [codegen] Function-based @CircuitInject declarations now treat any non-circuit-provided parameter as an injected dependency across all modes. The generated factory accepts it as a provider (Provider<T> for Dagger/Anvil/Hilt, () -> T for kotlin-inject and Metro) and invokes it once at create() time, hoisted above the composable presenterOf { } / ui { } block so it isn't re-invoked on every recomposition. Parameters already declared as Provider<T> or Lazy<T> are passed through as-is rather than re-wrapped. In metro and kotlin-inject modes, () -> T is also passed through; in Dagger/Anvil/Hilt modes it is treated as a regular dependency.
  • [codegen] @CircuitInject-annotated classes must now be injectable — annotate the class or a constructor with @Inject. Previously, classes without @Inject silently generated a direct constructor call that could fail to compile.
  • [codegen/metro] Generate function providers when Metro mode is enabled. Note this requires enableFunctionProviders to be set enabled, which will be the default in Metro 1.0.0.
Misc:
  • Kotlin 2.4.0
  • Compose 1.11.0
  • Migrate to AGP 9
  • Remove deprecated X64 Apple targets.
  • [samples] Added a composite presenter Inbox sample
  • [samples] Add iOS support to STAR sample
Contributors

Special thanks to the following contributors for contributing to this release!


Configuration

📅 Schedule: (in timezone Asia/Kolkata)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about these updates again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate
renovate Bot force-pushed the renovate/circuit branch from 51a4007 to c52fbfd Compare July 2, 2026 03:10
@renovate
renovate Bot force-pushed the renovate/circuit branch from c52fbfd to 557df4e Compare July 16, 2026 04:07
@renovate renovate Bot changed the title fix(deps): update circuit to v0.34.0 fix(deps): update circuit to v0.35.1 Jul 16, 2026
@renovate
renovate Bot force-pushed the renovate/circuit branch from 557df4e to b01f2a2 Compare July 17, 2026 11:40
@renovate
renovate Bot force-pushed the renovate/circuit branch from b01f2a2 to 7264e23 Compare July 21, 2026 02:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant