BaseViewModel with STATE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
abstract class BaseViewModel<STATE: Parcelable>(
private val savedStateHandle: SavedStateHandle,
private val defaultState: STATE
): ViewModel() {

private val KEY_STATE = "state"

val state: StateFlow<STATE> = savedStateHandle.getStateFlow(KEY_STATE, defaultState)

protected fun updateState(newState: STATE.() -> STATE) {
// see DataStore updateData
// get current state
savedStateHandle.get<STATE>(KEY_STATE)?.let { state ->
// simpan state baru ke savedStateHandle
savedStateHandle[KEY_STATE] = newState(state)
}
}
}

@Parcelize
data class MyState(
val text: String = ""
): Parcelable

@HiltViewModel
class MyViewModel @Inject constructor(
savedStateHandle: SavedStateHandle
): BaseViewModel<MyState>(
savedStateHandle = savedStateHandle,
defaultState = MyState()
) {

fun updateText(newText: String) {
updateState {
copy(
text = newText
)
}
}
}

@Composable
fun MyScreen(
viewModel: MyViewModel = hiltViewModel()
) {

// Observe state
val state by viewModel.state.collectAsStateWithLifecycle()

Box(
contentAlignment = Alignment.Center,
modifier = Modifier
.fillMaxSize()
) {
OutlinedTextField(
value = state.text,
onValueChange = viewModel::updateText
)
}
}

@AndroidEntryPoint
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
ComposeResearchTheme {
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
MyScreen()
}
}
}
}
}
ViewModel ViewState
Android PinEntryEditText
© 2020 qomg
Powered by hexo | Theme is blank