Guía de desarrollo y llenado de complementos de Flutter Plugin

Prefacio

Recientemente desarrollé un complemento de Flutter en mi tiempo libre para actualizar la versión de la aplicación de Android: flutter_xupdate , encontré que no encontré ningún problema durante el proceso de desarrollo, pero encontré muchos problemas al publicar en la plataforma del complemento de flutter , aquí registro Déjame dar algunos consejos a quienes me siguen.

Desarrollo del complemento Flutter Plugin

1. Crea un proyecto de complemento de Flutter

Se recomienda utilizar Android Studio para crear un proyecto aquí. Siga las instrucciones paso a paso. La captura de pantalla es la siguiente: El
Inserte la descripción de la imagen aquí
directorio del proyecto generado contiene principalmente los siguientes contenidos:

  • El directorio "android" es la implementación de la API del complemento en la plataforma Android.
  • El directorio "ios" es la implementación de la API del complemento en la plataforma iOS.
  • El directorio "ejemplo" es un proyecto de ejemplo que utiliza complementos.
  • Los archivos del directorio "lib" se utilizan principalmente para crear "MethodChannel" y luego recibir y procesar mensajes desde la plataforma nativa.

2. Implementar funciones de complemento

Aquí presento principalmente la implementación de API en el lado de Android.

Pit 1: Hay dos versiones de carga del complemento Flutter

Dado que hay dos versiones (Registrar y FlutterPluginBinding) de la forma en que Flutter se basa automáticamente en los complementos, cuando implementamos complementos de Android, para mejorar la compatibilidad, es mejor implementar ambas. Por lo tanto, los complementos de Android deben implementarse FlutterPlugin, ActivityAware, MethodCallHandlerEstas tres interfaces, tomando mi flutter_xupdate plugin de ejemplo, se implementan de la siguiente manera:

public class FlutterXUpdatePlugin implements FlutterPlugin, ActivityAware, MethodCallHandler {
    private static final String PLUGIN_NAME = "com.xuexiang/flutter_xupdate";

    private MethodChannel mMethodChannel;
    private Application mApplication;
    private WeakReference<Activity> mActivity;

	//此处是新的插件加载注册方式
    @Override
    public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
        mMethodChannel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), PLUGIN_NAME);
        mApplication = (Application) flutterPluginBinding.getApplicationContext();
        mMethodChannel.setMethodCallHandler(this);
    }

    @Override
    public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
        mMethodChannel.setMethodCallHandler(null);
        mMethodChannel = null;
    }

    public FlutterXUpdatePlugin initPlugin(MethodChannel methodChannel, Registrar registrar) {
        mMethodChannel = methodChannel;
        mApplication = (Application) registrar.context().getApplicationContext();
        mActivity = new WeakReference<>(registrar.activity());
        return this;
    }

    @Override
    public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
        switch (call.method) {
            case "getPlatformVersion":
                result.success("Android " + android.os.Build.VERSION.RELEASE);
                break;
            case "initXUpdate":
                initXUpdate(call, result);
                break;
			...
            default:
                result.notImplemented();
                break;
        }
    }

    @Override
    public void onAttachedToActivity(ActivityPluginBinding binding) {
        mActivity = new WeakReference<>(binding.getActivity());
    }

    @Override
    public void onDetachedFromActivityForConfigChanges() {

    }

    @Override
    public void onReattachedToActivityForConfigChanges(ActivityPluginBinding binding) {

    }

    @Override
    public void onDetachedFromActivity() {
        mActivity = null;
    }

	//此处是旧的插件加载注册方式
    public static void registerWith(Registrar registrar) {
        final MethodChannel channel = new MethodChannel(registrar.messenger(), PLUGIN_NAME);
        channel.setMethodCallHandler(new FlutterXUpdatePlugin().initPlugin(channel, registrar));
    }
}

El código anterior debe prestar atención a:

  • registerWithEl método estático es la forma antigua de Flutter de cargar complementos, cargados mediante reflexión.
  • onAttachedToEngineLos métodos de interfaz y onDetachedFromEngineyes FlutterPluginson la nueva forma de cargar complementos de flutter.
  • onAttachedToActivityLos métodos de interfaz y onDetachedFromActivityyes ActivityAwarese utilizan principalmente para obtener la actividad donde se encuentra la página de aleteo actual.
  • onMethodCallMethodCallHandler, el método de interfaz se utiliza principalmente para recibir la implementación de llamadas de método nativo de Flutter.

Pit 2: existen restricciones sobre el tipo de interacción de datos entre nativo y flutter

Al desarrollar un complemento, debe involucrar la interacción de datos entre nativo y flutter. Cabe señalar aquí que, al igual que cuando desarrollamos react-native y JNI, no todos los tipos de datos son compatibles. Interactivo. A continuación, doy los tipos de datos interactivos entre nativo y flutter:

