créer un canal de méthode après la mise à niveau de flutter - ne peut pas résoudre la méthode getFlutterView ()


9

J'utilisais la méthode Android native dans mon application Flutter en utilisant la documentation qui disait utilisation

MethodChannel(flutterView, CHANNEL).setMethodCallHandler...

mais après la mise à niveau du scintillement, la MethodChannelfonction ne nécessite plus flutterViewet il n'y en a flutterViewplus.

can not resolve method getFlutterView()

Je pense qu'il devrait y avoir un nouveau tutoriel pour créer une chaîne

à la place, il en a besoin BinaryMessengerque je ne sais pas quoi donner à la place.

c'est l'ancien code qui ne fonctionne plus:

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

Réponses:


16

Remplacez getFlutterView()par getFlutterEngine().getDartExecutor().getBinaryMessenger().

Vous n'avez pas réellement besoin de l' implémentation .getBinaryMessenger()as (par simple transfert), mais je pense qu'il est plus correct de spécifier le messager.DartExecutorBinaryMessenger


Eh bien, cela a bien fonctionné, mais je suppose qu'il y a eu aussi des changements dans l'implémentation de la méthode, il n'y a pas de MethodCallHandler () et onMethodCall () je suppose.
Mahmood Bkh

Gareautrain! Merci beaucoup! +1
devDeejay


2

Ajoutez simplement cette méthode à votre classe:

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

Et puis remplacez éventuellement tous (Refactor> Rename) "getFlutterView" par "getBinaryMessenger" pour avoir un code plus lisible:

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

1

J'ai passé des jours à essayer de comprendre comment ajouter une interface utilisateur Flutter à mon application Android existante. Le plus grand défi était de faire fonctionner le MethodChannel avec FlutterActivity appelé depuis MainActivity. Je sais que c'est un peu différent de la question posée ici, mais ce message a été renvoyé lorsque j'ai fait des recherches sur 'Android FlutterActivity MethodChannel'. Après avoir parcouru de nombreuses ressources sur la façon de le faire, j'ai finalement trouvé ma solution ici: https://github.com/flutter/samples/tree/master/add_to_app/android_using_plugin/app/src/main/java/dev/flutter/ exemple / androidusingplugin

Au départ, dans Android Studio, avec l'application existante ouverte, j'ai tapé sur Fichier, Nouveau, Nouveau module, Module Flutter. J'ai reçu une erreur et j'ai dû effectuer des étapes manuelles.

Mon objectif est de lancer FlutterActivity (ouvre main.dart dans le flutter_module) dans MainActivity - onCreate, puis de développer des `` écrans '' Flutter exploitant autant de code Flutter natif que possible, avec des appels de plateforme limités utilisant le MethodChannel. Pendant que je développe un code Flutter de remplacement, je continuerai à commenter le code Android existant.

Voici ce qui a finalement fonctionné pour moi:

../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
  }
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.