Screen UI screen. фрагмент выводится загрузку нескольких файлов на сервер, для каждого файла выводится название, крестик отмены, байты (загружено/осталось) лоадер-крутилка, что текущий файл грузится. Была вся логика в Fragment и всё было хорошо, но тут решил переделать на Single UI State, как в рекомендациях гугла. Что происходит: делается emit во flow статуса экрана, который полностью перерисовывается. Проблема: flow так часто кидает события в collect(), что для каждого файла перерисовывается лоадер снова (его паркенсонит), на крестик отмены не успевает повеситься лисенер, как тут же стейт перерисовывается снова. debounce минимальный даже делать не вариант, т.к. теряется отзывчивость интейфейса. Коллеги, что делать в такой казалось бы простой ситуации?
А почему лоадер перерисовывается? И сколько обновлений в секунду? В View есть ведь тоже оптимизации, из серии если вы Visible меняете на Visible, то просто ничего не произойдет. Вы же не пересоздаете программно весь экран?
Ну перерисовывается экран, создаются новые view. Fragment не может хранить какого-то стейта по задумке (кешировать view)
Какая логика у вас прописана в collect? Судя по вашему описанию там прописано назначение лисенеров и вообще большая часть логики интерфейса. Там должно быть только изменение значения для лоадера. Крестик по идее вообще не должны трогать в этом методе. А тем более переназначать лисенер
Это как это не может? Во View нельзя же просто взять и на каждый апдейт экрана все грохнуть и заново создать. Нужно делать ручками diff если вы динамически создаёте View, и пересоздавать только при необходимости. Условно говоря если стейт это текст, то не надо на каждое обновление создавать TextView, надо один раз создать а потом сетить текст. View не предназначены для того, чтобы ими каждый кадр жонглировать)
Обсуждают сегодня