Methodenkanal nach dem Upgrade von flutter erstellen - Methode getFlutterView () kann nicht aufgelöst werden


9

Ich habe die native Android-Methode in meiner Flatter-App verwendet und dabei die Dokumentation verwendet, in der die Verwendung angegeben ist

MethodChannel(flutterView, CHANNEL).setMethodCallHandler...

Nach dem Aufrüsten des Flatterns ist die MethodChannelFunktion jedoch nicht erforderlich flutterViewund es gibt keine flutterViewmehr.

can not resolve method getFlutterView()

Ich denke, es sollte ein neues Tutorial zum Erstellen eines Kanals geben

Stattdessen braucht es einige, von BinaryMessengerdenen ich nicht weiß, was ich stattdessen geben soll.

Dies ist der alte Code, der nicht mehr funktioniert:

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
                }
            });
}

Antworten:


15

Ersetzen getFlutterView()durch getFlutterEngine().getDartExecutor().getBinaryMessenger().

Sie brauchen das .getBinaryMessenger()as- DartExecutorImplementierungsprogramm BinaryMessengerselbst nicht (nur durch Weiterleiten), aber ich denke, es ist korrekter, den Messenger anzugeben.


Nun, es hat gut funktioniert, aber ich denke, es gab auch einige Änderungen in der Methodenimplementierung. Es gibt keine MethodCallHandler () und onMethodCall (), denke ich.
Mahmood Bkh

Lebensretter! Vielen Dank! +1
devDeejay


2

Fügen Sie diese Methode einfach Ihrer Klasse hinzu:

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

Und dann ersetzen Sie optional alle (Refactor> Rename) "getFlutterView" durch "getBinaryMessenger", um einen besser lesbaren Code zu erhalten:

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

1

Ich habe tagelang versucht herauszufinden, wie ich meiner vorhandenen Android-App eine Flutter-Benutzeroberfläche hinzufügen kann. Die größte Herausforderung bestand darin, den MethodChannel dazu zu bringen, mit FlutterActivity zu arbeiten, das von MainActivity aufgerufen wird. Ich weiß, dass dies etwas anders ist als die hier gestellte Frage, aber dieser Beitrag wurde zurückgegeben, als ich nach 'Android FlutterActivity MethodChannel' gesucht habe. Nachdem ich viele Ressourcen durchgesehen hatte, fand ich hier endlich meine Lösung: https://github.com/flutter/samples/tree/master/add_to_app/android_using_plugin/app/src/main/java/dev/flutter/ Beispiel / androidusingplugin

Zunächst habe ich in Android Studio bei geöffneter vorhandener App auf Datei, Neu, Neues Modul, Flattermodul getippt. Ich habe einen Fehler erhalten und musste manuelle Schritte ausführen.

Mein Ziel ist es, FlutterActivity (öffnet main.dart im flutter_module) in MainActivity - onCreate zu starten und dann Flutter-Bildschirme zu entwickeln, die so viel nativen Flutter-Code wie möglich nutzen, mit begrenzten Plattformaufrufen unter Verwendung des MethodChannel. Während ich Ersatz-Flutter-Code entwickle, werde ich den vorhandenen Android-Code weiterhin auskommentieren.

Folgendes hat bei mir endlich funktioniert:

../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
  }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.