Prefácio
Recentemente desenvolvi um plugin Flutter nas minhas horas vagas para atualizar a versão do app Android: flutter_xupdate , descobri que não encontrei pits durante o processo de desenvolvimento, mas encontrei muitos problemas ao publicar na plataforma do plugin flutter , aqui eu registro Deixe-me dar alguns conselhos para aqueles que me seguem.
Desenvolvimento do plugin Flutter Plugin
1. Crie um projeto de plugin do Flutter Plugin
É recomendável usar o Android Studio para criar um projeto aqui. Siga as instruções passo a passo. A captura de tela é a seguinte: O
diretório do projeto gerado contém principalmente o seguinte conteúdo:
- O diretório "android" é a implementação da API do plug-in na plataforma Android.
- O diretório "ios" é a implementação da API do plug-in na plataforma iOS.
- O diretório "example" é um projeto de exemplo usando plug-ins.
- Os arquivos no diretório "lib" são usados principalmente para criar "MethodChannel" e, em seguida, receber e processar mensagens da plataforma nativa
2. Implementar funções de plug-in
Aqui, apresento principalmente a implementação da API no lado Android.
Poço 1: Existem duas versões de carregamento do plugin Flutter
Como existem duas versões (Registrar e FlutterPluginBinding) da maneira como o Flutter depende automaticamente de plug-ins, quando implementamos plug-ins Android, para melhorar a compatibilidade, é melhor implementar ambos. Portanto, os plug-ins Android precisam ser implementados FlutterPlugin
, ActivityAware
, MethodCallHandler
Estes três interfaces, tendo o meu flutter_xupdate plugin como um exemplo, são implementados como segue:
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));
}
}
O código acima deve prestar atenção a:
registerWith
O método estático é a maneira antiga do flutter de carregar plug-ins, carregados por meio de reflexão.onAttachedToEngine
Os métodos de interface eonDetachedFromEngine
yesFlutterPlugin
são a nova maneira do flutter de carregar plug-ins.onAttachedToActivity
Os métodos de interface eonDetachedFromActivity
yesActivityAware
são usados principalmente para obter a Activity onde a página de flutter atual está localizada.onMethodCall
SimMethodCallHandler
, o método de interface é usado principalmente para receber a implementação de chamadas de métodos nativos do Flutter.
Poço 2: Existem restrições sobre o tipo de interação de dados entre nativo e flutter
Ao desenvolver um plug-in, ele deve envolver a interação de dados entre nativo e flutter. Deve-se observar aqui que, assim como quando estamos desenvolvendo nativo-reativo e JNI, nem todos os tipos de dados são suportados Interativo. A seguir, apresento os tipos de dados interativos entre nativo e flutter:
Dardo | Android | iOS |
---|---|---|
nulo | nulo | nulo (NSNull quando aninhado) |
bool | java.lang.Boolean | NSNumber numberWithBool: |
int | java.lang.Integer | NSNumber numberWithInt: |
int, se 32 bits não forem suficientes | java.lang.Long | NSNumber numberWithLong: |
em dobro | java.lang.Double | NSNumber numberWithDouble: |
Corda | java.lang.String | NSString |
Uint8List | byte[] | FlutterStandardTypedData typedDataWithBytes: |
Int32List | int [] | FlutterStandardTypedData typedDataWithInt32: |
Int64List | longo[] | FlutterStandardTypedData typedDataWithInt64: |
Float64List | em dobro[] | FlutterStandardTypedData typedDataWithFloat64: |
Lista | java.util.ArrayList | NSArray |
Mapa | java.util.HashMap | NSDictionary |
Aqui usamos o mais é a bool
, int
, String
, Map
estes tipos de
3. Versão do plug-in
O lançamento do plug-in encontra a maioria dos poços e requer atenção adicional.
Melhorar a documentação
Recomenda-se adicionar os seguintes documentos ao projeto de plug-in:
README.md
: Arquivo de apresentação do pacoteCHANGELOG.md
Registre as mudanças em cada versãoLICENSE
Arquivo contendo os termos de licença do pacote de software- Documentação de API para todas as APIs públicas
Publicar plugin
Execute o seguinte comando para publicar:
flutter packages pub publish
Você acha que acabou assim? Não, não, há muitos poços abaixo !!
Pit point 3: A autenticação de permissão requer acesso à conta do Google
Como queremos publicar o plug- in na plataforma de plug-in flutter , precisamos saber que esta plataforma é construída pelo Google. Se precisarmos publicar, devemos fazer login em nossa conta do Google para autenticação. Depois de inserir o flutter packages pub publish
comando, receberemos um link de autenticação, que é o que precisamos Nós entramos na conta do Google.
Para saber que o Google está inacessível na China, precisamos encontrar uma maneira (qual método você conhece) de fazer login na conta do Google e autenticar.
Poço 4: documentos de construção de rede chineses oscilantes são venenosos
Você acha que terminou depois de fazer login na sua conta do Google? Está pensando muito! Há um grande buraco aqui é o problema de configuração do ambiente do Flutter Chinese online, conforme mostrado na figura a seguir:
Aqui, o oficial nos deixou configurar o espelho temporário do Flutter, e a maioria das pessoas acabou de entrar em contato Sempre sigo a documentação oficial passo a passo e acredito que essa etapa é definitivamente indispensável. Mas é uma etapa tão imperceptível que me deixa estagnado na etapa de certificação. É inútil encontrar uma solução por muito tempo na Internet. Existem também alguns intermediários. As pessoas dizem que é por causa do problema de espelhamento, não me atrevo a acreditar que seja por esse problema.
Aqui podemos passar a autenticação removendo a configuração do espelho.
Ponto cinco: ferramentas científicas da Internet não funcionam no terminal de comando
Achei difícil passar na autenticação, mas o upload será bem-sucedido dessa vez, mas Uploading...
aconteceu novamente um acidente .
Uploading...
Failed to upload the package.
No Baidu na Internet, diz-se que as ferramentas científicas da Internet não funcionam no terminal de comando, e é necessário definir um proxy para a linha 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
Porque estou usando a versão para Mac da ferramenta científica da Internet, o avião pequeno, então minha porta proxy está 1087
.
No entanto, é impossível fazer upload com sucesso com esta configuração diretamente. Precisamos usar privoxy
ferramentas para completar o proxy do terminal. A operação é a seguinte:
- Instale privoxy
brew install privoxy
- Modificar a configuração do privoxy
vim /usr/local/etc/privoxy/config
Adicione essas duas configurações (observe que o número da porta na primeira linha deve ser baseado no seu proxy científico da Internet, não o alterei aqui, o padrão é 1087) e tome cuidado para não esquecer um espaço e um ponto no final.
listen-address 0.0.0.0:1087
forward-socks5 / localhost:1080 .
- Iniciar privoxy
sudo /usr/local/sbin/privoxy /usr/local/etc/privoxy/config
Depois de começar, vamos verificar se já começou:
netstat -na | grep 1087
Se um resultado semelhante ao seguinte aparecer, a inicialização foi bem-sucedida.
tcp4 0 0 127.0.0.1.1087 *.* LISTEN
Execute novamente neste 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, execute o comando de liberação:
flutter packages pub publish
Se os resultados a seguir aparecerem, isso prova que o lançamento foi bem-sucedido!
Waiting for your authorization...
Authorization received, processing...
Successfully authorized.
Uploading...
Successfully uploaded package.
Links Relacionados
- Flutter Chinese Network Development Tutorial Flutter Plug-in
- flutter_xupdate realiza atualização da versão do aplicativo Flutter com um clique