Dardo Androide iOS
nulo nulo nil (NSNull cuando está anidado)
bool java.lang.Boolean NSNumber numberWithBool:
En t java.lang.Integer NSNumber numberWithInt:
int, si 32 bits no son suficientes java.lang.Long NSNumber numberWithLong:
doble java.lang.Double NSNumber numberWithDouble:
Cuerda java.lang.String NSString
Uint8List byte[] FlutterStandardTypedData typedDataWithBytes:
Int32List En t[] FlutterStandardTypedData typedDataWithInt32:
Int64List largo[] FlutterStandardTypedData typedDataWithInt64:
Float64List doble[] FlutterStandardTypedData typedDataWithFloat64:
Lista java.util.ArrayList NSArray
Mapa java.util.HashMap NSDiccionario

Aquí se utiliza la mayor parte es el bool, int, String, Mapestos tipos de

3. Versión de complemento

La versión del complemento encuentra la mayoría de los problemas y requiere atención adicional.

Mejorar la documentación

Se recomienda agregar los siguientes documentos al proyecto del complemento:

  • README.md: Archivo que presenta el paquete
  • CHANGELOG.mdRegistra los cambios en cada versión
  • LICENSE Archivo que contiene los términos de licencia del paquete de software
  • Documentación de API para todas las API públicas

Publicar complemento

Ejecute el siguiente comando para publicar:

flutter packages pub publish

¿Crees que se acabó? ¡No, no, hay demasiados hoyos abajo!

Pit point 3: la autenticación de permisos requiere acceso a la cuenta de Google

Como queremos publicar el complemento en la plataforma de complementos de flutter , necesitamos saber que esta plataforma está construida por Google. Si necesitamos publicar, debemos iniciar sesión en nuestra cuenta de Google para la autenticación. Después de ingresar el flutter packages pub publishcomando, recibiremos un enlace de autenticación, que es lo que necesitamos. Iniciamos sesión en la cuenta de Google.

Para saber que Google es inaccesible en China, aquí necesitamos encontrar una manera (qué método conoce) para iniciar sesión en la cuenta de Google y autenticar.

Pit 4: Los documentos de construcción de la red china Flutter son venenosos

¿Crees que terminaste después de iniciar sesión en tu cuenta de Google? ¡Pensando demasiado! Hay un gran problema aquí es el problema de configuración del entorno de Flutter Chinese en línea, como se muestra en la siguiente figura:
Inserte la descripción de la imagen aquí
Aquí, el funcionario nos dejó configurar el espejo temporal de Flutter, y la mayoría de la gente acaba de contactar Siempre sigo la documentación oficial paso a paso, y creo que este paso es definitivamente indispensable. Pero es un paso tan discreto que me atasca en el paso de la certificación. Es inútil encontrar una solución durante mucho tiempo en Internet. También hay algunos intermedios. La gente dice que es por el problema de la duplicación, no me atrevo a creer que sea por este problema.

Aquí podemos pasar la autenticación eliminando la configuración del espejo.

Pozo cinco: las herramientas científicas de Internet no funcionan en el terminal de comando

Pensé que era difícil pasar la autenticación, pero la carga siempre será exitosa ahora, pero el accidente Uploading...sucedió nuevamente. Me quedé atascado y la carga falló.

Uploading...
Failed to upload the package.

En Baidu en Internet, se dice que las herramientas científicas de Internet no funcionan en el terminal de comando, y es necesario establecer un proxy para la línea de comando.

export https_proxy=http://127.0.0.1:1087
export http_proxy=http://127.0.0.1:1087
set https_proxy=https://127.0.0.1:1087
set http_proxy=http://127.0.0.1:1087

Como estoy usando la versión para Mac de la herramienta científica de Internet, el pequeño avión, mi puerto proxy es 1087.

Sin embargo, es imposible cargar correctamente con esta configuración directamente. Necesitamos usar privoxyherramientas para completar el proxy del terminal. El funcionamiento es el siguiente:

  • Instalar privoxy
brew install privoxy
  • Modificar la configuración de privoxy
vim /usr/local/etc/privoxy/config

Agregue estas dos configuraciones (tenga en cuenta que el número de puerto en la primera línea debe basarse en su proxy científico de Internet, no lo cambié aquí, el valor predeterminado es 1087) y tenga cuidado de no olvidar un espacio y un punto al final.

listen-address 0.0.0.0:1087
forward-socks5 / localhost:1080 .
  • Iniciar privoxy
sudo /usr/local/sbin/privoxy /usr/local/etc/privoxy/config

Después de comenzar, verifiquemos si se inició:

netstat -na | grep 1087

Si aparece un resultado similar al siguiente, el inicio es exitoso.

tcp4 0 0 127.0.0.1.1087 *.* LISTEN

Vuelva a ejecutar en este momento:

export https_proxy=http://127.0.0.1:1087
export http_proxy=http://127.0.0.1:1087
set https_proxy=https://127.0.0.1:1087
set http_proxy=http://127.0.0.1:1087

Finalmente, ejecute el comando de liberación:

flutter packages pub publish

Si aparecen los siguientes resultados, ¡demuestra que el lanzamiento fue exitoso!

Waiting for your authorization...

Authorization received, processing...

Successfully authorized.

Uploading...

Successfully uploaded package.

enlaces relacionados

No publico

Inserte la descripción de la imagen aquí

Grupo de intercambio

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/xuexiangjys/article/details/104351616
Recomendado
Clasificación