Код: Выделить всё
/** Model that holds an Int and increments every second to simulate network updates */
class MySimpleModel(
startValue: Int,
coroutineScope: CoroutineScope
) {
private val _x = MutableStateFlow(startValue)
val x = _x.asStateFlow()
init {
coroutineScope.launch {
while (true) {
delay(1000)
_x.update { it + 1 } // increment every second
Log.d("MySimpleModel", "x -> ${x.value}")
}
}
}
}
< /code>
viewmodel < /h3>
Этот ViewModel содержит список моделей. Количество моделей является динамическим и может увеличиваться или уменьшаться в любое время. Это эмулируется, начиная без моделей, ожидая две секунды, а затем добавив две модели. Дополнительные модели могут быть добавлены, вызывая add () , и это, кажется, будет RUB. Данные моделей не обновляются каждую секунду (даже если оператор log в MySimpleModel указывает, что он обновляется).
Однако, когда добавлена новая модель, данные обновление. Но просто один раз; Второе увеличение игнорируется. < /p>
Код: Выделить всё
class MySimpleViewmodel : ViewModel() {
private val _modelList = MutableStateFlow(listOf())
val modelList = _modelList.asStateFlow()
init {
// make a list after 2 seconds
viewModelScope.launch {
delay(2000)
_modelList.update {
listOf(
MySimpleModel(3, viewModelScope),
MySimpleModel(78, viewModelScope)
)
}
}
}
fun add(dataToAdd: MySimpleModel) {
_modelList.update {
it + dataToAdd
}
}
}
< /code>
view < /h3>
и для полноты, вот представление (также значительно упрощено).
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
val viewmodel = MySimpleViewmodel()
val modelList = viewmodel.modelList.collectAsStateWithLifecycle()
FlowTest4listOfFlowsTheme {
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
SimpleMainScreen(
modifier = Modifier.padding(innerPadding),
viewmodel = viewmodel,
modelList.value
)
}
}
}
}
}
@Composable
private fun SimpleMainScreen(
modifier: Modifier,
viewmodel: MySimpleViewmodel,
modelList: List
) {
Column(
modifier = modifier
) {
// buttons
Row {
Button(
onClick = { viewmodel.add(MySimpleModel(6, viewmodel.viewModelScope)) }
) { Text("add") }
}
// the data
modelList.forEach { model ->
Text(text = "${model.x.value}")
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... ng-changes
Мобильная версия