Фрагмент не обновляется при изменении состоянияAndroid

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

Сообщение Anonymous »


Я работаю с Flow и MutateStates в Kotlin. У меня есть список Data в моей viewModel, который соответствует нескольким различным фрагментам. В соответствии с моим предыдущим вопросом SO «Обновлены только необходимые компоненты в MutableStateFlow», я использовал предложенное решение, чтобы каждый отдельный фрагмент получил свой собственный поток. Однако мои фрагменты не обновляются после изменения моих данных. Мне интересно, делаю ли я что-то неправильно. Вот мой код:

AppViewModel

класс AppViewModel : ViewModel() { var dataList: MutableStateFlow = MutableStateFlow(listOf()); весело getDataForFragment(index: Int): Flow = dataList.map { it[index] }.distinctUntilChanged() весело updateStateFlow (индекс: Int, данные: DeviceData) { Log.d("stateFlow", "updateStateFlow") dataList.value = dataList.value.toMutableList().apply { это[индекс] = данные } Log.d("stateFlow", dataList.value.get(index).toString()) } весело addStateFlow() { вар deviceData_ = DeviceData() dataList.value = dataList.value.toMutableList().apply { this.add(deviceData_) } } } DeviceFragment

class DeviceFragment : Fragment() { частный val viewModel: AppViewModel от ActivityViewModels() частный var _binding: FragmentDeviceBinding? = ноль частная привязка val get() = _binding!! индекс частной переменной: Int? = ноль переопределить fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } @RequiresApi(Build.VERSION_CODES.O) переопределить удовольствие onCreateView( надуватель: LayoutInflater, контейнер: ViewGroup?, saveInstanceState: Пакет? ): Вид? { _binding = FragmentDeviceBinding.inflate(инфлятор) val Bundle = this.arguments индекс = пакет!!.getInt("индекс", 0) вернуть привязку.корень } @RequiresApi(Build.VERSION_CODES.O) переопределить fun onViewCreated(view: View, saveInstanceState: Bundle?) { super.onViewCreated(просмотр, сохраненныйInstanceState) viewModel.viewModelScope.launch { наблюдатели() } } частные наблюдатели за развлечениями() { lifecycleScope.launchWhenResumed { индекс?.let { viewModel.getDataForFragment(it).collect { привязка.circularProgressView.setProgress(it.progress) привязка.применить { ... } } } значение ПОРОГ = 51.0f индекс?.let { это -> viewModel.getDataForFragment(it).debounce(500)?.collect { значение val = it.probability; if (value != 0.0F) { //избегаем вызова в начале приложения если (значение > ПОРОГ) { Log.d("stateFlow", "ДАТЧИК ОБНАРУЖЕН") датчикобнаружен() } } } } } } приватная приостановка развлечения SensorDetected() { if (index?.let { viewModel.getDataForFragment(it).first().detectCount } == 0) { Log.d("stateFlow", "вызов датчика") обновлениеДетекторUI() } } частная приостановка развлечения updateDetectorUI() { когда (index?.let { viewModel.getDataForFragment(it).first().detectCount }) { 0 -> { привязка.circularProgressView.setProgress(100f) ChangeTintColors(R.color.tint_green) } 1 -> { ChangeTintColors(R.color.tint_purple) } 2 -> изменитьTintColors(R.color.tint_purple) 3 -> изменитьTintColors(R.color.tint_red) еще -> { привязка.circularProgressView.setProgress(100f) ChangeTintColors(R.color.tint_green) } } } переопределить удовольствие onDestroy() { супер.onDestroy() _binding = ноль } } Когда я запускаю свое приложение, я получаю журналы updateStateFlow с правильными данными. Однако журналы из DeviceFragment не отображаются, несмотря на то, что это имеет смысл (значения соответствуют условиям в коде).

ОБНОВЛЕНИЕ: кажется, что-то не так с тем, как я обновляю свой поток, но я не могу понять, в чем дело:/
Ответить

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

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

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

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

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