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
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
, MethodCallHandler
Estas 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:
registerWith
El método estático es la forma antigua de Flutter de cargar complementos, cargados mediante reflexión.onAttachedToEngine
Los métodos de interfaz yonDetachedFromEngine
yesFlutterPlugin
son la nueva forma de cargar complementos de flutter.onAttachedToActivity
Los métodos de interfaz yonDetachedFromActivity
yesActivityAware
se utilizan principalmente para obtener la actividad donde se encuentra la página de aleteo actual.onMethodCall
SíMethodCallHandler
, 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
, Map
estos 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 paqueteCHANGELOG.md
Registra los cambios en cada versiónLICENSE
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 publish
comando, 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:
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 privoxy
herramientas 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
- Tutorial del complemento Flutter de desarrollo de redes en chino de Flutter
- flutter_xupdate realiza la actualización de la versión de la aplicación Flutter con un clic