Как получить активность внутри плагина Flutter? - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь разработать простой плагин Flutter для себя. Теперь я застрял с получением активности. Это всегда говорит, что моя переменная, которую я использую для хранения активности, является нулевой. Даже установка моей переменной myActivity внутри onAttachedToActivity, похоже, не работает.

I/flutter ( 6555): PlatformException(error, lateinit property mActivity has not been initialized, null)
I/flutter ( 6555): 
I/flutter ( 6555): When the exception was thrown, this was the stack:
I/flutter ( 6555): #0      StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:569:7)
I/flutter ( 6555): #1      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:321:33)
I/flutter ( 6555): <asynchronous suspension>
I/flutter ( 6555): #2      EventChannel.receiveBroadcastStream.<anonymous closure> (package:flutter/src/services/platform_channel.dart:517:29)
I/flutter ( 6555): #4      EventChannel.receiveBroadcastStream.<anonymous closure> (package:flutter/src/services/platform_channel.dart:503:64)
I/flutter ( 6555): #9      _MyAppState.initState (package:simple_speech_to_text_example/main.dart:21:39)
I/flutter ( 6555): #10     StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4355:58)
I/flutter ( 6555): #11     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4201:5)
I/flutter ( 6555): #12     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3194:14)
I/flutter ( 6555): #13     Element.updateChild (package:flutter/src/widgets/framework.dart:2988:12)
I/flutter ( 6555): #14     RenderObjectToWidgetElement._rebuild (package:flutter/src/widgets/binding.dart:1028:16)
I/flutter ( 6555): #15     RenderObjectToWidgetElement.mount (package:flutter/src/widgets/binding.dart:999:5)
I/flutter ( 6555): #16     RenderObjectToWidgetAdapter.attachToRenderTree.<anonymous closure> (package:flutter/src/widgets/binding.dart:942:17)
I/flutter ( 6555): #17     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2412:19)
I/flutter ( 6555): #18     RenderObjectToWidgetAdapter.attachToRenderTree (package:flutter/src/widgets/binding.dart:941:13)
I/flutter ( 6555): #19     WidgetsBinding.attachRootWidget (package:flutter/src/widgets/binding.dart:819:7)
I/flutter ( 6555): #20     WidgetsBinding.scheduleAttachRootWidget.<anonymous closure> (package:flutter/src/widgets/binding.dart:804:7)
I/flutter ( 6555): #29     _Timer._runTimers (dart:isolate-patch/timer_impl.dart:384:19)
I/flutter ( 6555): #30     _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:418:5)
I/flutter ( 6555): #31     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:174:12)
I/flutter ( 6555): (elided 13 frames from package dart:async and package dart:async-patch)

Мой код:

class SimpleSpeechToTextPlugin: MethodCallHandler, FlutterPlugin, EventChannel.StreamHandler,ActivityAware {
  override fun onDetachedFromActivity() {
    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
  }

  override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {
    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
  }

  override fun onAttachedToActivity(binding: ActivityPluginBinding) {
    Log.d("test","onAttachedToActivity")
    mActivity = binding.activity
  }

  override fun onDetachedFromActivityForConfigChanges() {
    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
  }

  override fun onMethodCall(call: MethodCall, result: Result) {
    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
  }

  override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
  }

  override fun onListen(arguments: Any?, events: EventChannel.EventSink?) {
    events?.success("works")
    Log.d("test","onListen")
    createListener(events)
  }

  override fun onCancel(arguments: Any?) {

  }


  private lateinit var mActivity: Activity


  override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
    val messenger = flutterPluginBinding.getBinaryMessenger()
    EventChannel(messenger, "test/stream").setStreamHandler(SimpleSpeechToTextPlugin())
  }

  // This static function is optional and equivalent to onAttachedToEngine. It supports the old
  // pre-Flutter-1.12 Android projects. You are encouraged to continue supporting
  // plugin registration via this function while apps migrate to use the new Android APIs
  // post-flutter-1.12 via https://flutter.dev/go/android-project-migration.
  //
  // It is encouraged to share logic between onAttachedToEngine and registerWith to keep
  // them functionally equivalent. Only one of onAttachedToEngine or registerWith will be called
  // depending on the user's project. onAttachedToEngine or registerWith must both be defined
  // in the same class.
  companion object {
    @JvmStatic
    fun registerWith(registrar: Registrar) {
      Log.d("test","registar")
    }
  }



  private fun createListener(event: EventChannel.EventSink?){
    val act = mActivity as FragmentActivity
    Log.d("test", "createListener")
    // ---- Null
    event?.success(mActivity.applicationContext)
  }
}

Есть ли у кого-нибудь идеи о том, как получить активность внутри плагина флаттера при использовании kotlin?

1 Ответ

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

Вам нужно зарегистрировать свой плагин так:

companion object {
    @JvmStatic
    fun registerWith(registrar: Registrar) {
      val channel = MethodChannel(registrar.messenger(), CHANNEL_NAME);
    channel.setMethodCallHandler(SimpleSpeechToTextPlugin(registrar.activity()));
    }
  }

Теперь вы можете получить активность в своем конструкторе.

...