0

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?

Just A Question
  • 423
  • 6
  • 21

1 Answers1

1

You need to register your plugin like this:

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

Now you can get the activity in your constructor.

jbarat
  • 2,382
  • 21
  • 23
  • I tried something like this before but then Im getting this error: constructor SimpleSpeechToTextPlugin in class SimpleSpeechToTextPlugin cannot be applied to given types; required: Activity found: no arguments reason: actual and formal argument lists differ in length – Just A Question Apr 22 '20 at 16:58
  • How to know when the activity changed or destroyed? – BuffK Jul 31 '20 at 02:59