通过plugin package调用原生页面,并接收返回参数
plugin插件包是一种特殊的package。
- 普通的package包括pubspec.yaml和lib文件夹,提供dart代码。
创建:1
flutter create --template=package mypackagename
- plugin package是一种调用特定平台,通过platform channels和平台平台原生代码进行交互。
创建:1
flutter create --org com.example --template=plugin -i swift -a kotlin mypackagename
ps.如果kotlin无法直接引用资源
kotlinx unresolved reference
在对应模块的build.gradle中增加
apply plugin: ‘kotlin-android-extensions’
- 使用plugin package:工程目录下,直接使用./,平级目录下,使用../
1
2
3
4
5dependencies:
flutter:
sdk: flutter
mypackagename:
path: ./路径/
具体代码可参见
https://gitee.com/alois/test_plugin_package
=============================================
简略代码
Flutter通过plugin package调用原生页面,并接收返回参数
- flutter plugin部分
test_plugin_package.dart1
2
3
4
5
6
7
8/*
* 接受arg0,arg1两个参数,调用原生TestPluginPackagePlugin的startActivity方法
* */
static Future<String> startActivity(String arg0, String arg1) async {
final String activityFinishResult = await _channel
.invokeMethod('startActivity', {"arg0": arg0, "arg1": arg1});
return activityFinishResult;
}
- flutter plugin android原生部分
TestPluginPackagePlugin.kt1
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50class TestPluginPackagePlugin(private val activity: Activity) : MethodCallHandler,
PluginRegistry.ActivityResultListener {
private val customRequestCode = 1032
private var myResult: Result? = null
companion object {
fun registerWith(registrar: Registrar) {
val channel = MethodChannel(registrar.messenger(), "test_plugin_package")
val plugin = TestPluginPackagePlugin(registrar.activity())
//添加ActivityResultListener
registrar.addActivityResultListener(plugin)
channel.setMethodCallHandler(plugin)
}
}
override fun onMethodCall(call: MethodCall, result: Result) {
when(call.method){
"getPlatformVersion" -> {
result.success("Android ${android.os.Build.VERSION.RELEASE}")
}
"startActivity" -> {
startActivity(call,result)
}
else -> {
result.notImplemented()
}
}
}
//打开activity
private fun startActivity(call: MethodCall, result: Result){
myResult = result
val intent = Intent(activity, TempActivity::class.java)
intent.putExtra("startKey0", call.argument<String>("arg0"))
intent.putExtra("startKey1", call.argument<String>("arg1"))
activity.startActivityForResult(intent, customRequestCode)
}
//接收activity的回调
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?): Boolean {
if (requestCode == customRequestCode && resultCode == Activity.RESULT_OK) {
val value = data?.getStringExtra("finishKey") ?: ""
myResult?.success(value)
return true
}
return false
}
}