Update Voyager to use a personal fork

This commit is contained in:
Syer10
2022-10-22 00:12:07 -04:00
parent 9e8ca22f3a
commit 0ced8fc47e
2 changed files with 34 additions and 31 deletions

View File

@@ -10,7 +10,7 @@ json = "1.4.0"
composeGradle = "1.2.0-rc02" composeGradle = "1.2.0-rc02"
composeCompiler = "1.3.2" composeCompiler = "1.3.2"
composeAndroid = "1.2.1" composeAndroid = "1.2.1"
voyager = "1.0.0-beta16" voyager = "1.0.0-rc03"
accompanist = "0.25.2" accompanist = "0.25.2"
googleAccompanist = "0.25.1" googleAccompanist = "0.25.1"
imageloader = "1.2.2.1" imageloader = "1.2.2.1"
@@ -97,9 +97,9 @@ compose-ui-test-junit4 = { module = "androidx.compose.ui:ui-test-junit4", versio
compose-material-core = { module = "androidx.compose.material:material", version.ref = "composeAndroid" } compose-material-core = { module = "androidx.compose.material:material", version.ref = "composeAndroid" }
compose-material-icons = { module = "androidx.compose.material:material-icons-extended", version.ref = "composeAndroid" } compose-material-icons = { module = "androidx.compose.material:material-icons-extended", version.ref = "composeAndroid" }
# Compose UI # Compose UI
voyager-core = { module = "cafe.adriel.voyager:voyager-core", version.ref = "voyager" } voyager-core = { module = "ca.gosyer:voyager-core", version.ref = "voyager" }
voyager-navigation = { module = "cafe.adriel.voyager:voyager-navigator", version.ref = "voyager" } voyager-navigation = { module = "ca.gosyer:voyager-navigator", version.ref = "voyager" }
voyager-transitions = { module = "cafe.adriel.voyager:voyager-transitions", version.ref = "voyager" } voyager-transitions = { module = "ca.gosyer:voyager-transitions", version.ref = "voyager" }
accompanist-pager = { module = "ca.gosyer:accompanist-pager", version.ref = "accompanist" } accompanist-pager = { module = "ca.gosyer:accompanist-pager", version.ref = "accompanist" }
accompanist-pagerIndicators = { module = "ca.gosyer:accompanist-pager-indicators", version.ref = "accompanist" } accompanist-pagerIndicators = { module = "ca.gosyer:accompanist-pager-indicators", version.ref = "accompanist" }
accompanist-flowLayout = { module = "ca.gosyer:accompanist-flowlayout", version.ref = "accompanist" } accompanist-flowLayout = { module = "ca.gosyer:accompanist-flowlayout", version.ref = "accompanist" }

View File

@@ -8,11 +8,9 @@ package ca.gosyer.jui.ui.sources.components
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.ProvidableCompositionLocal import androidx.compose.runtime.ProvidableCompositionLocal
import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.saveable.SaveableStateHolder
import androidx.compose.runtime.saveable.Saver import androidx.compose.runtime.saveable.Saver
import androidx.compose.runtime.saveable.mapSaver import androidx.compose.runtime.saveable.mapSaver
import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.saveable.rememberSaveable
@@ -23,12 +21,11 @@ import ca.gosyer.jui.ui.base.model.StableHolder
import ca.gosyer.jui.ui.sources.browse.SourceScreen import ca.gosyer.jui.ui.sources.browse.SourceScreen
import ca.gosyer.jui.ui.sources.globalsearch.GlobalSearchScreen import ca.gosyer.jui.ui.sources.globalsearch.GlobalSearchScreen
import ca.gosyer.jui.ui.sources.home.SourceHomeScreen import ca.gosyer.jui.ui.sources.home.SourceHomeScreen
import cafe.adriel.voyager.core.lifecycle.ScreenLifecycleStore import cafe.adriel.voyager.core.lifecycle.DisposableEffectIgnoringConfiguration
import cafe.adriel.voyager.core.lifecycle.rememberScreenLifecycleOwner
import cafe.adriel.voyager.core.model.ScreenModelStore
import cafe.adriel.voyager.core.screen.Screen import cafe.adriel.voyager.core.screen.Screen
import cafe.adriel.voyager.core.stack.StackEvent import cafe.adriel.voyager.core.stack.StackEvent
import cafe.adriel.voyager.navigator.Navigator import cafe.adriel.voyager.navigator.Navigator
import cafe.adriel.voyager.navigator.NavigatorDisposeBehavior
import cafe.adriel.voyager.navigator.currentOrThrow import cafe.adriel.voyager.navigator.currentOrThrow
import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toImmutableList
@@ -42,10 +39,17 @@ fun SourcesNavigator(
homeScreenHolder: StableHolder<SourceHomeScreen>, homeScreenHolder: StableHolder<SourceHomeScreen>,
content: SourcesNavigatorContent = { CurrentSource() } content: SourcesNavigatorContent = { CurrentSource() }
) { ) {
Navigator(homeScreenHolder.item, autoDispose = false, onBackPressed = null) { navigator -> Navigator(
homeScreenHolder.item,
onBackPressed = null,
disposeBehavior = NavigatorDisposeBehavior(
disposeSteps = false,
disposeNestedNavigators = false
)
) { navigator ->
val sourcesNavigator = rememberNavigator(navigator, homeScreenHolder.item) val sourcesNavigator = rememberNavigator(navigator, homeScreenHolder.item)
DisposableEffect(sourcesNavigator) { DisposableEffectIgnoringConfiguration(sourcesNavigator) {
onDispose(sourcesNavigator::dispose) onDispose(sourcesNavigator::dispose)
} }
@@ -65,13 +69,12 @@ private fun rememberNavigator(
parent: Navigator, parent: Navigator,
homeScreen: SourceHomeScreen homeScreen: SourceHomeScreen
): SourcesNavigator { ): SourcesNavigator {
return rememberSaveable(saver = navigatorSaver(parent.stateHolder, parent, homeScreen)) { return rememberSaveable(saver = navigatorSaver(parent, homeScreen)) {
SourcesNavigator(parent, homeScreen) SourcesNavigator(parent, homeScreen)
} }
} }
private fun navigatorSaver( private fun navigatorSaver(
stateHolder: SaveableStateHolder,
parent: Navigator, parent: Navigator,
homeScreen: SourceHomeScreen homeScreen: SourceHomeScreen
): Saver<SourcesNavigator, Any> = ): Saver<SourcesNavigator, Any> =
@@ -84,7 +87,6 @@ private fun navigatorSaver(
SnapshotStateMap<Long, Screen>().also { map -> SnapshotStateMap<Long, Screen>().also { map ->
map.putAll(items.map { it.key.toLong() to (it.value as Screen) }) map.putAll(items.map { it.key.toLong() to (it.value as Screen) })
}, },
stateHolder
) )
} }
) )
@@ -94,10 +96,8 @@ private fun SourceNavigatorDisposableEffect(
navigator: SourcesNavigator navigator: SourcesNavigator
) { ) {
val currentScreen = navigator.current val currentScreen = navigator.current
val lifecycle = rememberScreenLifecycleOwner(currentScreen)
val hooks = lifecycle.getHooks()
DisposableEffect(currentScreen.key) { DisposableEffectIgnoringConfiguration(currentScreen.key) {
onDispose { onDispose {
if ( if (
navigator.lastEvent in disposableEvents && navigator.lastEvent in disposableEvents &&
@@ -105,10 +105,7 @@ private fun SourceNavigatorDisposableEffect(
currentScreen !is SourceHomeScreen && currentScreen !is SourceHomeScreen &&
currentScreen !is GlobalSearchScreen currentScreen !is GlobalSearchScreen
) { ) {
hooks.onDispose() navigator.dispose(currentScreen)
ScreenModelStore.remove(currentScreen)
ScreenLifecycleStore.remove(currentScreen)
navigator.stateHolder.removeState(currentScreen.key)
navigator.clearEvent() navigator.clearEvent()
} }
} }
@@ -126,12 +123,11 @@ class SourcesNavigator internal constructor(
homeScreen: SourceHomeScreen, homeScreen: SourceHomeScreen,
val screens: SnapshotStateMap<Long, Screen> = SnapshotStateMap<Long, Screen>() val screens: SnapshotStateMap<Long, Screen> = SnapshotStateMap<Long, Screen>()
.also { it[-1] = homeScreen }, .also { it[-1] = homeScreen },
val stateHolder: SaveableStateHolder = navigator.stateHolder
) { ) {
fun remove(source: Source) { fun remove(source: Source) {
navigator replaceAll screens[-1]!! navigator replaceAll screens[-1]!!
screens.remove(source.id)?.let(::cleanup) screens.remove(source.id)?.let(this::dispose)
} }
fun select(source: Source) { fun select(source: Source) {
@@ -139,19 +135,26 @@ class SourcesNavigator internal constructor(
} }
fun open(source: Source, query: String? = null) { fun open(source: Source, query: String? = null) {
screens.remove(source.id)?.let(::cleanup) screens.remove(source.id)?.let(this::dispose)
navigator replaceAll SourceScreen(source, query).also { screens[source.id] = it } navigator replaceAll SourceScreen(source, query).also { screens[source.id] = it }
} }
fun search(query: String) { fun search(query: String) {
screens[-2]?.let(::cleanup) screens[-2]?.let(this::dispose)
navigator replaceAll GlobalSearchScreen(query).also { screens[-2] = it } navigator replaceAll GlobalSearchScreen(query).also { screens[-2] = it }
} }
private fun cleanup(screen: Screen) { @Composable
ScreenModelStore.remove(screen) fun saveableState(
ScreenLifecycleStore.remove(screen) key: String,
stateHolder.removeState(screen.key) screen: Screen,
content: @Composable () -> Unit
) {
navigator.saveableState(key, screen, content)
}
fun dispose(screen: Screen) {
navigator.dispose(screen)
} }
fun goHome() { fun goHome() {
@@ -164,7 +167,7 @@ class SourcesNavigator internal constructor(
fun dispose() { fun dispose() {
screens.forEach { screens.forEach {
cleanup(it.value) dispose(it.value)
} }
navigator.clearEvent() navigator.clearEvent()
} }
@@ -194,7 +197,7 @@ fun CurrentSource() {
val sourcesNavigator = LocalSourcesNavigator.currentOrThrow val sourcesNavigator = LocalSourcesNavigator.currentOrThrow
val currentSource = sourcesNavigator.current val currentSource = sourcesNavigator.current
sourcesNavigator.stateHolder.SaveableStateProvider(currentSource.key) { sourcesNavigator.saveableState("sources", currentSource) {
currentSource.Content() currentSource.Content()
} }
} }