Flutter Packages 开发(二)

上篇文章Flutter Packages 开发(一)介绍了纯flutter插件的开发,这篇文章介绍Android平台插件的开发

添加Android平台支持

在hello_plugin目录下执行

flutter create --template=plugin --platforms=android .

之后会在该目录下生成android文件夹,里面会自动生成HelloPlugin.kt

package com.example.hello_plugin

import androidx.annotation.NonNull

import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
import io.flutter.plugin.common.MethodChannel.Result

/** HelloPlugin */
class HelloPlugin: FlutterPlugin, MethodCallHandler {
  /// The MethodChannel that will the communication between Flutter and native Android
  ///
  /// This local reference serves to register the plugin with the Flutter Engine and unregister it
  /// when the Flutter Engine is detached from the Activity
  private lateinit var channel : MethodChannel

  override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
    //声明一下通道为 plugins.flutter.io/hello_plugin
    channel = MethodChannel(flutterPluginBinding.binaryMessenger, "plugins.flutter.io/hello_plugin")
    channel.setMethodCallHandler(this)
  }

  override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
    //默认实现了 getPlatformVersion 方法
    if (call.method == "getPlatformVersion") {
      result.success("Android ${android.os.Build.VERSION.RELEASE}")
    } else {
      result.notImplemented()
    }
  }

  override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) {
    channel.setMethodCallHandler(null)
  }
}

在hello_plugin/pubspec.yaml文件中的flutter:下面添加插件声明

plugin:
    platforms:
      android:
        package: com.example.hello_plugin
        pluginClass: HelloPlugin

回到dart层hello_plugin.dart,dart通过channel.invokeMethod方法调用Android层方法

library hello_plugin;

import 'package:flutter/services.dart';

abstract class HelloPluginInterface{
  int addOne(int value);
  //声明跟Android层同名的方法
  Future getPlatformVersion();
}

class HelloPlugin extends HelloPluginInterface {

  //声明一下通道为 plugins.flutter.io/hello_plugin
  static const MethodChannel _channel = MethodChannel('plugins.flutter.io/hello_plugin');

  @override
  int addOne(int value) {
    return value + 1;
  }

  @override
  Future getPlatformVersion() async {
    //invokeMethod 里面的参数也需跟Android层方法同名
    return await _channel.invokeMethod('getPlatformVersion', null);
  }

}

main.dart中调用如下

void _getPlatformVersion() async{
    String p = await helloPlugin.getPlatformVersion();
    setState(() {
      platformVersion = p;
    });
  }

你可能感兴趣的:(Flutter Packages 开发(二))