Flutter插件中获取Activity

前言

1
2
3
1、最近在做 Flutter 插件开发时,需要判断是否为折叠屏。

2、折叠屏的监听需要用到 Activity,故写下了这篇博客。

1、Flutter 低版本

  • 在低版本的 Flutter 中可以通过 registerWith(Registrar registrar) 方法获取

  • Android 原生端代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package com.jiangxr.flutter_plugin

import android.app.Activity
import android.widget.Toast
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.*
import io.flutter.plugin.common.PluginRegistry.Registrar

class JPlugin(registrar: Registrar) : MethodCallHandler {

private var activity: Activity? = null

init {
activity = registrar.activity()
}

fun registerWith(registrar: Registrar) {
val channel = MethodChannel(registrar.messenger(), "jiang_plugin")
channel.setMethodCallHandler(JPlugin(registrar))
}

override fun onMethodCall(call: MethodCall, result: Result) {
when (call.method) {
"getPlatformVersion" -> {
result.success("Android ${android.os.Build.VERSION.RELEASE}")
}
"showToast" -> {
Toast.makeText(activity, "Flutter 调用 Android 原生端 Toast", Toast.LENGTH_SHORT).show()
}
else -> {
result.notImplemented()
}
}
}
}
  • Flutter 端的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import 'dart:async';

import 'package:flutter/services.dart';

class FlutterPlugin {
static const MethodChannel _channel = MethodChannel('jiang_plugin');

static Future<String?> get platformVersion async {
final String? version = await _channel.invokeMethod('getPlatformVersion');
return version;
}

static Future<void> get showToast async {
await _channel.invokeMethod('showToast');
}
}
  • Flutter 中调用的时候直接使用 await FlutterPluginDemo.showToast(); 即可

2、Flutter 高版本

  • Flutter 高版本中直接通过实现 ActivityAware 接口拿到 Activity

  • 由于涉及隐私,这里只写了关键代码,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.jiangxr.flutter_plugin

import android.app.Activity
import io.flutter.embedding.engine.plugins.activity.ActivityAware
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel.*
import java.lang.ref.WeakReference

class XPlugin : MethodCallHandler, ActivityAware {

private var mActivity: WeakReference<Activity>? = null

override fun onMethodCall(call: MethodCall, result: Result) {
TODO("Not yet implemented")
}

override fun onAttachedToActivity(binding: ActivityPluginBinding) {
mActivity = WeakReference(binding.activity)
}

override fun onDetachedFromActivityForConfigChanges() {
TODO("Not yet implemented")
}

override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {
TODO("Not yet implemented")
}

override fun onDetachedFromActivity() {
mActivity = null;
}
}

后记

  • 由于现阶段的 Flutter 版本一般都是2.x或3.x以上了,故基本上都用的第二种方案


Flutter插件中获取Activity
http://jxr202.github.io/flutter/flutter_002-ce19a5949f08/
作者
Jiang
发布于
2022年12月1日
许可协议