Редактировать 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