Start Debugging
2023-10-30 Atualizado 2023-11-01 flutter Edit on GitHub

Como corrigir: MissingPluginException: No implementation found for method getAll

Corrija o `MissingPluginException` 'No implementation found for method getAll' do Flutter em shared_preferences e plugins similares (package_info_plus, etc.): ProGuard, registro de plugin, minSdkVersion, hot restart.

Esse é um problema bem comum, que costuma aparecer em builds de release do Flutter. Na maior parte das vezes ele é causado por o ProGuard remover algumas APIs necessárias durante a build, levando a exceções de implementação ausente como a abaixo.

Unhandled exception:
MissingPluginException(No implementation found for method getAll on channel plugins.flutter.io/shared_preferences)
      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:278:7)
<asynchronous suspension>
      SharedPreferences.getInstance (package:shared_preferences/shared_preferences.dart:25:27)
<asynchronous suspension>
      main (file:///lib/main.dart)
<asynchronous suspension>
      _startIsolate.<anonymous closure> (dart:isolate/runtime/libisolate_patch.dart:279:19)
      _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:165:12)

Dito isso, na verdade existem várias causas possíveis para esse problema e, portanto, várias soluções possíveis. Abaixo exploramos todas elas.

Desabilitar minify e shrink

Se o ProGuard for de fato o culpado, dá para resolver isso rápido com alguns ajustes na configuração. Vá até o arquivo /android/app/build.gradle e mude a configuração de build de release de:

buildTypes {
    release {
        signingConfig signingConfigs.release
    }
}

Para isto:

buildTypes {
        release {
            signingConfig signingConfigs.release
            
            minifyEnabled false
            shrinkResources false
        }
}

Atualizar a configuração do ProGuard

Se o passo acima não funcionou, podemos ir um pouco além e mudar a configuração do ProGuard. Para isso, adicione as duas linhas a seguir no arquivo build.gradle, logo após a linha shrinkResources false.

useProguard true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

Em seguida, crie um arquivo proguard-rules.pro na mesma pasta do seu build.gradle (android/app/proguard-rules.pro), com o seguinte conteúdo:

-keep class androidx.lifecycle.DefaultLifecycleObserver

Referenciar o plugin explicitamente em main.dart

Se você não quer desabilitar o minify e o shrink do ProGuard, pode tentar referenciar o plugin explicitamente no seu arquivo main.dart. Isso ajuda o ProGuard a localizar as dependências necessárias e não removê-las durante a build.

Basta chamar qualquer método do plugin diretamente dentro do main.dart e rodar o app de novo.

O plugin não foi registrado

Garanta que seu plugin está registrado chamando o método registerWith no main.dart.

if (Platform.isAndroid) {
    SharedPreferencesAndroid.registerWith();
} else if (Platform.isIOS) {
    SharedPreferencesIOS.registerWith();
}

Trabalhando com background_fetch

Ao trabalhar com background_fetch é importante registrar novamente os plugins dentro da tarefa headless. É só pegar o código de registro acima e colocá-lo no início da função da tarefa.

void backgroundFetchTask(HeadlessTask task) async {
    if (Platform.isAndroid) {
        SharedPreferencesAndroid.registerWith();
    } else if (Platform.isIOS) {
        SharedPreferencesIOS.registerWith();
    }
}

minSdkVersion muito baixo

Talvez você esteja mirando uma versão de SDK menor do que a mínima exigida pelo plugin. Nesse caso, depois de um cold start do app, você deve receber um erro parecido com o de baixo.

The plugin shared_preferences requires a higher Android SDK version.
Fix this issue by adding the following to the file android\app\build.gradle:

android {
  defaultConfig {
    minSdkVersion 21
  }
}

Basta seguir as instruções da mensagem de erro e o problema deve ser resolvido.

A build pode estar em estado inválido

Talvez não haja nada de errado com o seu código ou com as dependências do projeto. O projeto pode ter ficado em um estado inválido durante a instalação do plugin. Para tentar resolver, rode o comando flutter clean, seguido de flutter pub get. Isso faz uma restauração limpa das dependências do projeto. Depois rode o app de novo e veja se o problema continua.

Conflitos com outros pacotes

Existem alguns pacotes conhecidos por entrar em conflito e provocar esse problema. Tente removê-los um a um para ver se o problema desaparece e, identificando o culpado, tente atualizar o pacote — os conflitos podem ter sido resolvidos em versões mais recentes.

Veja uma lista de pacotes que podem disparar o MissingPluginException:

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Voltar