Flutter创建plugin package插件

Posted by アライさん on 2019年10月22日

通过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
    5
    dependencies:
    flutter:
    sdk: flutter
    mypackagename:
    path: ./路径/
    工程目录下,直接使用./,平级目录下,使用../

具体代码可参见

https://gitee.com/alois/test_plugin_package


=============================================

简略代码

Flutter通过plugin package调用原生页面,并接收返回参数

  • flutter plugin部分
    test_plugin_package.dart
    1
    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.kt
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    class TestPluginPackagePlugin(private val activity: Activity) : MethodCallHandler,
    PluginRegistry.ActivityResultListener {

    private val customRequestCode = 1032
    private var myResult: Result? = null

    companion object {
    @JvmStatic
    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
    }
    }