Новое объявление плагина pubspe c Flutter вызывает исключение MissingPluginException - PullRequest
0 голосов
/ 01 апреля 2020

Редактировать 3-4-2019

Проведя дополнительные исследования, я обнаружил, что при создании нового плагина с помощью команды flutter create --org com.example --template=plugin hello он по-прежнему использует старый pubspe c формат декларации. Однако если мы изменим старый формат на новый, он выдаст ту же ошибку, что и я.

Исходное сообщение

Я работаю над Плагин Flutter , и перед переносом моего плагина во встраивание Flutter v2 у меня было следующее объявление в моем pubspe c:

flutter:
  plugin:
    packageAndroid: dev.steenbakker.flutter_ble_peripheral
    pluginClass: FlutterBlePeripheralPlugin

Однако в руководство предоставлено flutter предлагается использовать новый тип объявления, который разделяет различные платформы следующим образом:

flutter:
  plugin:
    platform:
      ios:
        pluginClass: FlutterBlePeripheralPlugin
      android:
        package: dev.steenbakker.flutter_ble_peripheral
        pluginClass: FlutterBlePeripheralPlugin

Однако после этого я получаю следующую ошибку каждый раз, когда хочу выполнить что-то из библиотеки :

2020-04-01 13:54:03.134943+0200 Runner[1328:1208976] [VERBOSE-2:ui_dart_state.cc(157)] Unhandled Exception: MissingPluginException(No implementation found for method start on channel dev.steenbakker.flutter_ble_peripheral/ble_state)
#0      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:319:7)
<asynchronous suspension>
#1      FlutterBlePeripheral.start (package:flutter_ble_peripheral/flutter_ble_peripheral.dart:48:26)
#2      _MyAppState.startBroadcast (package:flutter_ble_peripheral_example/main.dart:53:19)
#3      _MyAppState.build.<anonymous closure> (package:flutter_ble_peripheral_example/main.dart:65:32)

Я полностью внедрил новое встраивание на android следующим образом:

/** FlutterBlePeripheralPlugin */
class FlutterBlePeripheralPlugin: FlutterPlugin, MethodCallHandler, EventChannel.StreamHandler {

  private var applicationContext: Context? = null
  private var methodChannel: MethodChannel? = null
  private var eventChannel: EventChannel? = null
  private var peripheral: Peripheral? = null
  private var eventSink: EventChannel.EventSink? = null
  private var advertiseCallback: (Boolean) -> Unit = { isAdvertising ->
    eventSink?.success(isAdvertising)
  }

/** Plugin registration embedding v1 */
  companion object {
    @JvmStatic
    fun registerWith(registrar: PluginRegistry.Registrar) {
     FlutterBlePeripheralPlugin().onAttachedToEngine(registrar.context(), registrar.messenger())
    }
  }

/** Plugin registration embedding v2 */
  override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
  onAttachedToEngine(flutterPluginBinding.applicationContext, flutterPluginBinding.binaryMessenger)
  methodChannel!!.setMethodCallHandler(this)
  eventChannel!!.setStreamHandler(this)
  peripheral = Peripheral()
  peripheral!!.init(flutterPluginBinding.applicationContext)
}

  private fun onAttachedToEngine(applicationContext: Context, messenger: BinaryMessenger) {
    this.applicationContext = applicationContext
    methodChannel = MethodChannel(messenger, "dev.steenbakker.flutter_ble_peripheral/ble_state")
    eventChannel = EventChannel(messenger, "dev.steenbakker.flutter_ble_peripheral/ble_event")
    methodChannel!!.setMethodCallHandler(this)
    eventChannel!!.setStreamHandler(this)
    peripheral = Peripheral()
    peripheral!!.init(applicationContext)
  }

При использовании старого pubspe c все работает нормально на обоих iOS и Android, однако новый стиль pubspe c выдает одинаковую ошибку как для iOS, так и Android

1 Ответ

0 голосов
/ 06 апреля 2020

Я до сих пор точно не знаю, что было не так, но я подозреваю, что что-то в манифесте android было неисправно после обновления до новой записи.

Что решило мою проблему, установив канал dev трепетать, используя flutter channel dev, а затем flutter upgrade. После установки dev-канала я создал новый проект с flutter create --org com.example --template=plugin hello, который создал пустой проект с новым встраиванием v2 и новой нотацией pubspe c. Затем я переместил все свои логи c из неисправного проекта во вновь созданный проект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...