в корутинах и всякиз сайд эффектах нуб.
И возникла такая проблема, код вызывает одну компоузабл функцию из либы, имплементацию либы поменять сложно, т.к даже код из этой либы автосгенерирован.
Схема внутри этого компоузабла примерно такая:
Большая куча параметров функции висит в remember (), из него лепится запрос к бекенду для GraphQL, который запускают через LaunchedEffect
Проблема такая что на 1 входящий запрос (вызов) этот composable выполняет лямбду переданную в качестве onSucess() колбэка дважды, собственно и вызов LaunchedEffect внутри отрабатыает дважды.
Я так понимаю причина этого в том что remeber шалит с рекомпозициями, верно? Если так, то можно ли извне заставить рисовать это добро без рекомпозиций с 0, что и содержание функции и колбэки на успешное завершение запроса отработали 1 раз?
Ключи не должны меняться чтобы ремембер/эффект снова не срабатывали
Выглдяит все так с моей стороны: сначала этот composable изначально вызывается с 1 набором значений параметров, все ок. Потом набор параметров меняется для 2-го вызова и начинается черная магия (в магию давно не верю, просто не разобрался что не так идет) 1. Laucnhed effect вызывается 2 раза, с одинаковыми параметрами на входе 2. На 2 исполнения query соответсвенно логике вызывается 2 раза лямбда onSuccess с результатом 3. Самое удивительное - 1 вовзращенный результат через onSuccess не валиден и соответствует ответу для набора параметров который был еще на первом, изначальном вызове compose функции (т.е то что было закешировано в remember насколько я понимаю, при этом те же параметры на входе в LaunchedEffect были апдейтнуты). При этом по нетворку я вижу только 1 запрос с правильными параметрами и ответом, на нетворк слое каких-то политик кэширования я не вижу. 2й вызов колбэка onSuccess по завершению LaunchedEffect
Вероятно таки что еще непосредственно внутри метода ключи меняет, пойду смотреть внимательнее)
Сделайте пример кода, текстом сложно понять
nda, и все такое. И тут метод уточки сработал, пока писал - появилось пару идей по дебагу 😄
Обсуждают сегодня