Как обновить пользовательский интерфейс с помощью viewModel для байтовых массивов и списков в Kotlin/Jetpack Compose?
Итак, проблема, с которой я сталкиваюсь, заключается в том, что при обновлении данных viewModel, похоже, не обновляется состояние моих байтовых массивов: ByteArray by (mutableStateOf) и mutableListOf() Когда я меняю страницы/возвращаюсь на страницу, он снова их обновляет . Как заставить представление обновляться для таких вещей, как списки и массивы байтов Является ли mutableStateOf неправильным способом обновления массивов байтов и списков? Я не мог найти ничего полезного.
Пример массива байтов, который не работает (использование этого кода с Float от mutableStateOf работает!).
Как я получаю данные в @Composable:
val Data = BluetoothMonitoring.shared.Data /*from a viewModel class, doesn't update when Data / bytearray /list changes, only when switching pages in app.*/
Сорт:
class BluetoothMonitoring : ViewModel(){
companion object {
val shared = BluetoothMonitoring()
}
var Data : ByteArray by mutableStateOf( ByteArray(11) { 0x00 })
}
Любая помощь приветствуется и заранее благодарна!
2 ответа
Как я обрабатываю байтовые массивы через Bluetooth с помощью kotlin и Android.
Я говорю sic (связь) с arduino через bluetooth в приложении , которое я делаю. Kotlin любит Byte, а Arduino любит UBYTE, поэтому я делаю все эти переводы в приложении, потому что потоки Kotlin — это простой встроенный код, а у телефона больше возможностей для таких вещей.
Добавьте toByte() ко всему, что исходит. <- (фактическое решение)
outS[8] = Color.alpha(word.color).toByte()
outS[9] = Color.red(word.color).toByte()
outS[10] = Color.green(word.color).toByte()
outS[11] = Color.blue(word.color).toByte()
outS[12] = 0.toByte()
outS[13] = 232.toByte()
outS[14] = 34.toByte()
outS[15] = 182.toByte()
//outS[16] = newline working without a newLine!
// outS[16] = newline
val os = getMyOutputStream()
if (os != null) {
os.write(outS)
}
Для входящих данных... Я должен изменить все на UByte. <- (фактическое решение)
val w: Word = wordViewModel.getWord(i)
if (w._id != 0) {
w.rechecked = (byteArray[7].toInt() != 0)
w.recolor = Color.argb(
byteArray[8].toUByte().toInt(),
byteArray[9].toUByte().toInt(),
byteArray[10].toUByte().toInt(),
byteArray[11].toUByte().toInt()
)
//finally update the word
wordViewModel.update(w)
}
Мой канал на Youtube посвящен моделям поездов, не кодирующих там какой-то андроид и электронику. И видео bluetootharduino android скоро выйдет, как сегодня вечером, так и завтра. Я работаю над приложением чуть больше месяца, используя его для изучения Kotlin. Проект на самом деле работает, но мне нужно вручную подключить Bluetooth, приложение фактически управляет отдельными неопикселями для моей модели поезда.
Кажется, вы пришли из IOS/Swift, где использование общих объектов является распространенным шаблоном.
В Android вы не должны создавать экземпляр модели представления вручную, вы должны использовать
ViewModelFactory
, или составитьviewModel()
функция.ViewModel
объект в основном сохраняет некоторые данные для вас при перекомпоновке действий, т. е. когда действие приостанавливается, возобновляется и т. д.Общий хороший способ структурирования вашего приложения — это использование UDF (однонаправленный поток данных), где данные текут вверх к представлению/компоновке, а события текут вниз к модели представления, уровню данных и т. д. Мы используем что-то, называемое как
Flow
который представляет собой реактивный поток данных, который обновляет прослушиватель всякий раз, когда изменяется какое-либо значение.
Помня об этих двух моментах, я создал очень краткий способ реструктуризации кода, чтобы он почти всегда работал. Пожалуйста, адаптируйте в соответствии с вашей логикой
class MyViewModel: ViewModel(){
// Declare a flow in the viewModel
var myData = MutableStateFlow(0)
fun modifyMyData(newData: Int){
myData = newData
}
}
И в вашем составном слое просмотра
@Composable
fun YourComposable(){
val myViewModel = viewModel()
val myUiState by myViewModel.myData.collectAsState()
// Now use your value, and change it, it will be changed accordingly and updated everywhere
}
Я также рекомендую прочитать эту кодовую лабораторию