Skip to content

Instantly share code, notes, and snippets.

@ghasemdev
Last active November 29, 2023 06:02
Show Gist options
  • Save ghasemdev/8bf6d5d5babc9b4e5d42ef5e5f1f1f16 to your computer and use it in GitHub Desktop.
Save ghasemdev/8bf6d5d5babc9b4e5d42ef5e5f1f1f16 to your computer and use it in GitHub Desktop.
MVI
sealed interface LoginAction {
data object NavigateToTerm: LoginAction
data object Login: LoginAction
data object ShowDialog: LoginAction
data object HideDialog: LoginAction
}
sealed interface LoginEffect {
data object NavigateToHome: LoginEffect
data object ShowSnackBar: LoginEffect
data object ShowBottomSheet: LoginEffect
}
@Composable
fun LoginScreen(navController: NavController) {
RegisterScreen(
navController = navController,
viewModel = hiltViewModel()
)
}
@Composable
private fun LoginScreen(navController: NavController, viewModel: LoginViewModel) {
val viewState by viewModel.state.collectAsStateWithlifeCycle()
LaunchEffect(Unit) {
viewModel.effect.collectLatest{
// Handle Effect like navigation or snackbar
}
}
RegisterScreen(
viewState = navController,
onAction = {
when(it) {
is NavigateToTerms -> {
// Navigate
}
else -> viewModel.onAction(it)
}
}
)
}
@Composable
private fun LoginScreen(viewState: LoginViewState, onAction: (LoginAction) -> Unit)) {
// UI
}
class LoginViewModel: ViewModel() {
val state: // stateFlow
val effect: // chanell
fun onAction(action: LoginAction) {
when (action) {
//
}
}
private fun //
}
data class LoginViewState (
val isLoading: Boolean,
val username: String,
val password: String
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment