Unact / yandex_mapkit

Flutter implementation of YandexMapkit
MIT License
135 stars 148 forks source link

java.lang.IllegalStateException при билде виджета #151

Closed xt1zer closed 2 years ago

xt1zer commented 2 years ago

Появляется на андроид 11, устройство и эмуль с Google APIs образом; на ios не тестировали. Началось после перехода с другого api для карт (использую последнюю гит версию для функционала маршрутизации), причём следовал всем шагам по установке. Происходит во всех местах вызова YandexMap. Но ещё я поставил гит версию в другом проекте вместо 1.1.1, там такой проблемы нет.

Что делал: flutter clean, flutter pub cache clean.

Какие-то источники подсказывают, что это может возникать из-за конфликта пакетов, использующих PlatformViews одновременно (в подробности не вдавался). Есть ли другие идеи?

Логи ``` E/flutter (18994): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: PlatformException(error, java.lang.IllegalStateException: Trying to create a platform view of unregistered type: yandex_mapkit/yandex_map E/flutter (18994): at io.flutter.plugin.platform.PlatformViewsController$1.createVirtualDisplayForPlatformView(PlatformViewsController.java:197) E/flutter (18994): at io.flutter.embedding.engine.systemchannels.PlatformViewsChannel$1.create(PlatformViewsChannel.java:107) E/flutter (18994): at io.flutter.embedding.engine.systemchannels.PlatformViewsChannel$1.onMethodCall(PlatformViewsChannel.java:59) E/flutter (18994): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:233) E/flutter (18994): at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(DartMessenger.java:84) E/flutter (18994): at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(FlutterJNI.java:865) E/flutter (18994): at android.os.MessageQueue.nativePollOnce(Native Method) E/flutter (18994): at android.os.MessageQueue.next(MessageQueue.java:335) E/flutter (18994): at android.os.Looper.loop(Looper.java:183) E/flutter (18994): at android.app.ActivityThread.main(ActivityThread.java:7656) E/flutter (18994): at java.lang.reflect.Method.invoke(Native Method) E/flutter (18994): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) E/flutter (18994): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) E/flutter (18994): , null, null) E/flutter (18994): #0 StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:607:7) E/flutter (18994): #1 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:156:18) E/flutter (18994): E/flutter (18994): #2 TextureAndroidViewController._sendCreateMessage (package:flutter/src/services/platform_views.dart:1066:18) E/flutter (18994): E/flutter (18994): #3 AndroidViewController.create (package:flutter/src/services/platform_views.dart:771:5) E/flutter (18994): E/flutter (18994): #4 RenderAndroidView._sizePlatformView (package:flutter/src/rendering/platform_view.dart:193:7) E/flutter (18994): E/flutter (18994): ```
Доктор ``` [√] Flutter (Channel stable, 2.5.2, on Microsoft Windows [Version 10.0.19043.1237], locale en-GB) • Flutter version 2.5.2 at *****\flutter • Upstream repository https://github.com/flutter/flutter.git • Framework revision 3595343e20 (8 days ago), 2021-09-30 12:58:18 -0700 • Engine revision 6ac856380f • Dart version 2.14.3 [√] Android toolchain - develop for Android devices (Android SDK version 31.0.0) • Android SDK at *****\AppData\Local\Android\sdk • Platform android-31, build-tools 31.0.0 • Java binary at: C:\Program Files\Android\Android Studio\jre\bin\java • Java version OpenJDK Runtime Environment (build 11.0.10+0-b96-7249189) • All Android licenses accepted. [X] Chrome - develop for the web (Cannot find Chrome executable at .\Google\Chrome\Application\chrome.exe) ! Cannot find Chrome. Try setting CHROME_EXECUTABLE to a Chrome executable. [√] Android Studio (version 2020.3) • Android Studio at C:\Program Files\Android\Android Studio • Flutter plugin can be installed from: https://plugins.jetbrains.com/plugin/9212-flutter • Dart plugin can be installed from: https://plugins.jetbrains.com/plugin/6351-dart • Java version OpenJDK Runtime Environment (build 11.0.10+0-b96-7249189) [√] Connected device (1 available) • Edge (web) • edge • web-javascript • Microsoft Edge 94.0.992.38 ```
DCrow commented 2 years ago

Добрый день!

Очень напоминает ту же проблему, что и в #150. Попробуйте описанное там решение.

xt1zer commented 2 years ago

В MainActivity.kt всё прописано как в readme, и ключ тоже стоит.

Ещё стоило добавить, что в процессе долговременной разработки менялся appid приложения, от старого айди следов не осталось. Но сомневаюсь, что это провоцирует исключение.

DCrow commented 2 years ago

Подскажите, у вас есть в AndroidManifest.xml такая строка?

<meta-data
    android:name="flutterEmbedding"
    android:value="2" />
xt1zer commented 2 years ago

Есть, внутри блока <application>

DCrow commented 2 years ago

Еще бывает что проблема со старой версией в gradle-wrapper.properties. Попробуйте там обновить версию.

Также еще подскажите в GeneratedPluginRegistrant.java есть строка? flutterEngine.getPlugins().add(new com.unact.yandexmapkit.YandexMapkitPlugin());

xt1zer commented 2 years ago

gradle-wrapper.properties. Попробуйте там обновить версию.

Ещё недавно повысил версию в android до 7.0.2, последнюю доступную для плагина. В properties она совпадает.

flutterEngine.getPlugins().add(new com.unact.yandexmapkit.YandexMapkitPlugin());

Есть

xt1zer commented 2 years ago

По-видимому, конфликтов пакетов нет. Я скопировал список пакетов из pubspec.yaml в новый проект и только запускал виджет в scaffold, без всякого другого кода, проблемы не возникают. Может это тогда возникнуть из-за расположения виджета? Он стоит на дне стека.

DCrow commented 2 years ago

Не, виджеты тут не причем, тогда бы он был просто не виден или что-то в таком роде, а тут плагин не смог инициализироваться по какой-то причине. Тут проблема с зависимостями при сборке android проекта. Раз с такими же зависимостями собирается в новом проекте, то вероятнее всего либо что-то закешировалось в проекте, либо где-то настройки не верно установлены(например в MainActivity.kt порядок выполнения важен)

xt1zer commented 2 years ago

Нашёл причину. Для пакета audio-service понадобилось переименовать activity в манифесте, и похоже, что этот пакет сильно привязан к этому имени. Буду искать альтернативу.

xt1zer commented 2 years ago

Прошу помочь по этому же вопросу. Решено, что пакет audio-service нужно оставить, но после его установки я не могу использовать mapkit. В доках написано, что нужно переименовать главный activity в манифест-файле. На стэке по этому вопросу сказали, что имя этого activity должен совпадать и в kotlin (или java) файле, но я не знаю как тогда он должен называться. И что именно - просто имя класса, или файла кода, или обоих?

Или же надо создать кастомный activity? А как это сделать я никак не пойму. Если есть решение, я бы любезно попросил пример. Сейчас мой kotlin файл ничем не примечателен:

import androidx.annotation.NonNull
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import com.yandex.mapkit.MapKitFactory

class MainActivity: FlutterActivity() {
    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        MapKitFactory.setApiKey("my_key")
        super.configureFlutterEngine(flutterEngine)
    }
}

И в манифесте следующее изменение:

<activity
    android:name="com.ryanheise.audioservice.AudioServiceActivity"
    <!-- и прочие вещи-->
</activity>
<!-- другие activity, сервисы, разрешения и т.д.-->
xt1zer commented 2 years ago

Сделал другой пример: перегрузить provideFlutterEngine, чтобы вернуть соответствующий engine из AudioServicePlugin. Это написано в доках по пакету для кастомных activity.

import android.content.Context
import androidx.annotation.NonNull
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import com.yandex.mapkit.MapKitFactory
import com.ryanheise.audioservice.AudioServicePlugin

class MainActivity : FlutterActivity() {
    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        MapKitFactory.setApiKey("9b598cce-8311-4ae5-8fc5-b536013023f2")
        super.configureFlutterEngine(flutterEngine)
    }

    override fun provideFlutterEngine(context: Context): FlutterEngine? = AudioServicePlugin.getFlutterEngine(context)
}

А в манифесте имя activity вернул MainActivity. Опять же, возникает ошибка регистрации типа yandex_mapkit.

DCrow commented 2 years ago

Там надо вот так это делать, и кроме этого надо AndroidManifest.xml android:name вернуть старое название .MainActivity

import android.content.Context
import androidx.annotation.NonNull
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import com.yandex.mapkit.MapKitFactory
import com.ryanheise.audioservice.AudioServicePlugin

class MainActivity: FlutterActivity() {
  override fun provideFlutterEngine(@NonNull context: Context): FlutterEngine {
    MapKitFactory.setApiKey("YOUR_API_KEY")
    return AudioServicePlugin.getFlutterEngine(context)
  }
}
xt1zer commented 2 years ago

О боги... оно работает! А мы думали над этим месяц, если не больше! Превеликая благодарность!