Comments (2)
You can use Kotlin callback functions.
YourViewModel / ScreenModel {
suspend fun loginUser(context: Context, response:(succes: LoginResponseModel?,error: String?) -> Unit){
withContext(Dispatchers.IO){
repository.loginUser() { response, error ->
response?.let {
response(it,null)
}
error?.let {
response(null,it)
}
}
}
}
}
call above function in your compose like
scope.launch{
viewModel.login(context){response, error ->
response?.let{
//Succed navigate Home Screen
}
error?.let{
//failed navigate bottomsheet to show fail message
}
}
}
from voyager.
I've created this solution after small investigation
This is not completed yet, but can show the main idea
Idea is simple: build proxy VoyagerRouter
for voyager navigator and ViewModel, DI provide instance of VoyagerRouter to ViewModel and also to compose component
class VoyagerRouter {
private val sharedFlow = MutableSharedFlow<VoyagerEvent>(extraBufferCapacity = 1)
fun events(): SharedFlow<VoyagerEvent> {
return sharedFlow.asSharedFlow()
}
fun navigateTo(screen: Screen) {
sharedFlow.tryEmit(VoyagerEvent.NavigateTo(screen))
}
fun newRootScreen(screen: Screen) {
sharedFlow.tryEmit(VoyagerEvent.NewRootScreen(screen))
}
fun back() {
sharedFlow.tryEmit(VoyagerEvent.Back)
}
}
sealed class VoyagerEvent {
data class NavigateTo(val screen: Screen) : VoyagerEvent()
data class NewRootScreen(val screen: Screen) : VoyagerEvent()
data object Back : VoyagerEvent()
}
@Composable
fun FlowComponent(
screen: Screen,
scopeName: String = "",
content: @Composable () -> Unit = {},
) = DIScope(scopeName = scopeName) { // DIScope is my own DI wrapper for compose
Navigator(screen) {
val navigator = LocalNavigator.currentOrThrow
// here my way to get router from DI, will depend on yours DI
val router = LocalDIScope.current!!.getInstance<VoyagerRouter>()
LaunchedEffect(scopeName) {
router.events()
.collect { event ->
when (event) {
is VoyagerEvent.NavigateTo -> navigator.push(event.screen)
is VoyagerEvent.NewRootScreen -> navigator.replaceAll(event.screen)
is VoyagerEvent.Back -> navigator.pop()
}
}
}
val currentScreen = navigator.lastItem
navigator.saveableState("currentScreen") {
currentScreen.Content()
}
}
// here will be content for your screen
content()
}
from voyager.
Related Issues (20)
- ScreenModel function goes into infinite loop when calling from screen HOT 2
- Screen Overridable Content function call multipleTimes when pass data from one Screen to another in Android project.
- Crash on implementing ScreenLifecycleOwner HOT 2
- Crashing When The App Starts Up Again, After been Minimized For a period of Time HOT 1
- App Crashes, When The Button to Navigate to Another Screen, Is Pressed Twice in Succession
- Help on using new navigatorViewModel
- IllegalStateException when close window on Compose Multiplatform for Desktop
- viewmodel not destroy in recomposition state HOT 1
- TabNavigator not Allowing Theme change HOT 3
- Provide onDispose callback in the LifecycleEffectOnce api HOT 1
- ReferenceError: getCachedJsObject is not defined HOT 3
- TabNavigator inside Screen not working
- System WindowInsets Not Consumed on iOS Targets When using Nested Navigators HOT 6
- Tab Navigator Deeplink HOT 1
- Not working with latest version of compose multiplatform and kotlin HOT 1
- TabNavigator
- android.os.BadParcelableException: Parcelable encountered IOException when screen is off
- Can't switch dark theme in compose-m3 1.2.0+ and NestedNavigator HOT 1
- Difference between Navigator and BottomSheetNavigator APIs
- the android app restart/recreate all over each time I minimize the app HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from voyager.