Список статей, не обнаружающих измененийAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Список статей, не обнаружающих изменений

Сообщение Anonymous »

Я использую модель MVVM и столкнулся с проблемой с Stateflow, что я не могу найти решение. Возможно, я неправильно подхожу к проблеме. Я использую Stateflows для передачи изменений вдоль ViewModel, которая содержит список моделей и, в свою очередь, передает информацию в представление, которое отображает изменения. Я подражаю обновлениям сети с помощью Coroutines, которые просто увеличивают int каждую секунду.

Код: Выделить всё

/** 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»