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)
- Screen transition broken in 1.1.0-beta02
- Can't pop root in Compose for Desktop
- [Desktop] Density is not updated on changing the window to a screen with different density
- [KMP ViewModels][Voyager][Koin] Crush if you try to navigate back
- Override the back press in each Screen in Compose Multiplatform HOT 3
- Snackbar overlapped by BottomSheet when using BottomSheetNavigator
- HorizontalPager HOT 1
- [WASM] [Font] tofu are displayed instead of the actual font HOT 1
- Android Activity Lifecycle events stop being forwarded by AndroidScreenLifecycleOwner after screen rotation
- BottomSheetNavigator - IOS Build error HOT 4
- Navigation testing
- Problem with @Transient during Screen serialization
- 最新版本打包ios 会报错
- Need a dialog box style screen navigator
- Pass data to previous composable screens
- Crash when take picture HOT 4
- Voyager-Worker HOT 1
- Wasm URL routing support HOT 1
- Lifecycle Events Not Triggered During Screen Navigation HOT 4
- ScreenModel function goes into infinite loop when calling from screen HOT 2
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.