Crear canal de método después de actualizar flutter: no se puede resolver el método getFlutterView ()

9

Estaba usando el método nativo de Android en mi aplicación flutter usando documentación que decía uso

MethodChannel(flutterView, CHANNEL).setMethodCallHandler...

pero después de actualizar flutter, la MethodChannelfunción no requiere flutterViewy ya no existe flutterView.

can not resolve method getFlutterView()

Creo que debería haber un nuevo tutorial para crear canales

en cambio necesita algo BinaryMessengerque no sé qué regalar.

Este es el código antiguo que ya no funciona:

import io.flutter.app.FlutterActivity;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;

public class MainActivity extends FlutterActivity {
private static final String CHANNEL = "samples.flutter.dev/battery";

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    GeneratedPluginRegistrant.registerWith(this);

    new MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler(
            new MethodCallHandler() {
                @Override
                public void onMethodCall(MethodCall call, Result result) {
                    // Note: this method is invoked on the main thread.
                    // TODO
                }
            });
}
Mahmood Bkh
fuente

Respuestas:

16

Reemplazar getFlutterView()con getFlutterEngine().getDartExecutor().getBinaryMessenger().

En realidad no necesita el .getBinaryMessenger()como DartExecutorinstrumentos BinaryMessengeren sí (por solo reenvío), pero yo creo que es más correcto que debe especificar el mensajero.

Richard Heap
fuente
Bueno, funcionó bien, pero supongo que también hubo algunos cambios en la implementación del método, no hay MethodCallHandler () y onMethodCall (), supongo.
Mahmood Bkh
¡Salvador de la vida! ¡Muchas gracias! +1
devDeejay
2

Quita esto import io.flutter.embedding.android.FlutterActivity;

Agregar esta importación io.flutter.app.FlutterActivity;

Trabajó para mi

Sanskar Tiwari
fuente
De acuerdo con github.com/flutter/flutter/wiki/… se le recomienda usar clases de incrustación
mehrdad seyrafi
2

Simplemente agregue este método a su clase:

BinaryMessenger getFlutterView(){
    return getFlutterEngine().getDartExecutor().getBinaryMessenger();
}

Y luego opcionalmente reemplace todos (Refactor> Rename) "getFlutterView" a "getBinaryMessenger" para tener un código más legible:

BinaryMessenger getBinaryMessenger(){
    return getFlutterEngine().getDartExecutor().getBinaryMessenger();
}
mehrdad seyrafi
fuente
1

Pasé días tratando de descubrir cómo agregar una interfaz de usuario Flutter a mi aplicación Android existente. El mayor desafío fue lograr que MethodChannel funcionara con FlutterActivity desde MainActivity. Sé que esto es un poco diferente a la pregunta que se hace aquí, pero esta publicación fue devuelta cuando busqué 'Android FlutterActivity MethodChannel'. Después de analizar muchos recursos sobre cómo hacer esto, finalmente encontré mi solución aquí: https://github.com/flutter/samples/tree/master/add_to_app/android_using_plugin/app/src/main/java/dev/flutter/ ejemplo / androidusingplugin

Inicialmente, en Android Studio, con la aplicación existente abierta, hice clic en Archivo, Nuevo, Nuevo Módulo, Módulo Flutter. Recibí un error y tuve que realizar pasos manuales.

Mi objetivo es lanzar FlutterActivity (abre main.dart en flutter_module) en MainActivity - onCreate, luego desarrollar las 'pantallas' de Flutter aprovechando la mayor cantidad posible de código nativo de Flutter, con llamadas limitadas de la plataforma utilizando MethodChannel. A medida que desarrolle el código de reemplazo de Flutter, continuaré comentando el código de Android existente.

Esto es lo que finalmente funcionó para mí:

../App_Project/Android/Existing_Android_App/settings.gradle

include ':app'
setBinding(new Binding([gradle: this]))
evaluate(new File(settingsDir.parentFile, '../flutter_module/.android/include_flutter.groovy'))
include ':flutter_module’
project(':flutter_module’).projectDir = new File('../../flutter_module’)
rootProject.name=‘existing_android_app’

../App_Project/Android/Existing_Android_App/app/build.gradle

dependencies {
…
    implementation project(':flutter')
}

../App_Project/Android/Existing_Android_App/app/src/main/AndroidManifest.xml

<activity
    android:name="io.flutter.embedding.android.FlutterActivity"
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
    android:hardwareAccelerated="true"
    android:windowSoftInputMode="adjustResize" />

../App_Project/Android/Existing_Android_App/app/src/main/java/com/existing_android_app/MainActivity.java

package com.existing_android_app;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.embedding.engine.FlutterEngineCache;
import io.flutter.embedding.engine.dart.DartExecutor;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;

public class MainActivity extends AppCompatActivity {

    final String ENGINE_ID = "1";

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        FlutterEngine flutterEngine = new FlutterEngine(this);
        flutterEngine.getDartExecutor().executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault());

        FlutterEngineCache.getInstance().put(ENGINE_ID, flutterEngine);

        MethodChannel channel = new MethodChannel(flutterEngine.getDartExecutor(), "com.existing_android_app/myMethodChannel");

        channel.setMethodCallHandler(
                new MethodChannel.MethodCallHandler() {
                    @Override
                    public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {
                        String url = call.argument("url");
                        if (call.method.equals("openBrowser")) {
                            openBrowser(url);
                        } 
                          else {
                            result.notImplemented();
                        }
                    }
                });

        startActivity(FlutterActivity.withCachedEngine(ENGINE_ID).build(this));
    }

    void openBrowser(String url) {

        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse(url));

        this.startActivity(intent);
    }
}

../App_Project/flutter_module/lib/home_page.dart

class AppHomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<AppHomePage> {

  static const platform = const MethodChannel(‘com.existing_android_app/myMethodChannel’);

  Future<void> _openBrowser() async {
    try {
      final int result = await platform.invokeMethod('openBrowser', <String, String> { 'url': "http://bing.com” });
    }
    catch (e) {
      print('***** _openBrowser error: ' + e.toString());
    }
  }

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
        appBar: CustomAppBar(),
        body: Column(
          children: <Widget>[
            RaisedButton(
              label: Text('Search',
                style: TextStyle(fontSize: 18.0),
              ),
              onPressed: () {  _openBrowser(); },
            ) // RaisedButton.icon
          ], // Widget
        ) // Column
      ) // Scaffold
    ); // SafeArea
  }
AndyW58
fuente