MethodChannel em Flutter. Como acessar o código nativo (Android/IOS) no flutter usando MethodChannel.

Tempo de leitura: 2 minutes

Usei MethodChannel para acessar o código nativo do Android.

Siga passo a passo:

Passo #1: Crie um projeto Flutter e escreva o código no arquivo main.dart.

Veja o código abaixo, existe _methodChannel é um objeto de MethodChannel com o nome de MethodChannel, lembre-se que o mesmo nome de MethodChannel deve estar no código nativo.

Future<void> _getDocuments() async {
MethodChannel _methodChannel = MethodChannel('flutter/MethodChannelDemo');
  List<dynamic> documentList=[""];
  try {
    documentList = await _methodChannel.invokeMethod(
        "Documents");
  } on PlatformException catch(e){
    print("exceptiong");
  }
  documentList.forEach((document) {
    print("Document: $document");  // pesquise no Logcat "Document" 
  });
}

Passo 2: Escreva o código em Android Native em Kotlin.

  • Usei várias vezes o MethodChannel e obtive duas diferenças.
  • Nota: – se você estiver usando “override fun configureFlutterEngine”, então usou “flutterEngine.dartExecutor” no parâmetro MethodChannel de BinaryMessenger. ou se estiver usando “override fun onCreate”, use “flutterView” no parâmetro MethodChannel de BinaryMessenger.
package com.anidhisoftware.methodchannel_demo

import android.os.Environment
import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugins.GeneratedPluginRegistrant
import java.io.File
import java.lang.reflect.Method
import java.util.*
import kotlin.collections.ArrayList

class MainActivity: FlutterActivity() {
    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine);
        MethodChannel(flutterEngine.dartExecutor,"flutter/MethodChannelDemo").setMethodCallHandler{
            call,result ->
            if (call.method=="Documents"){
                val folder = File(Environment.getExternalStorageDirectory().path + "/Download")
                val allFiles: Array<File> = folder.listFiles()
                val list = Arrays.asList(allFiles)
                var imgs = ArrayList<String>()
                if (list.size >= 1) {
                    for (i in 0..list[0].size - 1) {
                        imgs.add(list[0][i].toString())
                    }
                }
                if (imgs.size <= 0) {
                    result.error("Empty", "No Documents.", null);
                } else {
                    result.success(imgs);
                }

            }
        }
    }
}
  • Tipos de dados Flutter. Você pode retornar os tipos de dados abaixo do código nativo.

 

Passo 3: Se você precisar de alguma funcionalidade que exija permissão do usuário, escreva a permissão no arquivo manifest.xml e a permissão de tempo de execução no flutter. Como aqui estamos acessando arquivos da pasta Download, preciso de permissão de leitura.

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

 

Para ver o código, veja no meu Github: (Git)