Всем привет. А кто-ни будь сталкивался с java.lang.ClassCastException при обращении

к ProvidableCompositionLocal.current? Я уже второй день ковыряюсь и никак не могу создать минимальный пример демонстрирующий проблему - всё ломается исключительно в полном приложении. Выглядит это примерно так:
java.lang.ClassCastException: androidx.compose.runtime.ParcelableSnapshotMutableState cannot be cast to java.util.Map
В строке где я просто обращаюсь к current
val myIds = localIds.current
Значение localIds определено вот так:
private val localIds = compositionLocalOf<Map<Long, String>> {
error("Ids are not available")
}
Т.е. оно откуда-то берёт значение типа ParcelableSnapshotMutableState и пытается кастить его в Map<Long, String>. Я залез в кишки композа уже и похоже там в currentCompositionLocalScope методе в строке:
val providers = providerUpdates[current]
?: reader.groupAux(current) as CompositionLocalMap
В каких-то ситуациях (ошибка не всегда возникает, но не рандомно) оно читает из reader.groupAux(current) что-то совершенно не соответствующее тому что должно там лежать. Где и как оно его туда кладёт я не нашёл. Эта проблема возникает только если функция обращающаяся к localIds.current лежит внутри LazyColumn (ну т.е. элемент списка) и только когда компонент начинает уходить из композиции во время анимации. В месте выше по стеку где я делаю
CompositionLocalProvider(
localId provides mapOf(1L to "heheh")
...
){
...
}
Я вставил логирование и вижу что значение правильное. Более того, если я обращаюсь к этой переменной одним (ну примерно) "фреймом" выше по стеку - всё нормально, вот примерно так:
...
val myIds1 = localIds.current // это нормально срабатывает
LazyColumn(modifier = Modifier.fillMaxSize()) {
items(
items = items,
key = { item -> item.toString() }
) { element ->
val myIds = localIds.current // a это падает с ошибкой
...
}
}
...
Кто-нибудь может предположить в чём тут дело? Или может сталкивался?

8 ответов

10 просмотров
Agry-Gami Автор вопроса

Всем привет снова :) Я опять про свою проблему хочу у общественности спросить. Я сделал вроде как минимальный пример который демонстрирует похожую или, как мне кажется, связанную багу вот тут: https://gist.github.com/AngryGami/a83d0fe7f0a3d6968bb43a401bec7999 При нажатии на кнопку внизу экрана приложение падает с java.lang.IllegalStateException: nope 2 Т.е. значение не провайдится как будто, хотя bottomBar композабл находится внутри соответствующего CompositionLocalProvider (первый экран ведь работает хотя он делает в точности то же самое). Если заменить Scaffold на PoorManScaffold - всё опять начинает работать. Т.е. Scaffold каким-то образом теряет контекст внешнего CompositionLocalProvider и только для bottomBar`а. Кто-нибудь знает почему это происходит? Бага ли это или ожидаемое поведение?

Agry Gami
Всем привет снова :) Я опять про свою проблему хоч...

Пробовал интереса ради вынести тело начиная от Scaffold в отдельную композабл?

Agry-Gami Автор вопроса
Konstantin Dovnar
Пробовал интереса ради вынести тело начиная от Sca...

Не понимаю что ты имеешь ввиду... Всё что внутри CompositionLocalProvider?

Agry Gami
Не понимаю что ты имеешь ввиду... Всё что внутри C...

Имею ввиду вынести вот эту часть в отдельную функцию.

Agry Gami
Неа, падает точно так же:

Ладно, это было ожидаемо, но стоило попробовать:)

Agry-Gami Автор вопроса
Agry-Gami Автор вопроса
Konstantin Dovnar
Ладно, это было ожидаемо, но стоило попробовать:)

https://gist.github.com/AngryGami/740220d9c510b10645ab17996c39de38 Вот ещё немного сузил круг подозреваемых. Дело не в Scaffold`е самом по себе - дело в том что если использовать CompositionLocalProvider внутри SubcomposeMeasureScope.subcompose оно начинает так себя вести. Стандартный Scaffold заворачивает bottomBar в такой вызов а основной контент не заворачивает, отсюда и проблема.

Похожие вопросы

Обсуждают сегодня

Сonst magicTgHTML = (text, entities) => { let processedText = text; let offsetShift = 0; entities.forEach(entity => { const { offset, length, type, url, ...
Андрей
1
Чет мне ссыкотно опять Rainlab.User в проект ставить. Кто знает, опять наотъебись все сделали или после обнов пользоваться можно?
Black Cat
10
это группа токсиков или тех кто помогает?
Ибрагим
9
Гайз, кто-нибудь пробовал запустить probe-rs под камень, которого нет в probe-rs? Мб есть какой-нибудь пример у кого... Через target-gen попробовал сгенерировать chip-descript...
Максим Смирнов
2
В смысле более затратная? Общая стоимость владения лошадью меньше, чем автомобиля. В среднем.
Sergej R
10
Можете помочь с этим, я тут использую Джанго как ОРМ для бота, но бот запускать не хочет, уже всезде перерыл не могу решить, может кто то сталкивался?
Ибрагим
4
коллеги привет. уже второй день бьемся об заклад с одной ошибкой, может вы сталкивались с таки странным поведением? есть тестовый сервер, на который паблишим релизную версию W...
Magzhan
11
Кстати, раз про скачивание файлов разговор зашел) Сделал бота для себя (транскрибирующего и суммаризирующего встречи) но не ожидал что за 2 месяца 10к пользователей набежит😅...
Andrey Obolenskiy
8
всем привет. подскажите. сделал политику, он верхнеуровневая. раздал права только на TEST2 (полные). вопрос - можно ли сделать так, чтобы был доступен только TEST2, а остально...
Андрей Сергеев
5
Добрый день! Подскажите, пожалуйста: какими компетенциями нужно обладать, чтобы претендовать на работу эрланг (отдельная благодарность, если про элексир тоже подскажете) разр...
via ☸️ led
20
Карта сайта