Decompose

Kotlin Multiplatform lifecycle-aware business logic components (aka BLoCs) with routing (navigation) and pluggable UI (Jetpack Compose, SwiftUI, JS React, etc.)

APACHE-2.0 License

Stars
2K

Bot releases are hidden (Show)

Decompose - 3.2.0-beta01 Latest Release

Published by arkivanov about 1 month ago

  • Updated Kotlin to 2.0.20, Compose to 1.7.0-beta01, Essenty to 2.2.0-beta01 (#776)
  • Disable input during predictive back animation (#775)
  • Don't animate the previous child after predictive back gesture finished and stack popped (the new animation API) (#774)

Versions and dependencies

Kotlin: 2.0.20
Essenty: 2.2.0-beta01
kotlinx-serialization: 1.6.3
Multiplatform Compose: 1.7.0-beta01

Decompose - 3.2.0-alpha05

Published by arkivanov 2 months ago

  • Renamed PredictiveBackParams#animatableSelector parameter to animatable (the new animation API) (#762)
  • Make predictiveBackParams parameter a function instead of just a value (the new animation API) (#761)
  • Fixed a bug when predictive back gesture is interrupted (the new animation API) (#760)

Versions and dependencies

Kotlin: 2.0.10
Essenty: 2.2.0-alpha04
kotlinx-serialization: 1.6.3
Multiplatform Compose: 1.7.0-alpha02

Decompose - 3.2.0-alpha04

Published by arkivanov 2 months ago

  • Force javaTarget 11 for all non-Android JVM targets (#758)

The previous 3.2.0-alpha03 release has all non-Android JVM targets published with the target Java version 17. This release fixes the issue, all non-Android JVM targets now have target Java version 11 instead.

Versions and dependencies

Kotlin: 2.0.10
Essenty: 2.2.0-alpha04
kotlinx-serialization: 1.6.3
Multiplatform Compose: 1.7.0-alpha02

Decompose - 3.2.0-alpha03

Published by arkivanov 2 months ago

  • Added new experimental stack animation API with Shared Element Transitions support (#753)
  • Annotated StackNavigator#push as delicate API (#747)
  • Renamed Pages composable function to ChildPages, promoted all Child Pages API to stable (#756)
  • Updated Kotlin to 2.0.10, Compose to 1.7.0-alpha02, Essenty to 2.2.0-alpha03 (#750)

The new experimental animation API

This release adds a new artifact extensions-compose-experimental with a brand new API surface for stack animations with the support of Shared Element Transitions. Please see the updated docs for more information and examples.

Child Pages API is stable

The entire Child Pages API is now stable. The Pages composable function has been renamed to ChildPages, for consistency with the new ChildStack composable function from the new experimental animations.

Versions and dependencies

Kotlin: 2.0.10
Essenty: 2.2.0-alpha03
kotlinx-serialization: 1.6.3
Multiplatform Compose: 1.7.0-alpha02

Decompose - 3.2.0-alpha02

Published by arkivanov 3 months ago

  • Fixed "Key was used multiple times" crash with duplicateConfigurationsEnabled flag enabled (#734)
  • Updated Essenty to 2.2.0-alpha02 with new StateKeeper and InstanceKeeper extensions (#735)

New experimental StateKeeper and InstanceKeeper extensions

This release is based on Essenty 2.2.0-alpha02, which brings some new extensions for StateKeeper and InstanceKeeper:

  • StateKeeper.saveable(...) and StateKeeperOwner.saveable(...)
  • InstanceKeeperOwner.retainedInstance { ... }

Please see the update docs for saveable and retainedInstance.

Versions and dependencies

Kotlin: 2.0.0
Essenty: 2.2.0-alpha02
kotlinx-serialization: 1.6.3
Multiplatform Compose: 1.6.10

Decompose - 3.2.0-alpha01

Published by arkivanov 4 months ago

  • Allow duplicate configurations as an experimental feature (#731)

Experimental Duplicate Configurations feature

This release adds an experimental support of duplicate configurations in all navigation models. The feature can be enabled using the DecomposeExperimentFlags.duplicateConfigurationsEnabled flag. If the feature is enabled, Decompose will not throw errors when duplicate configurations are detected. Instead, it will try its best to properly manage the components. Please see the updated docs for more information.

Versions and dependencies

Kotlin: 2.0.0
Essenty: 2.1.0
kotlinx-serialization: 1.6.3
Multiplatform Compose: 1.6.10

Decompose - 3.1.0

Published by arkivanov 4 months ago

  • Updated Kotlin to 2.0.0, Compose to 1.6.10 and other dependencies (#718)
  • Add onWebNavigation callback to WebHistoryController#attach method to allow/deny navigation on browser forward/back button click (#713 by @gsteckman, #724)
  • Added StackNavigator#popToFirst extension function (#722, docs)

Versions and dependencies

Kotlin: 2.0.0
Essenty: 2.1.0
kotlinx-serialization: 1.6.3
Multiplatform Compose: 1.6.10

Decompose - 3.0.0

Published by arkivanov 6 months ago

Changes since version 3.0.0-beta01

  • Added withDeepLink extension function (#701, #702)
  • Promoted retainedComponent, onDecomposeError, pushNew, pushToFront and LifecycleController APIs to stable (#704)
  • Updated Essenty to 2.0.0 (#703)
  • Fixed a bug in MergedLifecycle when one of the lifecycles emits asynchronously (#698)

Earlier changes since version 2.2.3

  • Complete migration to kotlinx-serialization (#553)
  • Added support for the wasmJs target for browser (#564)
  • Renamed extensions-compose-jetbrains module to extensions-compose (#559)
  • Removed deprecated Value#subscribe and Value#unsubscribe methods (#554)
  • Renamed predictiveBackAnimation animation argument to fallbackAnimation (#555)
  • Added STARTED status to ChildNavState (#557)
  • Added API to discard saved state on Android (#558)
  • Support WebHistoryController on wasmJs by using serialization (#569)
  • Added LocalStackAnimationProvider for configuring a default stack animation (#571 by @LionZXY)
  • Moved PredictiveBackGestureOverlay and PredictiveBackGestureIcon inside predictiveback package (#614)
  • Use Cancellation in NavigationSource (#613)
  • Added discardSavedState and isStateSavingAllowed arguments to retainedComponent {} function (#594)
  • Added StackNavigator#pushToFront extension function (#593)
  • Removed StackNavigationSource, SlotNavigationSource and PagesNavigationSource interfaces (#626)
  • Added edgeWidth, startingOffsetThreshold and confirmationProgressThreshold parameters for PredictiveBackGestureOverlay (#622, see #618)
  • Animate predictive back gesture cancellation (#620, see #618)
  • Removed ApplicationLifecycle and used the new one from Essenty (#654)
  • Added androidPredictiveBackAnimatable (#652)
  • Buffer navigation events during initialisation (#645)
  • Inlined the rest of navigation extensions with lambdas (#648)
  • Don't remove the first configuration on popWhile (#646)
  • Monitor window focused state in desktop LifecycleController (#672, see #671)
  • Improved component context API for easier custom component contexts (#670)
  • Various bug fixes

Overall changes and improvements

The new withDeepLink extension function for Android

The new extensions function (withDeepLink) is now available for easier deep link handling on Android. Please see the update docs for more information.

Migration to kotlinx-serialization

The migration to kotlinx-serialization is now completed, the support of Parcelable/Parcelize is removed. See the updated docs for more information.

Changes in ChildNavState

The ChildNavState.Status enum (Generic Navigation) has changed and now includes STARTED variant. Please see the updated docs.

Removal of Value subscribe and unsubscribe methods

Previously deprecated methods Value#subscribe and Value#unsubscribe are removed. The Value#observe method returning Cancellation is renamed to subscribe. The Value.observe(Lifecycle, ...) method is also renamed to subscribe.

API to discard saved state on Android

New arguments in defaultComponentContext function

The defaultComponentContext function now accepts two new optional arguments:

  • discardSavedState - a flag indicating whether any previously saved state should be discarded or not, default value is false. Can be useful for handling deep links in onCreate, so that the navigation state is not restored and initial state from the deep link is applied instead.
  • isStateSavingAllowed - called before saving the state. When true then the state will be saved, otherwise it won't. Default value is true.

New arguments in retainedComponent function

The retainedComponent {} function got two new arguments with default values: discardSavedState and isStateSavingAllowed. The default behaviour is unchanged, though this change breaks binary compatibility.

Changes in Compose extensions

The extensions-compose-jetpack module is removed, the extensions-compose-jetbrains module is renamed to extensions-compose. Please update your dependencies accordingly and replace all com.arkivanov.decompose.extensions.compose.jetbrains.* imports with com.arkivanov.decompose.extensions.compose.*.

Compose for iOS, macOS and Web support

Now there is no need to use -compose-experimental version suffix. The support of Compose for iOS, macOS and Web is now published under the main version.

Compose for JS/Wasm

The new version supports Compose for Wasm (wasmJs target).

The new StackNavigator#pushToFront function

This release adds the new StackNavigator#pushToFront navigation function. See the updated docs for details.

Using Cancellation in NavigationSource

The NavigationSource#subscribe method now returns Cancellation, the NavigationSource#unsubscribe method is removed. This is both source and binary incompatible change. Though, the source compatibility is only affected if there is a manual implementation of the NavigationSource interface.

Moved PredictiveBackGestureOverlay and PredictiveBackGestureIcon

PredictiveBackGestureOverlay and PredictiveBackGestureIcon are moved from com.arkivanov.decompose.extensions.compose package to com.arkivanov.decompose.extensions.compose.stack.animation.predictiveback.

- import com.arkivanov.decompose.extensions.compose.PredictiveBackGestureOverlay
- import com.arkivanov.decompose.extensions.compose.PredictiveBackGestureIcon
+ import com.arkivanov.decompose.extensions.compose.stack.animation.predictiveback.PredictiveBackGestureOverlay
+ import com.arkivanov.decompose.extensions.compose.stack.animation.predictiveback.PredictiveBackGestureIcon

Changes in PredictiveBackAnimatable interface

The PredictiveBackAnimatable interface got the new method: suspend fun cancel(). This is required for animations when the predictive back gesture is cancelled.

Removed navigation source interfaces

The following interfaces were removed: StackNavigationSource, SlotNavigationSource and PagesNavigationSource. This change should be source compatible (meaning your project should still compile fine), unless you have custom implementations of those interfaces, in which case you have to implement the NavigationSource interface instead.

The improved ComponentContext API

This release brings improvements for the ComponentContext API. Please share your feedback or any issues you encounter. The idea is to make it easier to create and manage custom component contexts.

The change shouldn't break any source compatibility. However, if you have type parameters (generics) explicitly specified for functions childStack, childSlot, childPages or children, you will need to change your code in the following way. The rest should be compatible and require no changes in the code.

- val stack: Value<ChildStack<*, Child>> = childStack<Config, Child>(...)
+ val stack: Value<ChildStack<*, Child>> = childStack<_, Config, Child>(...)

If you have a custom component context

Since this version you can now remove custom navigation extensions like AppComponentContext.appChildStack, AppComponentContext.childAppContext, etc. You will also need to update your custom component context definitions. Please see the updated docs.

Changes in LifecycleController for desktop (JVM)

The LifecycleController function now accepts an optional WindowInfo argument. If supplied, the Lifecycle will pause/resume when the window's focus state changes.

ApplicationLifecycle is moved to Essenty

ApplicationLifecycle for iOS and tvOS has been moved to Essenty.

If you are using ApplicationLifecycle in Kotlin, you will need to update imports.

- import com.arkivanov.decompose.lifecycle.ApplicationLifecycle
+ import com.arkivanov.essenty.lifecycle.ApplicationLifecycle

If you are using ApplicationLifecycle in Swift, you will need to export Essenty lifecycle module to iOS framework.

The new androidPredictiveBackAnimatable API

This release add a new predictive back animation style - the animation that is used e.g. in system settings on Pixel devices. See the updated docs.

WebHistoryController on JS/Wasm

This release adds WebHistoryController for wasmJs target. It is shared with js target and now relies on kotlinx-serialization. The WebHistoryController#attach method got a new argument (serializer: KSerializer<C>), which is a breaking change.

Versions and dependencies

Kotlin: 1.9.23
Essenty: 2.0.0
kotlinx-serialization: 1.6.2
JetBrains Compose: 1.6.1

Decompose - 2.2.3

Published by arkivanov 6 months ago

  • Bug fix: component Lifecycle unnecessary stops and resumes sometimes on initialisation, if the root component is created using Lazy (#698)

Versions and dependencies

Kotlin: 1.9.21
Essenty: 1.3.0
kotlinx-serialization: 1.6.0
parcelize-darwin: 0.2.3

extensions-compose-jetpack

Jetpack Compose: 1.5.0
Jetpack Compose Compiler: 1.5.6

extensions-compose-jetbrains

JetBrains Compose: 1.5.11

Decompose - 3.0.0-beta01

Published by arkivanov 6 months ago

  • Discard back gesture in PredictiveBackGestureOverlay when swiped in the opposite direction (#680)
  • Print configurations on uniqueness violation (#683)
  • Updated Essenty to 2.0.0-beta01 (#687)

Versions and dependencies

Kotlin: 1.9.23
Essenty: 2.0.0-beta01
kotlinx-serialization: 1.6.2
JetBrains Compose: 1.6.1

Decompose - 3.0.0-alpha09

Published by arkivanov 7 months ago

  • Improved component context API for easier custom component contexts (#670)
  • Monitor window focused state in desktop LifecycleController (#672, see #671)
  • Updated Kotlin to 1.9.23, Compose to 1.6.1 and other dependencies (#676)

The improved ComponentContext API

This release brings experimental changes to the ComponentContext API. Please share your feedback or any issues you encounter. The idea is to make it easier to create and manage custom component contexts.

The change shouldn't break any source compatibility. However, if you have type parameters (generics) explicitly specified for functions childStack, childSlot, childPages or children, you will need to change your code in the following way. The rest should be compatible and require no changes in the code.

- val stack: Value<ChildStack<*, Child>> = childStack<Config, Child>(...)
+ val stack: Value<ChildStack<*, Child>> = childStack<_, Config, Child>(...)

If you have a custom component context

Since this version (experimentally) you can now remove custom navigation extensions like AppComponentContext.appChildStack, AppComponentContext.childAppContext, etc. You will also need to update your custom component context definitions. Please see the updated docs.

Changes in LifecycleController for desktop (JVM)

The LifecycleController function now accepts an optional WindowInfo argument. If supplied, the Lifecycle will pause/resume when the window's focus state changes.

Versions and dependencies

Kotlin: 1.9.23
Essenty: 2.0.0-alpha07
kotlinx-serialization: 1.6.2
JetBrains Compose: 1.6.1

Decompose - 3.0.0-alpha08

Published by arkivanov 8 months ago

  • Fixed predictive back animation not working sometimes (regression in 3.0.0-alpha07) (#664)
  • Fixed screen corners blinking when the predictive back gesture starts (#665)
  • Fixed screen corner animations in androidPredictiveBackAnimatable (#666)
  • Minor fixes and changes (#659, #667)

Versions and dependencies

Kotlin: 1.9.22
Essenty: 2.0.0-alpha07
kotlinx-serialization: 1.6.2
JetBrains Compose: 1.6.0-rc02

Decompose - 3.0.0-alpha07

Published by arkivanov 8 months ago

  • Don't remove the first configuration on popWhile (#646)
  • Inlined the rest of navigation extensions with lambdas (#648)
  • Updated Kotlin to 1.9.22, Compose to 1.6.0-rc02, also updated Pages Composable API (#649, see #461)
  • Buffer navigation events during initialisation (#645)
  • Added androidPredictiveBackAnimatable (#652)
  • Updated Essenty to 2.0.0-alpha07 (#656)
  • Removed ApplicationLifecycle and used the new one from Essenty (#654)
  • Fixed predictive back gesture not working when started during normal transition (#653)

ApplicationLifecycle is moved to Essenty

ApplicationLifecycle for iOS and tvOS has been moved to Essenty.

If you are using ApplicationLifecycle in Kotlin, you will need to update imports.

- import com.arkivanov.decompose.lifecycle.ApplicationLifecycle
+ import com.arkivanov.essenty.lifecycle.ApplicationLifecycle

If you are using ApplicationLifecycle in Swift, you will need to export Essenty lifecycle module to iOS framework.

The new androidPredictiveBackAnimatable API

This release add a new predictive back animation style - the animation that is used e.g. in system settings on Pixel devices. See the updated docs.

Changes in Pages Composable API

One of the Pages Composable function overloads has changed. See #461 and #649 for more information.

@Composable
fun <C : Any, T : Any> Pages(
-     pages: State<ChildPages<C, T>>,
+     pages: ChildPages<C, T>,
      ...
)

Versions and dependencies

Kotlin: 1.9.22
Essenty: 2.0.0-alpha07
kotlinx-serialization: 1.6.2
JetBrains Compose: 1.6.0-rc02

Decompose - 3.0.0-alpha06

Published by arkivanov 8 months ago

  • Animate predictive back gesture cancellation (#620, see #618)
  • Added edgeWidth, startingOffsetThreshold and confirmationProgressThreshold parameters for PredictiveBackGestureOverlay (#622, see #618)
  • Removed StackNavigationSource, SlotNavigationSource and PagesNavigationSource interfaces (#626)
  • Fixed animation on hardware back button click with predictive back gesture enabled (#633)

Breaking changes

This release is binary incompatible with the previous 3.0.0-alpha05 release. Please make sure you also update Essenty to 2.0.0-alpha06, see the release notes there.

Changes in PredictiveBackAnimatable interface

The PredictiveBackAnimatable interface got the new method: suspend fun cancel(). This is required for animations when the predictive back gesture is cancelled.

Removed navigation source interfaces

The following interfaces were removed: StackNavigationSource, SlotNavigationSource and PagesNavigationSource. This change should be source compatible (meaning your project should still compile fine), unless you have custom implementations of those interfaces, in which case you have to implement the NavigationSource interface instead.

Versions and dependencies

Kotlin: 1.9.21
Essenty: 2.0.0-alpha06
kotlinx-serialization: 1.6.2
JetBrains Compose: 1.6.0-alpha01

Decompose - 3.0.0-alpha05

Published by arkivanov 9 months ago

TBD (publishing in progress)

Decompose - 3.0.0-alpha04

Published by arkivanov 10 months ago

  • Fixed the issue where onPageSelected was not being called during slow scrolling with HorizontalPager (#579 by @Chen-Xi-g, see #526)

Versions and dependencies

Kotlin: 1.9.21
Essenty: 2.0.0-alpha02
kotlinx-serialization: 1.6.2
JetBrains Compose: 1.6.0-alpha01

Decompose - 2.2.2-compose-experimental

Published by arkivanov 10 months ago

This is the same release as 2.2.2, but with Compose for iOS and Web (Canvas, js only) support.

Versions and dependencies

Kotlin: 1.9.21
Essenty: 1.3.0
kotlinx-serialization: 1.6.0
parcelize-darwin: 0.2.3
JetBrains Compose: 1.5.11

Decompose - 2.2.2

Published by arkivanov 10 months ago

  • Fixed the issue where onPageSelected was not being called during slow scrolling with HorizontalPager (#579 by @Chen-Xi-g, see #526)

Versions and dependencies

Kotlin: 1.9.21
Essenty: 1.3.0
kotlinx-serialization: 1.6.0
parcelize-darwin: 0.2.3

extensions-compose-jetpack

Jetpack Compose: 1.5.0
Jetpack Compose Compiler: 1.5.6

extensions-compose-jetbrains

JetBrains Compose: 1.5.11

Decompose - 3.0.0-alpha03

Published by arkivanov 10 months ago

  • Added LocalStackAnimationProvider for configuring a default stack animation (#571 by @LionZXY)

The new LocalStackAnimationProvider

The new LocalStackAnimationProvider API allows configuring a default stack animation for Children and predictiveBackAnimation. Please see the updated docs.

Versions and dependencies

Kotlin: 1.9.21
Essenty: 2.0.0-alpha02
kotlinx-serialization: 1.6.2
JetBrains Compose: 1.6.0-alpha01

Decompose - 3.0.0-alpha02

Published by arkivanov 10 months ago

  • Support WebHistoryController on wasmJs by using serialization (#569)
  • Updated Essenty to 2.0.0-alpha02 (reduces the size of the saved state) (#572)

WebHistoryController on Wasm

This release adds WebHistoryController for wasmJs target. It is shared with js target and now relies on kotlinx-serialization. The WebHistoryController#attach method got a new argument (serializer: KSerializer<C>), which is a breaking change.

Versions and dependencies

Kotlin: 1.9.21
Essenty: 2.0.0-alpha02
kotlinx-serialization: 1.6.2
JetBrains Compose: 1.6.0-alpha01

Package Rankings
Top 12.78% on Repo1.maven.org
Badges
Extracted from project README
License Twitter URL
Related Projects