Open DazzlingFame opened 5 months ago
Попробовал перейти на либу react-native-yamap-plus, в которой используется нативный map-kit версии 4.6.1. Проблема не пропала
removeChild
в YamapViewСтектрейс указывает на remove a view
в ru.vvdev.yamap.view.YamapView
внутри YamapView
видим метод removeChild
, внутри которого уже реализованы проверки на наличие mapObject
, те тут проблем возникать не должно
if (getChildAt(index) instanceof ReactMapObject) {
final ReactMapObject child = (ReactMapObject) getChildAt(index);
if (child == null) return;
final MapObject mapObject = child.getMapObject();
if (mapObject == null || !mapObject.isValid()) return;
getMap().getMapObjects().remove(mapObject);
}
Однако на всякий случай пробуем отловить краш в try catch
public void removeChild(int index) {
try {
if (getChildAt(index) instanceof ReactMapObject) {
final ReactMapObject child = (ReactMapObject) getChildAt(index);
if (child == null) return;
final MapObject mapObject = child.getMapObject();
if (mapObject == null || !mapObject.isValid()) return;
Log.d("!!!removeChild success", String.valueOf(index));
getMap().getMapObjects().remove(mapObject);
}
} catch (Exception e) {
Log.d("!!!removeChild error", e.getMessage());
}
}
Но это не помогает, краши все равно воспроизводятся, лог removeChild error
никогда не выводится
removeViewAt
в YamapViewManagerТк падение не отловилось через try catch в YamapView
, смотрю на removeViewAt, который последовательно вызывает
parent.removeChild(index);
super.removeViewAt(parent, index);
пробую проверить гипотезу, что parent.removeChild
отрабатывает корректно, а super.removeViewAt падает
Обычно super
методы вызываются в самом начале, пробуем изменить порядок вызовов
public void removeViewAt(YamapView parent, int index) {
super.removeViewAt(parent, index);
parent.removeChild(index);
}
Это не помогает
super.removeViewAt
попробовал возвращать булеан из removeChild
, чтобы понимать снаружи, что удаление прошло корректно
public boolean removeChild(int index) {
try {
if (getChildAt(index) instanceof ReactMapObject) {
final ReactMapObject child = (ReactMapObject) getChildAt(index);
if (child == null) return false;
final MapObject mapObject = child.getMapObject();
if (mapObject == null || !mapObject.isValid()) return false;
getMap().getMapObjects().remove(mapObject);
return true;
}
} catch (Exception e) {
Log.d("!!!removeChild error", e.getMessage());
return false;
}
return false;
}
и далее вызывать super.removeViewAt
только если removeChild
вернул true
, те удаление прошло успешно
public void removeViewAt(YamapView parent, int index) {
if (parent.removeChild(index)) {
super.removeViewAt(parent, index);
}
}
Это тоже не помогло, краши остались
super
Перед вызовом super.removeViewAt
делаю дополнительную проверку на наличие чайлда по индексу, по которому предполагается удаление
public void removeViewAt(YamapView parent, int index) {
if (parent.removeChild(index)) {
if (super.getChildAt(parent, index) != null) {
super.removeViewAt(parent, index);
}
}
}
это тоже не помогает Аналогично не помогает проверка на размер списка детей
public void removeViewAt(YamapView parent, int index) {
if (parent.removeChild(index)) {
if (super.getChildCount(parent) > index) {
super.removeViewAt(parent, index);
}
}
}
removeViewAt
в YamapViewManager в try catchРешил попробовать полностью обернуть removeViewAt
в try catch, чтобы понять, правильно ли локализовал место краша
public void removeViewAt(YamapView parent, int index) {
try {
parent.removeChild(index);
super.removeViewAt(parent, index);
Log.d("!!!removeViewAt", "success");
} catch (Exception e) {
Log.d("!!!removeViewAt", e.getMessage());
}
}
Это не принесло результатов, лог в catch ни разу не отработал, хотя краш проявился
По стектрейсу падает в этом месте react-native-reanimated
.
:green_circle: Пробовали вариант с включением enableLayoutAnimations(true)
из react-native-reanimated
, проблема пропадает, видим динамику снижения крашей на пользователях.
:yellow_circle: Но при этом крайне редко бывает что не отрисовываются новые пины до тех пор пока снова не подвигаешь карту
:red_circle: Что еще пробовали, но не помогло
react-native-yamap@4.1.18
→ 4.6.0react-native-reanimated@3.6.1
→ 3.11.0, react-native-yamap@4.6.0
react-native@0.72.12
→ 0.73.4react-native@0.73.4
, react-native-yamap@4.6.0
, react-native-reanimated@3.11.0
Рендерю компоненты
Marker
детьми внутри компонентаYaMap
, при изменении позиции на карте изменяю набор детей, вплоть до полного изменения без пересечений После очередного изменения позиции карты маркеры "прилипают" к краю карты, затем происходит краш картыПример текста ошибки (могут меняться числа
children
иindicesToRemove
)Окружение "react-native": "0.70.14", "react-native-yamap": "4.1.18", Android 13
StackTrace:
Видео воспроизведения:
https://github.com/volga-volga/react-native-yamap/assets/15292833/c8926343-26bb-4466-8f84-6f901db0b46c