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
Bot releases are hidden (Show)
2.0.20
, Compose to 1.7.0-beta01
, Essenty to 2.2.0-beta01
(#776)Kotlin: 2.0.20
Essenty: 2.2.0-beta01
kotlinx-serialization: 1.6.3
Multiplatform Compose: 1.7.0-beta01
Published by arkivanov 2 months ago
PredictiveBackParams#animatableSelector
parameter to animatable
(the new animation API) (#762)predictiveBackParams
parameter a function instead of just a value (the new animation API) (#761)Kotlin: 2.0.10
Essenty: 2.2.0-alpha04
kotlinx-serialization: 1.6.3
Multiplatform Compose: 1.7.0-alpha02
Published by arkivanov 2 months ago
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.
Kotlin: 2.0.10
Essenty: 2.2.0-alpha04
kotlinx-serialization: 1.6.3
Multiplatform Compose: 1.7.0-alpha02
Published by arkivanov 2 months ago
StackNavigator#push
as delicate API (#747)Pages
composable function to ChildPages
, promoted all Child Pages API to stable (#756)2.0.10
, Compose to 1.7.0-alpha02
, Essenty to 2.2.0-alpha03
(#750)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.
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.
Kotlin: 2.0.10
Essenty: 2.2.0-alpha03
kotlinx-serialization: 1.6.3
Multiplatform Compose: 1.7.0-alpha02
Published by arkivanov 3 months ago
duplicateConfigurationsEnabled
flag enabled (#734)2.2.0-alpha02
with new StateKeeper
and InstanceKeeper
extensions (#735)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.
Kotlin: 2.0.0
Essenty: 2.2.0-alpha02
kotlinx-serialization: 1.6.3
Multiplatform Compose: 1.6.10
Published by arkivanov 4 months ago
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.
Kotlin: 2.0.0
Essenty: 2.1.0
kotlinx-serialization: 1.6.3
Multiplatform Compose: 1.6.10
Published by arkivanov 4 months ago
2.0.0
, Compose to 1.6.10
and other dependencies (#718)onWebNavigation
callback to WebHistoryController#attach
method to allow/deny navigation on browser forward/back button click (#713 by @gsteckman, #724)StackNavigator#popToFirst
extension function (#722, docs)Kotlin: 2.0.0
Essenty: 2.1.0
kotlinx-serialization: 1.6.3
Multiplatform Compose: 1.6.10
Published by arkivanov 6 months ago
withDeepLink
extension function (#701, #702)kotlinx-serialization
(#553)wasmJs
target for browser (#564)extensions-compose-jetbrains
module to extensions-compose
(#559)Value#subscribe
and Value#unsubscribe
methods (#554)predictiveBackAnimation
animation
argument to fallbackAnimation
(#555)STARTED
status to ChildNavState
(#557)WebHistoryController
on wasmJs
by using serialization (#569)LocalStackAnimationProvider
for configuring a default stack animation (#571 by @LionZXY)PredictiveBackGestureOverlay
and PredictiveBackGestureIcon
inside predictiveback
package (#614)Cancellation
in NavigationSource
(#613)discardSavedState
and isStateSavingAllowed
arguments to retainedComponent {}
function (#594)StackNavigator#pushToFront
extension function (#593)StackNavigationSource
, SlotNavigationSource
and PagesNavigationSource
interfaces (#626)edgeWidth
, startingOffsetThreshold
and confirmationProgressThreshold
parameters for PredictiveBackGestureOverlay
(#622, see #618)ApplicationLifecycle
and used the new one from Essenty (#654)androidPredictiveBackAnimatable
(#652)popWhile
(#646)LifecycleController
(#672, see #671)withDeepLink
extension function for AndroidThe new extensions function (withDeepLink
) is now available for easier deep link handling on Android. Please see the update docs for more information.
The migration to kotlinx-serialization
is now completed, the support of Parcelable/Parcelize is removed. See the updated docs for more information.
The ChildNavState.Status
enum (Generic Navigation) has changed and now includes STARTED
variant. Please see the updated docs.
subscribe
and unsubscribe
methodsPreviously 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
.
defaultComponentContext
functionThe 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
.retainedComponent
functionThe retainedComponent {}
function got two new arguments with default values: discardSavedState
and isStateSavingAllowed
. The default behaviour is unchanged, though this change breaks binary compatibility.
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.*
.
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.
The new version supports Compose for Wasm (wasmJs
target).
StackNavigator#pushToFront
functionThis release adds the new StackNavigator#pushToFront
navigation function. See the updated docs for details.
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.
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
The PredictiveBackAnimatable
interface got the new method: suspend fun cancel()
. This is required for animations when the predictive back gesture is cancelled.
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.
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>(...)
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.
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
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.
androidPredictiveBackAnimatable
APIThis 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.
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.
Kotlin: 1.9.23
Essenty: 2.0.0
kotlinx-serialization: 1.6.2
JetBrains Compose: 1.6.1
Published by arkivanov 6 months ago
Lifecycle
unnecessary stops and resumes sometimes on initialisation, if the root component is created using Lazy
(#698)Kotlin: 1.9.21
Essenty: 1.3.0
kotlinx-serialization: 1.6.0
parcelize-darwin: 0.2.3
Jetpack Compose: 1.5.0
Jetpack Compose Compiler: 1.5.6
JetBrains Compose: 1.5.11
Published by arkivanov 6 months ago
PredictiveBackGestureOverlay
when swiped in the opposite direction (#680)2.0.0-beta01
(#687)Kotlin: 1.9.23
Essenty: 2.0.0-beta01
kotlinx-serialization: 1.6.2
JetBrains Compose: 1.6.1
Published by arkivanov 7 months ago
LifecycleController
(#672, see #671)1.9.23
, Compose to 1.6.1
and other dependencies (#676)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>(...)
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.
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.
Kotlin: 1.9.23
Essenty: 2.0.0-alpha07
kotlinx-serialization: 1.6.2
JetBrains Compose: 1.6.1
Published by arkivanov 8 months ago
3.0.0-alpha07
) (#664)androidPredictiveBackAnimatable
(#666)Kotlin: 1.9.22
Essenty: 2.0.0-alpha07
kotlinx-serialization: 1.6.2
JetBrains Compose: 1.6.0-rc02
Published by arkivanov 8 months ago
popWhile
(#646)1.9.22
, Compose to 1.6.0-rc02
, also updated Pages
Composable API (#649, see #461)androidPredictiveBackAnimatable
(#652)2.0.0-alpha07
(#656)ApplicationLifecycle
and used the new one from Essenty (#654)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.
androidPredictiveBackAnimatable
APIThis 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.
Pages
Composable APIOne 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>,
...
)
Kotlin: 1.9.22
Essenty: 2.0.0-alpha07
kotlinx-serialization: 1.6.2
JetBrains Compose: 1.6.0-rc02
Published by arkivanov 8 months ago
edgeWidth
, startingOffsetThreshold
and confirmationProgressThreshold
parameters for PredictiveBackGestureOverlay
(#622, see #618)StackNavigationSource
, SlotNavigationSource
and PagesNavigationSource
interfaces (#626)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.
The PredictiveBackAnimatable
interface got the new method: suspend fun cancel()
. This is required for animations when the predictive back gesture is cancelled.
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.
Kotlin: 1.9.21
Essenty: 2.0.0-alpha06
kotlinx-serialization: 1.6.2
JetBrains Compose: 1.6.0-alpha01
Published by arkivanov 9 months ago
TBD (publishing in progress)
Published by arkivanov 10 months ago
onPageSelected
was not being called during slow scrolling with HorizontalPager
(#579 by @Chen-Xi-g, see #526)Kotlin: 1.9.21
Essenty: 2.0.0-alpha02
kotlinx-serialization: 1.6.2
JetBrains Compose: 1.6.0-alpha01
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.
Kotlin: 1.9.21
Essenty: 1.3.0
kotlinx-serialization: 1.6.0
parcelize-darwin: 0.2.3
JetBrains Compose: 1.5.11
Published by arkivanov 10 months ago
onPageSelected
was not being called during slow scrolling with HorizontalPager
(#579 by @Chen-Xi-g, see #526)Kotlin: 1.9.21
Essenty: 1.3.0
kotlinx-serialization: 1.6.0
parcelize-darwin: 0.2.3
Jetpack Compose: 1.5.0
Jetpack Compose Compiler: 1.5.6
JetBrains Compose: 1.5.11
Published by arkivanov 10 months ago
LocalStackAnimationProvider
for configuring a default stack animation (#571 by @LionZXY)The new LocalStackAnimationProvider
API allows configuring a default stack animation for Children
and predictiveBackAnimation
. Please see the updated docs.
Kotlin: 1.9.21
Essenty: 2.0.0-alpha02
kotlinx-serialization: 1.6.2
JetBrains Compose: 1.6.0-alpha01
Published by arkivanov 10 months ago
WebHistoryController
on wasmJs
by using serialization (#569)2.0.0-alpha02
(reduces the size of the saved state) (#572)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.
Kotlin: 1.9.21
Essenty: 2.0.0-alpha02
kotlinx-serialization: 1.6.2
JetBrains Compose: 1.6.0-alpha01