Пишу сервис для общения: добрался до окна переписки
Как-то так получилось, очень много времени потратил на разбор ошибки, которая потом самоликвидировалась:
Надеюсь ликвидировалась с концами. В чем была проблема: нужно получить из локальной базы данных переписку пользователя. Эта база синхронизируется с сервером, приложение использует ее для вывода сообщений на экран.
Взять из БД и вывести все сообщения - это легко. Но мы же знаем к чему это может привести, когда сообщений тысячи. Так что просто брать и грузить все что есть в память - это тупиковый путь. Хотя... Если ты хомяк, у тебя нет конечной цели, есть только путь... то почему бы не заниматься абсолютно бесперспективной и бесцельной ерундой 😂
В итоге брал из БД сообщения и подгружал по мере необходимости. И так пока пользователь не доберется до начала переписки.
Проблемы были в момент подгрузки:
1) ListView.builder дергался
2) В момент подгрузки скрол терял каcание экрана
В итоге как-то само собой разрешилось. Нужно было всего лишь выставить reverse: true и еще какие-то мелочи специфичные сделать. Так и не понял что за "магия", но ладно.
Дело в том, что многие компоненты достаточно навороченные и под капотом много чего сами по себе делают. А еще сверху машина Flutter производит свои манипуляции. В общем, тонкостей хватает. Вот первый вариант сообщений в истории переписки:
Да-да, знаю что так себе выглядит. Внешний вид буду дорабатывать позже. Главное вынес все компоненты в разные классы, раскидал их на основе функций. Таким образом можно будет работать с каждым компонентом отдельно.
Нужны эмоджи? Пожалуйста, их тоже добавил и продумал задолго до работы над чатом 😂
Вот они:
Сообщения представляют из себя числа. Почему числа? Чтобы было проще видеть порядок и отследить ошибки.
Сдается мне я как всегда что-то не продумал и узнаю об этом в конце и это приведет к тому, что всю работу придется поставить с ног на голову. Но увидим, пока, вроде, получается.
Забыл добавить курсорную синхронизацию сообщений и эмоджи. Так что сообщения прилетели не с сервера, а пока из локальной БД (телефона) в которой их создал ручками.
Слева находится аватарка собеседника. Ее нужно подгрузить с профилем, сторис и прочим. Еще не сделал, но это следующая задача. В списке чатов эти данные подгружаются. Нужно бы и в переписку подобным образом грузить. А вообще, хорошо бы доработать сущность модели профиля пользователя, сейчас она немного аморфная.
А медиа можно передавать?
Вот медиа из БД в переписке, их тоже заранее продумал:
Да, да, сам в шоке от того как это выглядит, но и TotalReload ближе к началу выглядел так:
К концу вот так:
Так что не переживайте, все будет 😀
На ближайшее время запланирована работа над отображением профиля собеседника, синхронизация переписки и эмоджи.
Что с синхронизацией
Вообще, меня терзают смутные сомнения. Дело в том, что на форуме подсказали "просто синхронизируй". Но сдается мне что нужно "батчить". Из геймдева мне известно, что есть такие вещи как Пулинг и Батчинг. И это прям катастрофически важные механизмы, которые позволяют оптимизировать производительность. Пулинг - это, условно, умное хранение данных в ОЗУ. Устройства не любят постоянно обращаться к жесткому диску (или еще куда-то) для доступа к данным. Для этого используется пулинг.
А батчинг - это в основном про GPU (про видеокарту). Обьекты в сцене обьединяются в пачки и пачками подаются видеокарте для обработки. Видеокрты очень любят работать с "однородными" данными (пачками) и с радостью обрабатывают их всеми своими ядрами. За счет этого можно, условно, отрисовать 1000 сфер и иметь 30 ФПС. Без батчинга на той же карте можно, условно, отрисовать 50 сфер с тем же ФПС.
Разницу улавливаете, имеет смысл вникнуть в тему поглубже? Думаю ответ очевиден.
Так вот, пробегусь по вопросу насчет того как батчинг сказывается на производительности. Сдается мне что передавать данные по сети лучше пачками.
Пока на этом все. Если появятся новости, то обязательно сообщу.
--
По вечерам разрабатываю сервис для общения. Кому интересен сервис для общения, можете подписаться куда-нибудь на меня, попробуете его в числе первых.
Постепенно буду продолжать делиться успехами разработки.































