Kotlin伴生对象内如何调用FlutterActivity的getFlutterEngine方法
问题原因
你的判断完全正确,报错核心原因就是代码写在了companion object内部:
companion object等价于Java的静态代码域,属于类级别的上下文,初始化阶段根本不存在MainActivity的实例对象。getFlutterEngine()是FlutterActivity的实例方法,必须依附于Activity实例才能调用,静态上下文里没有可用的实例,自然找不到方法引用,你之前尝试的this@FlutterActivity、this@MainActivity写法无效也是同样原因——静态域里拿不到外部类的实例引用。
另外你在伴生对象初始化块里调用相关方法本身逻辑也不成立:伴生对象在类加载阶段就会初始化,这时候Activity还未创建,Flutter引擎也没完成初始化,哪怕语法层面能通过编译,运行时也会抛出空指针异常。
正确实现方式
不要在伴生对象里初始化EventChannel,把相关逻辑移到FlutterActivity提供的configureFlutterEngine生命周期回调中,这个方法会在Flutter引擎初始化完成后自动触发,方法参数会直接传入可用的FlutterEngine实例,不需要手动调用getFlutterEngine()获取。
修正后的代码如下:
class MainActivity: FlutterActivity() { companion object { // 仅把和实例无关的常量放在伴生对象中 private const val STREAM = "com.example.my_app/stream" } private lateinit var eventChannel: EventChannel override fun configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) // 此时引擎已完成初始化,直接使用传入的flutterEngine参数即可 eventChannel = EventChannel(flutterEngine.dartExecutor.binaryMessenger, STREAM) // 后续可在此处设置StreamHandler处理Flutter端的流监听 eventChannel.setStreamHandler(object : EventChannel.StreamHandler { override fun onListen(arguments: Any?, events: EventChannel.EventSink?) { // 处理流订阅逻辑 } override fun onCancel(arguments: Any?) { // 处理流取消逻辑 } }) } }
特殊场景处理
如果你确实需要在静态域访问这个EventChannel,不要在伴生对象里初始化它,可以在实例初始化完成后给伴生对象里的可空变量赋值,同时必须在Activity销毁时将变量置空,避免内存泄漏:
class MainActivity: FlutterActivity() { companion object { private const val STREAM = "com.example.my_app/stream" // 声明为可空类型,不要用lateinit修饰 private var EVENT_CHANNEL: EventChannel? = null } override fun configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) EVENT_CHANNEL = EventChannel(flutterEngine.dartExecutor.binaryMessenger, STREAM) } override fun onDestroy() { // 销毁时置空引用,避免内存泄漏 EVENT_CHANNEL = null super.onDestroy() } }
内容的提问来源于stack exchange,提问作者PPP
相关产品推荐
相关产品推荐

