web-dev-qa-db-fra.com

FlutterActivity MethodChannel et FlutterView

J'ai donc écrit une application Flutter il y a environ 4 mois. Maintenant, je voulais faire un petit changement, mais je ne peux plus compiler l'application, car GeneratedPluginRegistrant.registerWith (this) ne fonctionne plus, je n'ai pas changé le code Kotlin uniquement le code Dart.

Le "this" dans "GeneratedPluginRegistrant.registerWith (this)" me montre cette erreur:

Type mismatch.    
Required: FlutterEngine!    
Found: MainActivity

La classe MainActivity:

import Android.os.Bundle
import io.flutter.app.FlutterActivity
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugins.GeneratedPluginRegistrant
import io.flutter.view.FlutterMain

class MainActivity : FlutterActivity() {

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    GeneratedPluginRegistrant.registerWith(this) // here is the error: Type mismatch. Required: FlutterEngine! Found: MainActivity

    MethodChannel(flutterView, CHANNEL).setMethodCallHandler { call, result ->
      if (call.method == "helloFromNativeCode") {
        val greetings = helloFromNativeCode()
        result.success(greetings)
      }
    }
  }

  private fun helloFromNativeCode(): String {
    return "Hello from Native Android Code"
  }

  companion object {
    private const val CHANNEL = "flutter.native/helper"
  }
}

Et si c'est utiliser:

import io.flutter.embedding.Android.FlutterActivity

au lieu de

import io.flutter.app.FlutterActivity

Je peux utiliser

override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine);
    }

mais avez des problèmes avec:

MethodChannel(flutterView, CHANNEL).setMethodCallHandler { call, result ->
      if (call.method == "helloFromNativeCode") {
        val greetings = helloFromNativeCode()
        result.success(greetings)
      }
    }

parce que je reçois une erreur sur flutterView:

Unresolved reference: flutterView

Le code ressemblerait à ceci:

import Android.os.Bundle
import io.flutter.embedding.Android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugins.GeneratedPluginRegistrant
import io.flutter.view.FlutterMain

class MainActivity : FlutterActivity() {
    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine);
    }

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    MethodChannel(flutterView, CHANNEL).setMethodCallHandler { call, result -> // here is the error
      if (call.method == "helloFromNativeCode") {
        val greetings = helloFromNativeCode()
        result.success(greetings)
      }
    }
  }

  private fun helloFromNativeCode(): String {
    return "Hello from Native Android Code"
  }

  companion object {
    private const val CHANNEL = "flutter.native/helper"
  }
}

J'espère que quelqu'un pourra m'aider.

3
Awe

J'ai passé des jours à essayer de comprendre comment ajouter une interface utilisateur Flutter à mon Android App existante. Le plus grand défi était de faire fonctionner MethodChannel avec FlutterActivity appelé depuis MainActivity. Je sais que c'est un peu différente 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/example/androidusingplugin

Initialement, dans Android Studio, avec l'application existante ouverte, j'ai appuyé 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 plate-forme limités utilisant le MethodChannel. Pendant que je développe un code Flutter de remplacement, je continuerai à commenter le code Android Android.

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
  }
0
AndyW58

Tu devrais utiliser

import io.flutter.embedding.Android.FlutterActivity;

et déclarez votre patformChannel dans

     @Override
  public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
    GeneratedPluginRegistrant.registerWith(flutterEngine);
    new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
        .setMethodCallHandler(
          (call, result) -> {
            // Note: this method is invoked on the main thread.
            // TODO
          }
        );
  }

pour plus, vous pouvez consulter la documentation: https://flutter.dev/docs/development/platform-integration/platform-channels

0
winqoo