Android Compose MutableStateFlow: добавление в SET не вызывает переоборудованияAndroid

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

Сообщение Anonymous »

Существует много подобных вопросов по этому поводу, но использование изменилось; Это единственный вопрос, который я обнаружил, в котором говорится конкретно о мутабелях, Mutablestateflows и CollectSstate (). < /p>
Проблема в том, что когда я добавляю элемент в свой мутирец, композиция не переполняется. Следующий код настолько прост, насколько я могу его получить, и до сих пор показываю проблему.

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

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
)
< /code>
 mainActivity < /h2>
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}")
}
}
}
}
< /code>
Операторы журнала показывают, что нажатие кнопки вызывает MyViewModel.add ().  Но журналы также ясно показывают, что DrawStuff не вызывается.  Неосновательно в сообщении Toast правильно показывает информацию.  Что мне нужно сделать, чтобы получить DraitStuff () 
, чтобы отобразить содержимое Infoset при его изменении? (Примечание: я провел тесты, где Infoset был предварительно загружен данными. Он рисует правильно, но все еще не изменяется, когда добавляются элементы.)

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

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

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

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

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

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