2gis / mobile-sdk-android-demo

BSD 2-Clause "Simplified" License
16 stars 15 forks source link

FATAL EXCEPTION. List has more than one element. Инициализация Navigation View. #215

Closed dchugunoff closed 4 months ago

dchugunoff commented 6 months ago

Столкнулись с проблемой, крашит приложение при переходе с фрагмента, на котором есть NavigationView, и обратно. https://pastebin.com/JRem1Tzq image (3) Код, ненужное вырезал. https://pastebin.com/e9r9CuJA https://pastebin.com/2AN7BBSu https://pastebin.com/JiVdg8DR

Sameri11 commented 6 months ago

Привет! Кажется, это баг в SDK, но нам понадобится некоторое время на починку. Срок пока обозначить не можем.

Пока можем предложить такое решение, которое по идее должно сработать: не добавлять руками и не создавать вообще MyLocationMapObjectSource. В 10-й версии NavigationView может делать это сама, и кажется это подойдет вам, учитывая что она создается и добавляется сразу и живет на протяжении всего жц (без ручных добавлений/удалений имеется ввиду) Должно работать даже если у NavigationView visibility == View.GONE.

timplifier commented 6 months ago

Окей, каким образом тогда получать текущее местоположение и отображать его, если не добавлять MyLocationMapObjectSource ? Решение с маркером такое себе так как постоянно его перерисовывать это ужас.

К тому же, как я могу подключиться к DefaultLocationSource и получать локацию оттуда ? У вас ведь под капотом все уже реализовано и казалось бы, для чего писать свое получение локации руками, если можно взять из сдк, ведь на этом он весь и строится.

Более того, как я могу проверять активен ли NavigationManager ?

И могу ли я включить тмпо lite версию карты без цветов и всяких декоративных элементов для большей производительности ? Так как при старте навигации по маршруту начинает нереально лагать

Sameri11 commented 6 months ago

Привет! NavigationView сама добавит MyLocationMapObjectSource если поймет, что его сейчас нигде нет. Баг в логике у нас как раз связан с этим, что она не совсем правильно понимает. То есть, вы уберете добавление его руками и все останется примерно как было – маркер будет рисоваться, перелет к местоположению будет работать. Подключаться руками к DefaultLocationSource тоже не будет необходимости.

как я могу проверять активен ли NavigationManager ?

Не совсем понимаю, что это значит в текущем контексте. Можно чуть более развернуто описать, что хочется проверять?

И могу ли я включить тмпо lite версию карты без цветов и всяких декоративных элементов для большей производительности ? Так как при старте навигации по маршруту начинает нереально лагать

Lite версия карты не предусмотрена. Тут бы помогло видео с комментами, в какой момент что-то идет не так и хотелось бы это поправить – тогда можем попробовать что-то предметно советовать.

timplifier commented 6 months ago

То есть, маркер с моей локаций будет показываться даже в том случае, когда неактивна непосредственно навигация по маршруту ? Если так, то ок. Видео запишу если что позже

Про navigation manager и его активность. Я бы хотел знать когда он активен и подписаться на него чтобы получать уведомления о том, он активен или нет

Sameri11 commented 6 months ago

Про маркер – да, все так. По крайней мере, на нашем стенде работает в таком варианте. Если не заведется у вас, то попробуем придумать что-то еще. Но должно работать: как я выше сказал, учитывая что вы добавляете NavigationView сразу, и больше не удаляете/передобавляете и т.д.

про NavigationManager – если я правильно понял, то можно подписаться на stateChannel, и там будут прилетать значения State. Но, кажется, вы итак это делаете, судя по коду. Другого способа отследить "активность" нет. Опять же, если я правильно понял, что такое активность – я это понимаю как состояние навигации (то, что перечисляет State как раз)

timplifier commented 6 months ago

Выпилили добавление руками MyLocationMapObjectSource, даем navigationManager'y navigationManager и не видно маркера с локацией

if (!viewModel.navigationState) {
            viewModel.navigationState = true
        }
        binding.navigationView.navigationManager = navigationManager
private val navigationManager by lazy {
        NavigationManager(dgisSdkContext)
    }
dchugunoff commented 6 months ago

Так же не работает навигация если убрать MyLocationMapObjectSource. Просто висит вью "Потерян сигнал GPS". При переходе между экранами и при возвращении на фрагмент с картой - карта улетает непонятно куда.

Sameri11 commented 6 months ago

Привет! Поняли, будем фиксить баг в ближайший хотфикс-релиз.

maxal9999 commented 5 months ago

Привет. Починили в 10.4.0. Проверяйте.

dchugunoff commented 4 months ago

Извиняюсь за долгий ответ. Все работает отлично!