alexgladkov / odyssey Goto Github PK
View Code? Open in Web Editor NEWOdyssey it's a declarative multiplatform navigation library for Multiplatform Compose
Home Page: https://youtube.com/c/MobileDeveloper
License: MIT License
Odyssey it's a declarative multiplatform navigation library for Multiplatform Compose
Home Page: https://youtube.com/c/MobileDeveloper
License: MIT License
Момент ухода экрана с навигации можно отслеживать через onScreenRemove.
Но вызов происходит через LaunchedEffect внутри AnimatedHost, а это работает через рекомпозицию.
Цепочка прямых возвратов, как это делает backToScreen - вызовет onScreenRemove только у последнего целевого экрана,
промежуточные останутся без внимания.
onScreenRemove функция очень важная, хотелось бы гарантированной работы для каждого экрана.
config to deny close modal by back button
In one of my applications, there was a need to implement a dynamic theme change. But i stumbled upon a problem during attempts to change screens transition background color programmatically together with changing application theme.
In the Odyssey library, the background color when animating the transition between screens is set by a separate parameter backgroundColor in the OdysseyConfiguration class, which is passed to setNavigationContent when constructing the navigation graph.
Example was found here
In this minimal example i tried to simulate the dynamic transition background color change.
Initially, there is no problem, but after the first transition background color change, the screen is becoming colored with the solid color of the current backgroundColor value. The content on the screen disappears.
Way to reproduce: Click on Set Dark Transition Background button on first screen in this example project.
Please help me figure out how to dynamically change the color of screens transition in runtime.
С версией 1.3.50 не собирается на iOS выдает ошибку
Could not find "org.jetbrains.compose.annotation-internal:annotation" in [/Users/binishmathew/binishmatheww/Kadalas, /Users/binishmathew/.konan/klib, /Users/binishmathew/.konan/kotlin-native-prebuilt-macos-aarch64-1.9.21/klib/common, /Users/binishmathew/.konan/kotlin-native-prebuilt-macos-aarch64-1.9.21/klib/platform/ios_simulator_arm64]
с 1.3.40 нормально все собирается.
Kotlin version: 1.9.21
Compose Multiplatform version: 1.6.0
If you use ModalNavigator inside iOS you got need event loop error
So, i tried to use backToScreen(key) method to go back for needed screen, but instead of it application just rolls down.
https://github.com/VitalyPeryatin/1Coin/tree/feature/FT-68_implement_account_edit_screen
No opportunity to change extraBufferCapacity
param for _viewActions
SharedFlow, so when ViewModel send several actions in sequence, only the last action will be executed. I think there is needs more flexibility.
For example:
FeatureViewModel {
fun someMethod() {
...
viewAction = FeatureAction.Vibrate()
viewAction = FeatureAction.Close()
...
}
}
There is FeatureAction.Vibrate
will be missed
Toolbar is blinking when switching tabs:
https://user-images.githubusercontent.com/22561563/200062650-63331a34-1efb-4b04-b515-a6231d106f6e.mp4
При определении конфигурации навигации не могу определить OdysseyConfiguration для iosMain. В android все в порядке и все работает. Проект чистил, перезапускал Android Studio, успел даже повысить версию пакета, но ошибка не уходит. Подскажите какие данные еще предоставить для решения данной проблемы. Заранее спасибо)
Alert dialogs have animation of bottom sheets. They show and hide with y-offset instead of regular fade animation.
It would be nice to get a ModalDialogState
when using CustomModalConfiguration
. That way you can customize modal animation.
Invoke screen() fun will work 4-5 times
setupNavigation("splash") {
screen("splash") {
Log.i(TAG, "call splash")
SplashScreen()
}
}
Log output:
call splash
call splash
call splash
call splash
call splash
Приложение(Windows) вылетает при попытке перейти на экран (screen()) . Добавление зависимости swing coroutines в desktopMain не помогает.
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Module with the Main dispatcher had failed to initialize
at kotlinx.coroutines.internal.MissingMainCoroutineDispatcher.missing(MainDispatchers.kt:118)
at kotlinx.coroutines.internal.MissingMainCoroutineDispatcher.isDispatchNeeded(MainDispatchers.kt:96)
at kotlinx.coroutines.internal.DispatchedContinuationKt.resumeCancellableWith(DispatchedContinuation.kt:319)
at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:30)
at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable$default$6a2188af(Cancellable.kt:25)
at kotlinx.coroutines.AbstractCoroutine.start(AbstractCoroutine.kt:2110)
at kotlinx.coroutines.CancellableContinuation$DefaultImpls.launch(CancellableContinuation.kt:3056)
at kotlinx.coroutines.CancellableContinuation$DefaultImpls.launch$default(CancellableContinuation.kt:4047)
at kotlinx.coroutines.flow.FlowKt.launchIn(Unknown Source)
at ru.alexgladkov.odyssey.core.extensions.CFlow.watch(CFlow.kt:19)
at ru.alexgladkov.odyssey.compose.navigation.modal_navigation.ModalNavigatorKt$ModalNavigator$2.invokeSuspend(ModalNavigator.kt:55)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
at androidx.compose.ui.platform.FlushCoroutineDispatcher$dispatch$2$1.invoke(FlushCoroutineDispatcher.skiko.kt:1056)
at androidx.compose.ui.platform.FlushCoroutineDispatcher.performRun(FlushCoroutineDispatcher.skiko.kt:85)
at androidx.compose.ui.platform.FlushCoroutineDispatcher.access$performRun(FlushCoroutineDispatcher.skiko.kt:33)
at androidx.compose.ui.platform.FlushCoroutineDispatcher$dispatch$2.invokeSuspend(FlushCoroutineDispatcher.skiko.kt:51)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
at java.desktop/java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.desktop/java.awt.EventQueue$3.run(Unknown Source)
at java.desktop/java.awt.EventQueue$3.run(Unknown Source)
at java.base/java.security.AccessController.doPrivileged(Unknown Source)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.desktop/java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.run(Unknown Source)
Suppressed: kotlinx.coroutines.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@3d695df6, Dispatchers.Main[missing, cause=java.util.ServiceConfigurationError: kotlinx.coroutines.internal.MainDispatcherFactory: Provider kotlinx.coroutines.swing.SwingDispatcherFactory not found]]
Caused by: java.util.ServiceConfigurationError: kotlinx.coroutines.internal.MainDispatcherFactory: Provider kotlinx.coroutines.swing.SwingDispatcherFactory not found
at java.base/java.util.ServiceLoader.fail(Unknown Source)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.nextProviderClass(Unknown Source)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(Unknown Source)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(Unknown Source)
at java.base/java.util.ServiceLoader$2.hasNext(Unknown Source)
at java.base/java.util.ServiceLoader$3.hasNext(Unknown Source)
at kotlin.collections.CollectionsKt___CollectionsKt.toCollection(_Collections.kt:1295)
at kotlin.collections.CollectionsKt___CollectionsKt.toMutableList(_Collections.kt:1328)
Caused by: java.util.ServiceConfigurationError: kotlinx.coroutines.internal.MainDispatcherFactory: Provider kotlinx.coroutines.swing.SwingDispatcherFactory not found
at kotlin.collections.CollectionsKt___CollectionsKt.toList(_Collections.kt:1319)
at kotlinx.coroutines.internal.FastServiceLoader.load(FastServiceLoader.kt:90)
at kotlinx.coroutines.internal.FastServiceLoader.loadMainDispatcherFactory$kotlinx_coroutines_core(FastServiceLoader.kt:55)
at kotlinx.coroutines.internal.MainDispatcherLoader.loadMainDispatcher(MainDispatchers.kt:27)
at kotlinx.coroutines.internal.MainDispatcherLoader.<clinit>(MainDispatchers.kt:22)
at kotlinx.coroutines.Dispatchers.getMain(Dispatchers.kt:57)
... 23 more
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Module with the Main dispatcher had failed to initialize
at kotlinx.coroutines.internal.MissingMainCoroutineDispatcher.missing(MainDispatchers.kt:118)
at kotlinx.coroutines.internal.MissingMainCoroutineDispatcher.isDispatchNeeded(MainDispatchers.kt:96)
at kotlinx.coroutines.internal.DispatchedContinuationKt.resumeCancellableWith(DispatchedContinuation.kt:319)
at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:30)
at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable$default$6a2188af(Cancellable.kt:25)
at kotlinx.coroutines.AbstractCoroutine.start(AbstractCoroutine.kt:2110)
at kotlinx.coroutines.CancellableContinuation$DefaultImpls.launch(CancellableContinuation.kt:3056)
at kotlinx.coroutines.CancellableContinuation$DefaultImpls.launch$default(CancellableContinuation.kt:4047)
at kotlinx.coroutines.flow.FlowKt.launchIn(Unknown Source)
at ru.alexgladkov.odyssey.core.extensions.CFlow.watch(CFlow.kt:19)
at ru.alexgladkov.odyssey.compose.navigation.modal_navigation.ModalNavigatorKt$ModalNavigator$2.invokeSuspend(ModalNavigator.kt:55)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
at androidx.compose.ui.platform.FlushCoroutineDispatcher$dispatch$2$1.invoke(FlushCoroutineDispatcher.skiko.kt:1056)
at androidx.compose.ui.platform.FlushCoroutineDispatcher.performRun(FlushCoroutineDispatcher.skiko.kt:85)
at androidx.compose.ui.platform.FlushCoroutineDispatcher.access$performRun(FlushCoroutineDispatcher.skiko.kt:33)
at androidx.compose.ui.platform.FlushCoroutineDispatcher$dispatch$2.invokeSuspend(FlushCoroutineDispatcher.skiko.kt:51)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
at java.desktop/java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.desktop/java.awt.EventQueue$3.run(Unknown Source)
at java.desktop/java.awt.EventQueue$3.run(Unknown Source)
at java.base/java.security.AccessController.doPrivileged(Unknown Source)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.desktop/java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.desktop/java.awt.EventDispatchThread.run(Unknown Source)
Suppressed: kotlinx.coroutines.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelled}@3d695df6, Dispatchers.Main[missing, cause=java.util.ServiceConfigurationError: kotlinx.coroutines.internal.MainDispatcherFactory: Provider kotlinx.coroutines.swing.SwingDispatcherFactory not found]]
Suppressed: kotlinx.coroutines.DiagnosticCoroutineContextException: [androidx.compose.ui.awt.ComposeLayer$coroutineExceptionHandler$1@1fb1beab, androidx.compose.runtime.BroadcastFrameClock@4e5d5721, StandaloneCoroutine{Cancelling}@27fff5a4, FlushCoroutineDispatcher@7eacf369]
Caused by: java.util.ServiceConfigurationError: kotlinx.coroutines.internal.MainDispatcherFactory: Provider kotlinx.coroutines.swing.SwingDispatcherFactory not found
at java.base/java.util.ServiceLoader.fail(Unknown Source)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.nextProviderClass(Unknown Source)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(Unknown Source)
at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(Unknown Source)
at java.base/java.util.ServiceLoader$2.hasNext(Unknown Source)
at java.base/java.util.ServiceLoader$3.hasNext(Unknown Source)
at kotlin.collections.CollectionsKt___CollectionsKt.toCollection(_Collections.kt:1295)
at kotlin.collections.CollectionsKt___CollectionsKt.toMutableList(_Collections.kt:1328)
at kotlin.collections.CollectionsKt___CollectionsKt.toList(_Collections.kt:1319)
at kotlinx.coroutines.internal.FastServiceLoader.load(FastServiceLoader.kt:90)
at kotlinx.coroutines.internal.FastServiceLoader.loadMainDispatcherFactory$kotlinx_coroutines_core(FastServiceLoader.kt:55)
at kotlinx.coroutines.internal.MainDispatcherLoader.loadMainDispatcher(MainDispatchers.kt:27)
at kotlinx.coroutines.internal.MainDispatcherLoader.<clinit>(MainDispatchers.kt:22)
at kotlinx.coroutines.Dispatchers.getMain(Dispatchers.kt:57)
... 23 more```
Не отрабатывает startDestination на определенных моделях xiaomi в следствие не отображается экран
Если создать активити с которой будет переход на экран с compose то все начинает работать и экран становится видимым
After configuration changes such as screen rotation and theme change, navigation starts from the beginning. It is necessary to correct and process the configuration change.
It happens when you are closing dialog manually(by swipe) and using DisplayType.FullScreen
in OdysseyConfiguration
.
Need some kind of binding to the life cycle of the screen for the VM. In hilt-navigation used function with param ViewModelStoreOwner. NavBackStackEntry is used as ViewModelStoreOwner.
For example, add shortenedTitle
field
As user i want to return to desired screen (2 screen back or back to root)
New link to Github: https://github.com/1Coin-FinanceTracker/1CoinClient
Link to PlayMarket: https://play.google.com/store/apps/details?id=com.finance_tracker.finance_tracker
There is no way to configure elevation of Bottom Navigation since Odyssey library code passes no value in BottomBarNavigotor.kt line 60. (v 1.0.0)
BottomNavigation( backgroundColor = bottomNavConfiguration.backgroundColor )
Thus androidx's composable BottomNavigation takes default value from BottomNavigationDefaults.Elevation = 8.dp
Please add possibility to change bottom navigation elevation.
The scroll state is not saved in bottomNavigation if the tab has no title specified
My application is built for Desktop and Android and using IceRock Moko viewModels. Navigation works well but ViewModel recreating every time when user navigating between screens instead of store it while a screen in backstack.
Now I am including my viewModels with val viewModel = remember { MyScreenViewModel() }
. Or in case a Koin as DI with val viewModel = koinInject<MyScreenViewModel>()
.
It looks like Odyssey navigation should handling some lifecycle events and pass it to the ViewModel. Is it possible to implement it?
I haven't access to my parent RootController's NavigationGraph, because MultiStackRootController.findRootController()
doesn't return correct parentRootController
.
Example for bug reproducing (branch: odyssey_navigation_issue
): https://github.com/VitalyPeryatin/FinanceTracker/tree/odyssey_navigation_issue
This row crashes application:
rootController.findRootController().push(MainNavigationTree.AddTransaction.name)
Hello, I am trying to retrieve screen key with LocalRootController.current.currentScreen.value?.screen?.key
inside a screen Composable function. The problem is it calls several times with previous screen key and current screen key, so I can't differentiate what is the correct key of current screen. Could you please clarify how to retrieve current screen key?
It is not available to pass own app theme by setupNavigation()
function.
Way to achieve that: get code from setupNavigation and wrap ModalNavigator with own theme:
val navigationGraph: RootComposeBuilder.() -> Unit = {
screen("screen1") {
Screen1()
}
screen(name = "screen2") {
Screen2()
}
}
val rootController = RootComposeBuilder().apply(navigationGraph).build()
rootController.setupWithActivity(this)
setContent {
CompositionLocalProvider(
LocalRootController provides rootController
) {
AppTheme() {
ModalNavigator {
Navigator("main")
}
}
}
}
Would be awesome to have a tool to pass own app theme
If you are on the start screen and click on the "Back" button, then the application crashes. Exception stack trace:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.finance_tracker.finance_tracker, PID: 25018
java.util.NoSuchElementException: List is empty.
at kotlin.collections.CollectionsKt__MutableCollectionsKt.removeLast(MutableCollections.kt:255)
at ru.alexgladkov.odyssey.compose.RootController.removeTopScreen(RootController.kt:372)
at ru.alexgladkov.odyssey.compose.RootController.popBackStack(RootController.kt:199)
at ru.alexgladkov.odyssey.compose.controllers.MultiStackRootController.popBackStack(MultiStackRootController.kt:44)
at ru.alexgladkov.odyssey.compose.RootController.popBackStack(RootController.kt:198)
at ru.alexgladkov.odyssey.compose.RootController$setupBackPressedDispatcher$1.onBackPressed(RootController.kt:126)
at ru.alexgladkov.odyssey.core.backpress.OnBackPressedDispatcher.onBackPressed(OnBackPressedDispatcher.kt:7)
at ru.alexgladkov.odyssey.compose.extensions.RootController___LifeCycleKt$setupWithActivity$1.handleOnBackPressed(RootController + LifeCycle.kt:19)
at androidx.activity.OnBackPressedDispatcher.onBackPressed(OnBackPressedDispatcher.java:192)
at androidx.activity.ComponentActivity.onBackPressed(ComponentActivity.java:657)
at android.app.Activity.onKeyUp(Activity.java:3707)
at android.view.KeyEvent.dispatch(KeyEvent.java:2849)
at android.app.Activity.dispatchKeyEvent(Activity.java:4024)
at androidx.core.app.ComponentActivity.superDispatchKeyEvent(ComponentActivity.java:124)
at androidx.core.view.KeyEventDispatcher.dispatchKeyEvent(KeyEventDispatcher.java:86)
at androidx.core.app.ComponentActivity.dispatchKeyEvent(ComponentActivity.java:142)
at com.android.internal.policy.DecorView.dispatchKeyEvent(DecorView.java:389)
at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:5545)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:5413)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4918)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4971)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4937)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5077)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4945)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:5134)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4918)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4971)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4937)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:4945)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:4918)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:4971)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:4937)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5110)
at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:5273)
at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:3071)
at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:2614)
at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:2605)
at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:3048)
at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:143)
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:336)
at android.os.Looper.loop(Looper.java:181)
at android.app.ActivityThread.main(ActivityThread.java:7562)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
Hello, do you plan to add navigation support to dialogs?
example project: https://github.com/slartus/Moca/tree/sample/odyssey-desktop-bug
java.lang.NoSuchFieldError: end
at org.jetbrains.skia.impl.Library._nAfterLoad(Native Method)
at org.jetbrains.skia.impl.Library$Companion._nAfterLoad(Library.jvm.kt)
at org.jetbrains.skiko.Library.load(Library.kt:66)
at org.jetbrains.skiko.SkiaLayer.(SkiaLayer.jvm.kt:29)
at androidx.compose.ui.awt.ComposeLayer.(ComposeLayer.desktop.kt:73)
at androidx.compose.ui.awt.ComposePanel.addNotify(ComposePanel.desktop.kt:111)
at java.desktop/java.awt.Container.addNotify(Container.java:2800)
at java.desktop/javax.swing.JComponent.addNotify(JComponent.java:4791)
at java.desktop/java.awt.Container.addNotify(Container.java:2800)
at java.desktop/javax.swing.JComponent.addNotify(JComponent.java:4791)
at java.desktop/java.awt.Container.addNotify(Container.java:2800)
at java.desktop/javax.swing.JComponent.addNotify(JComponent.java:4791)
at java.desktop/javax.swing.JRootPane.addNotify(JRootPane.java:733)
at java.desktop/java.awt.Container.addNotify(Container.java:2800)
at java.desktop/java.awt.Window.addNotify(Window.java:787)
at java.desktop/java.awt.Frame.addNotify(Frame.java:490)
at java.desktop/java.awt.Window.show(Window.java:1049)
at java.desktop/java.awt.Component.show(Component.java:1732)
at java.desktop/java.awt.Component.setVisible(Component.java:1679)
at java.desktop/java.awt.Window.setVisible(Window.java:1032)
at SetupKt.setupNavigation(setup.kt:34)
Getting same error on app launch:
java.lang.IllegalArgumentException: CreationExtras must have a value by SAVED_STATE_REGISTRY_OWNER_KEY at androidx.lifecycle.SavedStateHandleSupport.createSavedStateHandle(SavedStateHandleSupport.kt:91)
Can be produced in the example project
было бы очень круто чтобы после переключения с одной вкладки customNavigation на другую, при последующем тапе на back мы не выходили из приложения а возвращались на какой-то дефолтный таб
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.