Я пытаюсь разработать простой плагин 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?