Flutter-GeneratedPluginRegistrant.registerWith(flutterEngine),MethodChannel和getFlutterView的问题
2019-12-24 17:09 浏览(5383

升级flutter到1.12后,用AS创建的flutter项目默认用了kotlin,但是我不会啊,我改成了java。

1、首先第一个问题,更改 gradle 版本,不然打开android 项目会build失败

项目\android\build.gradle

修改如下:

//classpath 'com.android.tools.build:gradle:3.5.0'
classpath 'com.android.tools.build:gradle:3.3.0'

项目\android\gradle\wrapper\gradle-wrapper.properties

修改如下:

#distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip

具体的版本可以自己修改试一下


2、使用java


项目\android\app\build.gradle

删除如下几行:

apply plugin: 'kotlin-android'
...
sourceSets {
    main.java.srcDirs += 'src/main/kotlin'
}
...
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"

项目\android\build.gradle

删除如下几行:

ext.kotlin_version = '1.3.50'
...
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

把这个文件夹删了:项目\android\app\src\main\kotlin。(最好是先复制到其它地方去)

然后自己创建了对应的java目录和文件:项目\android\app\src\main\java\com\xxx\xxx


由于新版本的flutter 使用了FlutterEngine,所以 MainActivity 的代码如下:

import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugins.GeneratedPluginRegistrant;

public class MainActivity extends FlutterActivity {
    
    @Override
    public void configureFlutterEngine(FlutterEngine flutterEngine){
        GeneratedPluginRegistrant.registerWith(flutterEngine);
    }
}


3、如何使用 MethodChannel 和 flutter 通信

由于使用了 import io.flutter.embedding.android.FlutterActivity ,所以不能使用 getFlutterView() 获取 BinaryMessenger(继承io.flutter.app.FlutterActivity才有getFlutterView)。

当然不要试图去继承  io.flutter.app.FlutterActivity,然后修改 ,项目\android\app\src\main\java\io\flutter\plugins\GeneratedPluginRegistrant.java,GeneratedPluginRegistrant.java文件会在运行时动态改变,强制使用 FlutterEngine

试了很多方法,然后我打开 FlutterEngine 源码,查看了一下,找到了一个 dartExecutor 属性,再次点击 DartExecutor 发现它继承自 BinaryMessenger,完美

可以用 flutterEngine.getDartExecutor() 替换 getFlutterView(),修改后代码如下:

import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugins.GeneratedPluginRegistrant;

public class MainActivity extends FlutterActivity {

    private static final String CHANNEL = "com.xxx.xxx/map";
    private MethodChannel methodChannel;

    @Override
    public void configureFlutterEngine(FlutterEngine flutterEngine){
        GeneratedPluginRegistrant.registerWith(flutterEngine);
        methodChannel = new MethodChannel(flutterEngine.getDartExecutor(), CHANNEL);
        methodChannel.setMethodCallHandler(
                new MethodChannel.MethodCallHandler() {
                    @Override
                    public void onMethodCall(MethodCall call, MethodChannel.Result result) {
                        if (call.method.equals("getLocationAddress")) {
                            //do something
                        } else {
                            //没有对应方法
                            result.notImplemented();
                        }
                    }
                }
        );
    }

}


评论(3)
发布评论
回复X
聊天室(0