Android Compose MutableStateFlow: добавление в Set не требует рекомпозицииAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Android Compose MutableStateFlow: добавление в Set не требует рекомпозиции

Сообщение Anonymous »

По этому поводу возникает много похожих вопросов, но их использование меняется; это единственный вопрос, который я нашел, который касается конкретно MutableSets, MutableStateFlows и CollectAsState().
Проблема в том, что когда я добавляю элемент в свой MutableSet, составной элемент не перекомпоновать. Следующий код настолько прост, насколько я могу его понять, но при этом показывает проблему.
Viewmodel

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

class MyViewmodel : ViewModel() {

private val _infoSet = MutableStateFlow(mutableSetOf())
val infoSet = _infoSet.asStateFlow()

fun add() {
val newInfo = MyInfo(num = infoSet.value.size + 1)
_infoSet.value.add(newInfo)
Log.d(TAG, "infoSet is now ${infoSet.value}")
}
}

data class MyInfo(
val name: String = "foo",
val num: Int = -1
)
MainActivity

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

class MainActivity : ComponentActivity() {

private lateinit var myViewmodel: MyViewmodel

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()

myViewmodel = MyViewmodel()

setContent {
val infoSet by myViewmodel.infoSet.collectAsStateWithLifecycle()
RecompositionTestTheme {
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
DrawStuff(
modifier = Modifier.padding(innerPadding),
infoSet = infoSet,
myViewmodel
)
}
}
}
}
}

@Composable
fun DrawStuff(
modifier: Modifier = Modifier,
infoSet: Set,
viewmodel: MyViewmodel
) {
Log.d(TAG, "DrawStuff() start")
LazyColumn(modifier = modifier.safeDrawingPadding()) {
item { Text("This should display a Set of MyInfo") }
item {
Button(
onClick = {
viewmodel.add()
Toast.makeText(ctx, "infoSet = $infoSet", Toast.LENGTH_SHORT).show()
}
) { Text("add") }
}

// the MyInfo list
infoSet.forEach { info ->
Log.d(TAG, "listing the MyInfos $info")
item {
Text("${info.name}, ${info.num}")
}
}
}
}
Операторы журнала показывают, что нажатие кнопки вызывает MyViewmodel.add(). Но журналы также ясно показывают, что DrawStuff не вызывается. Неожиданно во всплывающем сообщении отображается корректная информация.
Я что-то делаю не так? Что мне нужно сделать, чтобы DrawStuff() отображал содержимое infoSet при его изменении? (Примечание. Я проводил тесты, в которых в infoSet были предварительно загружены данные. Он отрисовывается правильно, но по-прежнему не меняется при добавлении элементов.)

Подробнее здесь: https://stackoverflow.com/questions/792 ... omposition
Ответить

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

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

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

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

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