Guia de desenvolvimento e preenchimento do plug-in Flutter Plugin

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
Insira a descrição da imagem aqui
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, MethodCallHandlerEstes 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:

  • registerWithO método estático é a maneira antiga do flutter de carregar plug-ins, carregados por meio de reflexão.
  • onAttachedToEngineOs métodos de interface e onDetachedFromEngineyes FlutterPluginsão a nova maneira do flutter de carregar plug-ins.
  • onAttachedToActivityOs métodos de interface e onDetachedFromActivityyes ActivityAwaresão usados ​​principalmente para obter a Activity onde a página de flutter atual está localizada.
  • onMethodCallSim MethodCallHandler, 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, Mapestes 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 pacote
  • CHANGELOG.mdRegistre as mudanças em cada versão
  • LICENSE 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 publishcomando, 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:
Insira a descrição da imagem aqui
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 privoxyferramentas 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

Sem público

Insira a descrição da imagem aqui

Grupo de troca

Insira a descrição da imagem aqui

Acho que você gosta

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