Escritura del complemento Flutter del SDK nativo de Android

Antecedentes del proyecto

Hace algún tiempo, fui responsable del desarrollo de un SDK de Android en la empresa, y formulé documentos de acoplamiento relacionados. Una vez que se complete el desarrollo, me acoplaré con algunos socios.

Pero los proyectos de algunas empresas están escritos en Flutter, y necesitas escribir un complemento de flutter correspondiente al SDK para proporcionarlo a la otra parte, ¿qué? ¿aleteo? ¡De ninguna manera!

Jajaja, pero como programador intrépido, ¿puedes admitirlo? Por supuesto que no puedes (morder la bala)

 

En la última semana, se desarrollará y entregará el complemento Flutter correspondiente. El siguiente es un resumen de mi aprendizaje para desarrollar el complemento Flutter SDK de Android

para resumir

Todo es difícil al principio, pero cuando el ambiente de aleteo ya esté maduro, no entre en pánico.

El primer paso es averiguar cómo llama flutter al código nativo de Android

Recomiende un blog, hay muchos buenos blogs que puede buscar usted mismo : https://developer.aliyun.com/article/697792

También hay un complemento de flutter de código abierto que creo que está mejor escrito, que se puede usar como referencia: https://github.com/OpenFlutter/Pangolin

 

Entorno de instalación

Instalar y configurar el entorno de desarrollo Flutter en el sistema operativo Windows

Crear un proyecto de complemento

Después de configurar el entorno, abra Android Studio -> Archivo-> nuevo-> nuevo Proyecto Flutter -> seleccione Complemento Flutter

Después de que la creación sea exitosa, abra el proyecto y vea esta estructura de directorio. Estamos más preocupados por escribir el complemento de Android

Plugin de escritura

Abrimos el archivo FlutterPlugin en el directorio de android, que es la Demo del plug-in que nos genera el propio proyecto, en esta ventana no es difícil encontrar que muchos códigos nativos de Android serán populares, aunque no afecta a la compilación.

Pero parece incómodo, elegimos Abrir para editar en Android Studio en la esquina superior derecha, elegimos abrir en otra ventana y estará bien.

Echemos un vistazo al código del complemento generado automáticamente para nosotros. Aquí está la sintaxis de Kotlin, que implementa FlutterPlugin, MethodCallHandler

/** FlutterPlugin */
public class FlutterPlugin: FlutterPlugin, MethodCallHandler {
   ...
  private lateinit var channel : MethodChannel

  override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
    channel = MethodChannel(flutterPluginBinding.getFlutterEngine().getDartExecutor(), "flutter_plugin")
    channel.setMethodCallHandler(this);
  }

...
  companion object {
    @JvmStatic
    fun registerWith(registrar: Registrar) {
      val channel = MethodChannel(registrar.messenger(), "flutter_plugin")
      channel.setMethodCallHandler(FlutterPlugin())
    }
  }

  override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
    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)
  }
}

Entre ellos, la interfaz MethodCallHandler se onMethodCall(MethodCall call, MethodChannel.Result result) utiliza para recibir mensajes,

El mensaje recibido aquí es del proyecto Flutter, call es el contenido del mensaje y tiene dos variables miembro de tipo String que call.methodrepresentan el nombre del método llamado.

El tipo de objeto call.argumentsrepresenta los parámetros de entrada pasados ​​por el método de llamada.

Comience a codificar, agregue la dependencia SDK de nuestro propio proyecto de Android en build.gradle en el directorio de Android:

 implementation 'com.jayxu.android:***Sdk:1.0.1'

Sobre la base del código del complemento generado automáticamente, desarrollaremos nuestro proyecto.En el complemento, también necesito obtener el objeto de actividad actual para el salto entre actividades nativas.

Así que también implementé ActivityAware. Para un uso específico, consulte el código (escritura de Kotlin).

/** PedesxpluginPlugin */
public class PedesxpluginPlugin : FlutterPlugin, MethodCallHandler, ActivityAware {

    ...

    private lateinit var channel: MethodChannel
    private lateinit var applicationContext: Context
    private lateinit var activity: Activity

