@Composable
private
fun MyScreenContent(
uiState: MyUiState,
onToggleClicked: (Boolean) -> Unit
) {
Column {
if
(uiState.error !=
null
) {
ErrorMessageCard(message = uiState.error.message ?:
"Unknown error"
)
}
ToggleButton(uiState.isToggleOn) { toggleValue ->
onToggleClicked(toggleValue)
}
}
}
@Composable
fun ErrorMessageCard(
message: String,
contentPadding: Dp =
8
.dp,
icon: ImageVector = Icons.Default.Error,
color: Color = MaterialTheme.colors.error
) {
Card(
modifier = Modifier
.fillMaxWidth()
) {
Row(
modifier = Modifier.padding(contentPadding),
verticalAlignment = Alignment.CenterVertically
) {
Image(
imageVector = icon,
contentDescription =
null
,
colorFilter = ColorFilter.tint(color)
)
Text(
modifier = Modifier.padding(
8
.dp),
text = message,
color = color
)
}
}
}
@Composable
private
fun ToggleButton(
isOn: Boolean,
onClicked: (Boolean) -> Unit
) {
Button(onClick = { onClicked(!isOn) }) {
Text(text =
if
(isOn)
"Off"
else
"On"
)
}
}
class
MyViewModel (
private
val repository: MyRepository): ViewModel() {
var uiState by mutableStateOf(MyUiState())
private
set
fun onToggleClicked(toggleValue: Boolean) {
viewModelScope.launch {
repository.updateToggle(toggleValue)
.onFailure { th ->
uiState = uiState.copy(error = th)
}
.onSuccess {
uiState = uiState.copy(isToggleOn =
true
)
}
}
}
}
data
class
MyUiState(
val error: Throwable? =
null
,
val isToggleOn: Boolean =
false
)
class
MyRepository {
suspend fun updateToggle(value: Boolean): Result<Boolean> = withContext(Dispatchers.IO) {
Result.success(
true
)
}
}