I like using raamcosta destinations for compose, it really makes things easy. It alow passing data between @Composable's, but after this I can initialize my ViewModel with the value.
Another "con" of using navigation arg is that you need to make sure the string is URL encoded. I said con with quotes because you can handle this pretty easily, but sometimes you forget to do that and can spend significant of time to find out why something isn't working as expected.
How can we share a value between main activity and a compose secreen in a different feature module..value is defined in main acitivity and i want to get it from the composable
what if I want to use navigation arguments to navigate to a screen that used a shared view model? It looks like that the saveStateHandle is not updated with navigation argument being it associated to the root of the graph
Because the API design of the shared preference is much more simpler than data store. So that this video can focus on the topic (instead of a lot of unnecessary unrelated code), I guess.
Thanks for sharing your knowledge 👍. As a beginner, I always used the first option to pass parameters between views. Now I can start testing different ways 😄
Hi, thanks for enlightening me. I am using DaggerHilt in a Jetpack Compose project with nested graph. So I chose to share a viewmodel which is graph scoped. But I am struggling to inject that sharedViewmodel into "children" viewmodels. Is there a way of doing this ? thanks
Help: It has been an increasing trend to have routes stored in a sealed class as objects, i am having trouble following up using my own code base because when i call the route i find it difficult to add the parameter i am passing as i am navigating, how can I do this?
I'm sharing a viewModel between a regular composable and a sheet, but the UI doesn't update when I change the sharedState in the viewModel from the sheet. How can I make it recompose when the value in the viewModel is updated?
how can I pass nullable value? for example, I need to pass Long (as LocalDateTime), and sometime this value can be nullable. If I pass null for that value, my application is crashing, because it's an exception about wrong navigation, can't find route
At the function call who gets nullable value, make it nullable and assign a value if null with " ?: " fun getTime(nullableVariable: Long ?: 0) Or before using nullable variable, check if it is null if (nullableVariable != null) { //do if not null... } else { //do if null... }
Hi Philipp, first thank you for the great tutorials.I have a question if you have time? In the last (persistent storage) example, if we want to clear the session every time the application is closed / destroyed, but we want the session to persist through the lifetime of the app, where is the appropriate place to clear it? Isn't onDestroy() called sometimes during process death? Thank you again!
In my current organization we use Singletons inside Repository to share users login data between different viewmodels, and they never experience any issue with that. I still don't understand why are you saying to avoid using Singleton classes to share data between. It is usuful when we need to access user's details in different pages.
Android Studio always raises warnings about memory leaks using Singleton. I'm also curious why they suggest using Singletons but at the same time warn about memory leaks.
@@antonhelsgaun I think that they mean that you might overuse singletons when they are not needed every time. If you use for example a singleton for a form, when you are in other parts of the app that singleton is still there using memory. However this can be mitigated by the use of scopes in the dependency injection framework.
I wish there was a better way of writing jetpack navigation better :\ anyway thank you for this lovely guide. is there a difference between @Singleton and object in kotlin?
Hi Philipp, love your videos. I have a question here, in your few previous videos you use raamcosta library as a navigation tool and lately I've seen you stop using it and I saw it also seems to provide an easy way to share data since it can share reference data. What disadvantage you discovered that made you stop using it?
@@PhilippLackner cool thanks, one more question. Why do you use sealed class when a sealed interface can do the job? Especially on the event rapper class where the classes inside the sealed class share no common data unlike the Resource class
In SharedViewModel approach, how can I reset the viewModel once I leave "personal_details" route?, it's always loading previous data onceI got back into it again.
One question, why do we have to redeclare a new mutable state in viewmodel and assign it to original stateflow. Is there any issue if create a stateflow in viewmodel and directly access it from composables? As long as i make sure that i am not writing anything to the state, is it fine? Ref: private val val sharedState = MutableStateFlow( value: 0) sharedState = _sharedState.asStateFlow)
That .asStateFlow() returns the stateflow as immutable. So the visible sharedState is immutable. This enforces that there is a single source of truth for that view state as only the view model can update it. This is something jetbrains said would be improved at some point in kotlin 2 🤞
Please make video on Oauth2 Authentication with Webview using Jetpack compose How the CallBackUrl retrieved from the api and retrieve access token to make api calls.
How to pass data to the previous screen Eg: I have two screen first screen is to show the list of some items from database and second screen is used to create an item. When I create an item from the second screen I want close that screen and show the updated list in the first screen
Save to db on the second screen and observe latest changes from the first screen by calling room again. Make sure your dao function, if dealing with a list for example, emits a flow. That makes it easy to read latest db items without any hassle.
@@PhilippLackner legend will let you know when I am done! Also, would be super cool to get some discount on your monthly subs for the freelancer group for those who bought the ultimate package:) just saying..
Another "con" of using navigation arg is that you need to make sure the string is URL encoded. I said con with quotes because you can handle this pretty easily, but sometimes you forget to do that and can spend significant of time to find out why something isn't working as expected.
man, let me say you something
you are the hero
as a beginner quite often i get confused
and watching your videos is the ONLY solution
I like using raamcosta destinations for compose, it really makes things easy. It alow passing data between @Composable's, but after this I can initialize my ViewModel with the value.
Another "con" of using navigation arg is that you need to make sure the string is URL encoded. I said con with quotes because you can handle this pretty easily, but sometimes you forget to do that and can spend significant of time to find out why something isn't working as expected.
you are right. By the way, Philipp didn't mentionate this and I am curious: is navigation arg only one way for using callBacks? thanks
Hi Phillip,
Can we have shared viewmodel and individual viewmodel for on one onboarding screen composable at same time?
It is great that put the source code of the video. thanks
Great tutorial, gave me a couple of good ideas for my own implementation. Thank you.
That's exactly what I needed! Thanks a lot
How can we share a value between main activity and a compose secreen in a different feature module..value is defined in main acitivity and i want to get it from the composable
what if I want to use navigation arguments to navigate to a screen that used a shared view model? It looks like that the saveStateHandle is not updated with navigation argument being it associated to the root of the graph
Hi Philipp. Very helpful video as always. I have a question: why are you using shared preferences instead of data store?
Because the API design of the shared preference is much more simpler than data store. So that this video can focus on the topic (instead of a lot of unnecessary unrelated code), I guess.
I am using hilt view model with compose destinations, pretty neat
Thanks for sharing your knowledge 👍. As a beginner, I always used the first option to pass parameters between views. Now I can start testing different ways 😄
Nice. Very clear 🙂
I really love the way you demonstrate thing ♥
but I think you should add the video to the compose playlist so we can find it easily
Hi, thanks for enlightening me. I am using DaggerHilt in a Jetpack Compose project with nested graph. So I chose to share a viewmodel which is graph scoped. But I am struggling to inject that sharedViewmodel into "children" viewmodels. Is there a way of doing this ? thanks
Helpful as always, Thanks!
Help:
It has been an increasing trend to have routes stored in a sealed class as objects, i am having trouble following up using my own code base because when i call the route i find it difficult to add the parameter i am passing as i am navigating, how can I do this?
I'm sharing a viewModel between a regular composable and a sheet, but the UI doesn't update when I change the sharedState in the viewModel from the sheet. How can I make it recompose when the value in the viewModel is updated?
Resolved, used mutableStateOf instead of MutableStateFlow, for anyone wondering 😁
@@JohanAlbrectsen why MutableStateFlow didn't work
how can I pass nullable value? for example, I need to pass Long (as LocalDateTime), and sometime this value can be nullable. If I pass null for that value, my application is crashing, because it's an exception about wrong navigation, can't find route
At the function call who gets nullable value, make it nullable and assign a value if null with " ?: "
fun getTime(nullableVariable: Long ?: 0)
Or before using nullable variable, check if it is null
if (nullableVariable != null) {
//do if not null...
} else {
//do if null...
}
Hi Philipp, first thank you for the great tutorials.I have a question if you have time?
In the last (persistent storage) example, if we want to clear the session every time the application is closed / destroyed, but we want the session to persist through the lifetime of the app, where is the appropriate place to clear it? Isn't onDestroy() called sometimes during process death?
Thank you again!
hi, this is not onDestroy(), look at 21:11, he is using fun clearSession(). Philipp told he call this functions when he need to log out
On the last option is using sqDelight a choice for Kotlin Multiplatform Mobile?
Hey Philipp , what about using compose destinations ?
In my current organization we use Singletons inside Repository to share users login data between different viewmodels, and they never experience any issue with that. I still don't understand why are you saying to avoid using Singleton classes to share data between. It is usuful when we need to access user's details in different pages.
Android Studio always raises warnings about memory leaks using Singleton. I'm also curious why they suggest using Singletons but at the same time warn about memory leaks.
@@aroxinghow does using a singleton leak memory? Isn't the whole point that it doesn't?
@@antonhelsgaun Ask Android API and Android Studio creators
@@antonhelsgaun I think that they mean that you might overuse singletons when they are not needed every time. If you use for example a singleton for a form, when you are in other parts of the app that singleton is still there using memory. However this can be mitigated by the use of scopes in the dependency injection framework.
Hi Philipp, I have a question about docker. Do we (android dev) need to learn docker or it just nice to know
No you don't
Not needed for android dev
It’s a backend tech
Does composition local work through configuration changes?
Hey Philipp. How to pass arguments to shared viewmodel?
I wish there was a better way of writing jetpack navigation better :\
anyway thank you for this lovely guide.
is there a difference between @Singleton and object in kotlin?
No, just one is for hilt annotation processing and the other is built into the language
Hi Philipp, love your videos. I have a question here, in your few previous videos you use raamcosta library as a navigation tool and lately I've seen you stop using it and I saw it also seems to provide an easy way to share data since it can share reference data. What disadvantage you discovered that made you stop using it?
I didn't stop using it, but I want my videos to be helpful for as many people as possible so I also use the official practices for such videos
@@PhilippLackner cool thanks, one more question. Why do you use sealed class when a sealed interface can do the job? Especially on the event rapper class where the classes inside the sealed class share no common data unlike the Resource class
In SharedViewModel approach, how can I reset the viewModel once I leave "personal_details" route?, it's always loading previous data onceI got back into it again.
The whole graph needs to be popped from the backstack to clear it
One question, why do we have to redeclare a new mutable state in viewmodel and assign it to original stateflow. Is there any issue if create a stateflow in viewmodel and directly access it from composables? As long as i make sure that i am not writing anything to the state, is it fine?
Ref: private val val sharedState = MutableStateFlow( value: 0)
sharedState = _sharedState.asStateFlow)
That .asStateFlow() returns the stateflow as immutable. So the visible sharedState is immutable. This enforces that there is a single source of truth for that view state as only the view model can update it. This is something jetbrains said would be improved at some point in kotlin 2 🤞
How can we make favorite item to database and when colse app and run it again the fav button will be active based on database ?
Please make video on Oauth2 Authentication with Webview using Jetpack compose
How the CallBackUrl retrieved from the api and retrieve access token to make api calls.
Well you can't use WebView for oauth due to security reasons. But you can use custom tabs.
@@ayodelekehinde can tell me about more
@@kevalkanpariya On how to use custom tabs??
How to pass data to the previous screen
Eg: I have two screen first screen is to show the list of some items from database and second screen is used to create an item. When I create an item from the second screen I want close that screen and show the updated list in the first screen
ActivityResultApi
Viewmodel with stateflows should work for this
Save to db on the second screen and observe latest changes from the first screen by calling room again. Make sure your dao function, if dealing with a list for example, emits a flow. That makes it easy to read latest db items without any hassle.
can any one tell me how to pass a custom model class object with navigation and what Navtype should i use, please help me
14:12 why not to use Object?
Great video
does passed intent arguments survive process death?
Global Singleton would be perfect for login state imo
When you try jetpack compose multiplataform ?
how to use hilt shared viewmodel
How to send parcelable object to start destination
Can we share complex object data without using SharedViewModel ?
how to properly share with activity please tell me
what about Preferences DataStore?
It seems to me that data binding in xml layout projects is easy, but it more hell then compose
Thanks
I use bundle
In what order shall we take all your courses?!
They don't depend on each other, so as you like 👍🏼
@@PhilippLackner legend will let you know when I am done! Also, would be super cool to get some discount on your monthly subs for the freelancer group for those who bought the ultimate package:) just saying..
Im still hard to understand navigation in compose :(
🎉
flutter is best to send data from one screen to other
your english so fast, please make it slow
0.8x your TH-cam
Hello Mr.Pilipp
Could you make an app with multi-module and navigation, and the app consists of two types of user.
Thanks a lot 🤍
Another "con" of using navigation arg is that you need to make sure the string is URL encoded. I said con with quotes because you can handle this pretty easily, but sometimes you forget to do that and can spend significant of time to find out why something isn't working as expected.
I once spent 3hrs on this little thing. Very painful experience.
I got snagged on this early on
They should have made it some kind of standard hint
Thanks