    override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
        onAttachedToEngine(flutterPluginBinding.applicationContext, flutterPluginBinding.binaryMessenger)

    }

    fun onAttachedToEngine(applicationContext: Context, messenger: BinaryMessenger) {
        this.applicationContext = applicationContext
        channel = MethodChannel(messenger, "pedesxplugin")
        channel.setMethodCallHandler(this)
    }

    fun onAttachedToEngine(applicationContext: Context, messenger: BinaryMessenger, activity: Activity) {
        this.applicationContext = applicationContext
        channel = MethodChannel(messenger, "pedesxplugin")
        channel.setMethodCallHandler(this)
        this.activity = activity
    }


   ...

    companion object {
        @JvmStatic
        fun registerWith(registrar: Registrar) {
            val instance = PedesxpluginPlugin()
            instance.onAttachedToEngine(registrar.context(), registrar.messenger(), registrar.activity())
        }
    }

    /**
     * 最主要的回调方法
     */
    override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
        if (call.method == "getPlatformVersion") {
            result.success("Android ${android.os.Build.VERSION.RELEASE}")
        } else if (call.method == "registerPedesx") {
            val appId: String? = call.argument("appId")
            val shelf_id: String? = call.argument("shelf_id")
            val csj_appId: String? = call.argument("csj_appId")
            val csj_video_id: String? = call.argument("csj_video_id")

            //初始化SDK
            PedesxUtil.init(applicationContext, appId, shelf_id, csj_appId, csj_video_id)
        } else if (call.method == "registerPedesxUser") {
            val uid: String? = call.argument("uid")
            val oaid: String? = call.argument("oaid")

            //初始化SDK的User信息
            PedesxUtil.initUser(applicationContext, uid, oaid)
        } else if (call.method == "startPedesxVideoActivity") {

            //跳转我们自己SDK的界面1
            ActivityUtils.startActivity(activity, Demo1Activity::class.java)
        } else if (call.method == "startPedesxWelfareActivity") {

            //跳转我们自己SDK的界面2
            ActivityUtils.startActivity(activity, Demo2Activity::class.java)
        } else {
            result.notImplemented()
        }
    }

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

    override fun onDetachedFromActivity() {

    }

    override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {

    }

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

    override fun onDetachedFromActivityForConfigChanges() {

    }
}

 

En este punto, la parte del complemento de Android está completamente escrita, ¿es muy simple?

Cómo utilizar el complemento

El complemento está escrito, entonces, ¿cómo utiliza el proyecto Flutter nuestro complemento? Nuestro trabajo continúa

Volviendo al proyecto del complemento de flutter, creamos un nuevo archivo dart en el directorio lib. El siguiente es un ejemplo de código. No los he escrito todos. La escritura básica es similar. Este archivo encapsula principalmente el código de la parte del complemento de Android en nuestro proyecto de ejemplo. utilizar.

...

MethodChannel _channel = MethodChannel('pedesxplugin')
  ..setMethodCallHandler(_methodHandler);

StreamController<BasePedesxResponse> _pedesxResponseEventHandlerController =
    new StreamController.broadcast();

Stream<BasePedesxResponse> get pedesxResponseEventHandler =>
    _pedesxResponseEventHandlerController.stream;

Future _methodHandler(MethodCall methodCall) {
  var response =
      BasePedesxResponse.create(methodCall.method, methodCall.arguments);
  _pedesxResponseEventHandlerController.add(response);
  return Future.value();
}

Future<bool> initPedesxSdk({
  @required String appId, //SDK APPId
  @required String shelf_id, //注释1
  @required String csj_appId, //注释2
  @required String csj_video_id, //注释3

}) async {
  return await _channel.invokeMethod("registerPedesx", {
    "appId": appId,
    "shelf_id": shelf_id,
    "csj_appId": csj_appId,
    "csj_video_id": csj_video_id,
  });
}

Future<bool> initPedesxSdkUser({
  @required String uid,
  @required String oaid,
}) async {
  return await _channel
      .invokeMethod("registerPedesxUser", {"uid": uid, "oaid": oaid});
}

Future<bool> startPedesxVideoActivity() async {
  return await _channel.invokeMethod("startPedesxVideoActivity");
}

Future<bool> startPedesxWelfareActivity() async {
  return await _channel.invokeMethod("startPedesxWelfareActivity");
}

...

Aquí comparamos parte del código del complemento de Android con la parte del código que flutter llama al complemento. ¿Está claro?

android 插件代码:

override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
    ...        
    if (call.method == "registerPedesx") {
            val appId: String? = call.argument("appId")
            val shelf_id: String? = call.argument("shelf_id")
            val csj_appId: String? = call.argument("csj_appId")
            val csj_video_id: String? = call.argument("csj_video_id")

            //初始化SDK
            PedesxUtil.init(applicationContext, appId, shelf_id, csj_appId, csj_video_id)
        }
    ...
 }


-----------------------这是一条分界线---------------------------

flutter代码:

Future<bool> initPedesxSdk({
  @required String appId, //SDK APPId
  @required String shelf_id, //货架ID
  @required String csj_appId, //穿山甲APPID
  @required String csj_video_id, //穿山甲激励视频ID

}) async {
  return await _channel.invokeMethod("registerPedesx", {
    "appId": appId,
    "shelf_id": shelf_id,
    "csj_appId": csj_appId,
    "csj_video_id": csj_video_id,
  });
}

El proyecto de ejemplo final llama a parte del código de dardos del complemento:

  _initPedesxSdk() async{
    /**
     *  初始化SDK
     *  appID:此为注释
     *  shelf_id:此为注释
     *  csjAppId:此为注释
     *  codeId:此为注释
     */

    await Pedesxplugin.initPedesxSdk(
        appId: "***",
        shelf_id: "***********",
        csj_appId: "*****",
        csj_video_id: "*******",
    );
  }

Debido a que parte del código implica la privacidad del proyecto, no puede publicarlo todo. Si tiene preguntas sobre los zapatos para niños, puede ir a https://github.com/OpenFlutter/Pangolin , que es muy recomendable.

Supongo que te gusta

Origin blog.csdn.net/Json_Jerry/article/details/62430311
Recomendado
Clasificación