Skip to content

Commit ae85a1d

Browse files
authored
Merge pull request #58 from ikarenkov/fix-lifecycle-order
Fixed order of start events
2 parents 566f1d9 + 1f01046 commit ae85a1d

File tree

4 files changed

+24
-12
lines changed

4 files changed

+24
-12
lines changed

TestInstructions.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,7 @@ certain cases:
1111
* Check correctness, with animation interruption. F.e. 2 fast back clicks
1212
* Check pause, stop. dispose - 2 fast back or replace
1313
* Check create, start, resume - 2 fast forward or replace
14-
* Movable content test
14+
* Movable content test
15+
* Check lifecycle order in nested screens when activity/fragment recreated, by rotating the screen. Following rules should be applied:
16+
* Parent screens events ON_CREATE, ON_START, ON_RESUME should be called before child screens events
17+
* Parent screens events ON_PAUSE, ON_STOP, ON_DESTROY should be called after child screens events

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[versions]
22
leakcanaryAndroid = "2.14"
3-
modo = "0.10.0-alpha1"
3+
modo = "0.10.0-alpha2"
44
androidGradlePlugin = "8.4.0"
55
detektComposeVersion = "0.3.20"
66
detektVersion = "1.23.6"

modo-compose/src/main/java/com/github/terrakok/modo/android/ModoScreenAndroidAdapter.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,11 @@ class ModoScreenAndroidAdapter private constructor(
219219
onCreate(savedState) // do this in the UI thread to force it to be called before anything else
220220
}
221221

222+
DisposableEffect(this) {
223+
emitOnStartEvents()
224+
onDispose { }
225+
}
226+
222227
content()
223228

224229
DisposableEffect(this) {
@@ -246,8 +251,6 @@ class ModoScreenAndroidAdapter private constructor(
246251
}
247252
}
248253

249-
emitOnStartEvents()
250-
251254
onDispose {
252255
// Log.d("LifecycleDebug", "ModoScreenAndroidAdapter registerParentLifecycleListener onDispose ${screen.screenKey}")
253256
unregisterLifecycle()

modo-compose/src/main/java/com/github/terrakok/modo/stack/StackScreen.kt

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ abstract class StackScreen(
7272
dialogModifier: Modifier = Modifier,
7373
content: RendererContent<StackState> = defaultRendererContent
7474
) {
75+
StackBackHandler()
76+
7577
val screensToRender: ScreensToRender by rememberScreensToRender()
7678
screensToRender.screen?.let { screen ->
7779
Content(screen, modifier, content)
@@ -131,6 +133,18 @@ abstract class StackScreen(
131133
}
132134
}
133135

136+
@Composable
137+
private fun StackBackHandler() {
138+
val isBackHandlerEnabled by remember {
139+
derivedStateOf {
140+
defaultBackHandler && navigationState.getChildScreens().size > 1
141+
}
142+
}
143+
BackHandler(enabled = isBackHandlerEnabled) {
144+
back()
145+
}
146+
}
147+
134148
@Composable
135149
@OptIn(ExperimentalModoApi::class)
136150
private fun StackScreen.RenderDialog(
@@ -174,14 +188,6 @@ abstract class StackScreen(
174188
modifier: Modifier = Modifier,
175189
content: RendererContent<StackState> = defaultRendererContent
176190
) {
177-
val isBackHandlerEnabled by remember {
178-
derivedStateOf {
179-
defaultBackHandler && navigationState.getChildScreens().size > 1
180-
}
181-
}
182-
BackHandler(enabled = isBackHandlerEnabled) {
183-
back()
184-
}
185191
super.InternalContent(screen, modifier, content)
186192
}
187193

0 commit comments

Comments
 (0)