Skip to content
This repository was archived by the owner on Sep 8, 2025. It is now read-only.

Commit 3cb968c

Browse files
committed
#309 fix android navigation result crash
1 parent d88a73c commit 3cb968c

File tree

1 file changed

+21
-20
lines changed
  • widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/screen/navigation

1 file changed

+21
-20
lines changed

widgets/src/androidMain/kotlin/dev/icerock/moko/widgets/core/screen/navigation/NavigationScreen.kt

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -53,38 +53,37 @@ actual abstract class NavigationScreen<S> actual constructor(
5353
}
5454
childFragmentManager.registerFragmentLifecycleCallbacks(
5555
object : FragmentManager.FragmentLifecycleCallbacks() {
56-
private val detachHandlers = mutableMapOf<Fragment, Runnable>()
57-
5856
override fun onFragmentStarted(fm: FragmentManager, f: Fragment) {
5957
super.onFragmentStarted(fm, f)
6058

6159
updateNavigation(f)
6260
}
6361

64-
override fun onFragmentAttached(fm: FragmentManager, f: Fragment, context: Context) {
65-
super.onFragmentAttached(fm, f, context)
62+
override fun onFragmentAttached(
63+
fm: FragmentManager,
64+
f: Fragment,
65+
context: Context
66+
) = Unit
6667

67-
if (f is Resultable<*> && f is Screen<*>) {
68-
val resultTarget = f.screenId
68+
override fun onFragmentDetached(fm: FragmentManager, f: Fragment) {
69+
super.onFragmentDetached(fm, f)
6970

70-
if (resultTarget != null) {
71-
val target = fm.getAllScreens()
72-
.firstOrNull { it.resultCode == resultTarget }
71+
if (f is Resultable<*> && f is Screen<*>) {
72+
val resultTarget: Int = f.screenId
73+
?: return
7374

74-
detachHandlers[f] = Runnable {
75-
val code = f.requestCode
76-
val result = f.screenResult
75+
val target: Screen<*>? = fm.getAllScreens()
76+
.firstOrNull { it.resultCode == resultTarget }
7777

78-
target!!.routeHandlers[code]!!.invoke(result)
79-
}
80-
}
81-
}
82-
}
78+
requireNotNull(target) { "can't route with result because target not found" }
8379

84-
override fun onFragmentDetached(fm: FragmentManager, f: Fragment) {
85-
super.onFragmentDetached(fm, f)
80+
val code: Int? = f.requestCode
81+
val result: android.os.Parcelable? = f.screenResult
8682

87-
detachHandlers.remove(f)?.run()
83+
val handler = target.routeHandlers[code]
84+
requireNotNull(handler) { "can't call result because handler is null" }
85+
handler.invoke(result)
86+
}
8887
}
8988
},
9089
false
@@ -192,13 +191,15 @@ actual abstract class NavigationScreen<S> actual constructor(
192191
NavigationBar.None -> {
193192
toolbar.visibility = View.GONE
194193
}
194+
195195
is NavigationBar.Normal -> {
196196
navBar.apply(
197197
toolbar = toolbar,
198198
context = context,
199199
fragmentManager = childFragmentManager
200200
)
201201
}
202+
202203
is NavigationBar.Search -> {
203204
navBar.apply(
204205
toolbar = toolbar,

0 commit comments

Comments
 (0)