I'm trying to develop a simple Flutter plugin for myself. Now I got stuck with getting the activity. It always says that my variable I'm using for storing the activity is null. Even setting my variable myActivity inside onAttachedToActivity does not seem to work.
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)
My code:
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)
}
}
Does somebody have an idea on how to get the activity inside a flutter plugin while using kotlin?