Status Update
Comments
es...@gmail.com <es...@gmail.com> #2
I tried applying this in a trial project and found that there is a lot of room for improvement. I tried improving it as much as I could based on a project I'm working on. It should scale as much as it could and be reusable in other projects.
I have attached the project in this comment. The package structure might be confusing as it is not separated by modules.
You can see there 2 MainScreen
. MainScreen
is implemented with my Navigation Structure (Not working due to no non-reified api). MainScreenB
is implemented with manually hard-coded navigation and partially using MainNavigation
for BottomNavigation
.
There is also Screen3RootA
and Screen3RootB
which is implemented in the same fashion but Screen3RootB
is implemented manually using DestinationComposable
.
You might notice there are reified functions inside the companion object
of the classes which is supposedly in the class directly but I tried hacking my way through the reified navigation apis
for demonstration purposes.
There is one weird bug when navigating to Screen2
from Screen3
then tapping Screen2
in the BottomNavigation
but it could be mitigated by returning from the function call if the tab is currently selected.
You may find the Classes and Interfaces I used in navigation
package
es...@gmail.com <es...@gmail.com> #3
The requests needed here are also inlined with
es...@gmail.com <es...@gmail.com> #4
I noticed some inconsistencies between MainScreen
and MainScreenB
so I did some adjustments.
es...@gmail.com <es...@gmail.com> #5
I did something illegal and Suppressed RestrictedApi
Lint Checks
Now the whole ComposeNavigation
is working. I added KSerializer<T>
as a parameter on DestinationComposable
so that I could get the DestinationObject
through NavBackStackEntry.toRoute()
under the hood. Adding the KSerializer
as a parameter also helps in making sure that the Destination
is Serializeable
.
I just can't get around the bug wherein Screen2 doesn't retain its arguments and creates a new one including the viewModel. I'm not sure if it's an intended feature or not since it is the startDestination of the nestedGraph. I can probably get around it by providing a separate savedStateHandle Key. I'll just create a new issue with a trimmed down version just in case.
ap...@google.com <ap...@google.com> #6
Project: platform/frameworks/support
Branch: androidx-main
Author: Clara Fok <
Link:
Add non-reified overloads for toRoute
Expand for full commit details
Add non-reified overloads for toRoute
NavBackStackEntry.toRoute and SavedStateHandle.toRoute overloads that take a KClass<*> as route and returns T.
Test: existing tests pass
Bug: 366291612
Relnote: "Added non-reified overload for NavBackStackEntry.toRoute and SavedStateHandle.toRoute that takes in a KClass<*> as route"
Change-Id: Ic1bf09bdd59e0d96db7edb89276ac31a977d6602
Files:
- M
navigation/navigation-common/api/current.txt
- M
navigation/navigation-common/api/restricted_current.txt
- M
navigation/navigation-common/src/main/java/androidx/navigation/NavBackStackEntry.kt
- M
navigation/navigation-common/src/main/java/androidx/navigation/SavedStateHandle.kt
Hash: 2c4a084bdbe543ded4b6d203c6636fc825e7e301
Date: Wed Nov 06 16:22:20 2024
cl...@google.com <cl...@google.com>
es...@gmail.com <es...@gmail.com> #7
I think its also better to add non-reified dialog
. I might have a use case for it soon.
ap...@google.com <ap...@google.com> #8
Project: platform/frameworks/support
Branch: androidx-main
Author: Clara Fok <
Link:
Add non-reified overload for composable and navigation
Expand for full commit details
Add non-reified overload for composable and navigation
Overloads that take a KClass<*> as the route for composable destination and nested graph
Test: existing tests
Bug: 366291612
Relnote: "Added overloads for NavGraphBuilder.composable and NavGraphBuilder.navigation that takes a KClass<*> as the route."
Change-Id: If56a553a4d2608a5eb059ea684e566a4feae955b
Files:
- M
navigation/navigation-compose/api/current.txt
- M
navigation/navigation-compose/api/restricted_current.txt
- M
navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavGraphBuilder.kt
Hash: 9cd16b12e255b5e7ad3c8cc7fca08dc63faf9e52
Date: Wed Nov 27 14:08:15 2024
cl...@google.com <cl...@google.com> #9
Fixed internally and available in navigation-2.9.0-alpha04
ap...@google.com <ap...@google.com> #10
Project: platform/frameworks/support
Branch: androidx-main
Author: Clara Fok <
Link:
Add non-reified NavGraphBuilder.dialog safe args api
Expand for full commit details
Add non-reified NavGraphBuilder.dialog safe args api
Test: ./gradlew navigation:navigation-compose:cC
Bug: 366291612
Relnote: "Added non-reified NavGraphBuilder.dialog API to create a composable dialog with KClass<T>"
Change-Id: Iba4ee26b906c09e7ec47b7e940cf689788c117e8
Files:
- M
navigation/navigation-compose/api/current.txt
- M
navigation/navigation-compose/api/restricted_current.txt
- M
navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavGraphBuilderTest.kt
- M
navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavGraphBuilder.kt
Hash: f96150f5be412aa3d660efd83ba07d439e1da211
Date: Wed Dec 04 13:51:14 2024
ap...@google.com <ap...@google.com> #11
Project: platform/frameworks/support
Branch: androidx-main
Author: Clara Fok <
Link:
Update non-reified composable and navigation
Expand for full commit details
Update non-reified composable and navigation
Added <T : Any> type parameter to the API
Test: ./gradlew navigation:navigation-compose:cC
Bug: 366291612
Relnote: "Non-reified composable and navigation API expects route from KClass<T> instead of KClass<*>"
Change-Id: Icd47da4061103edd8462a729ae168e724d833d36
Files:
- M
navigation/navigation-compose/api/current.txt
- M
navigation/navigation-compose/api/restricted_current.txt
- M
navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavGraphBuilderTest.kt
- M
navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavGraphBuilder.kt
Hash: 653f2ea988ff3744ecf3de08c3221c4ee8c64917
Date: Wed Dec 04 13:41:46 2024
pr...@google.com <pr...@google.com> #12
The following release(s) address this bug.It is possible this bug has only been partially addressed:
androidx.navigation:navigation-common:2.9.0-alpha04
androidx.navigation:navigation-compose:2.9.0-alpha04
Description
Component used: Navigation Version used: 2.8.0
I'm currently using Voyager but decided to try migrating to Compose Navigation as it already provides better type-safety. However, I find it difficult to migrate since the Api is lacking in some way while there are some that are available but is only limited to the Library Scope.
This is in conjunction with Issue 361863272
I would like to request non-reified
navigation
,composable
, andNavBackStackEntry.toRoute()
wherein you can enter the class's KClass as a parameter.Voyager provides
Screen
, andTab
interfaces which could easily be implemented and extended to another interface or abstract class wherein you could create a common Class with common implementations you can tailor according to your needs. Compose Navigation currently doesn't support this but it is much more scalable especially with deeplinks.Migration to Compose Navigation without any interface proves to be difficult unless the above requested are given. I have here an example implementation of interfaces. I don't know how much effective it will be but technically it could be applied to my project to some extent since there are a lot of caveats I don't know of. It would be much better if Compose Team can provide similar interfaces which could greatly boost migration to the library.