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

升级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)

Kiwi2021

Flutter用什么语言开发?
Flutter 用Dart作为开发框架和widget的语言,详情请参考为什么Flutter选择使用Dart语言 。

Dart语言好学吗?
如果你有编程经验,尤其是了解Java或Javascript, 那么你回发现Dart学习起来非常容易极速赛车,笔者只用了两个小时基本就开始愉快的使用Dart编码了。Flutter中文网编辑了一份可以帮助您快速学习Dart的Dart语言资源列表,希望对你有用。

Flutter支持像webpack一样“热重载”或者Android “instant run”吗?
支持,Flutter支持Hot Reload,SG飞艇通过将更新的源代码文件注入正在运行的Dart VM(虚拟机)中工作。这不仅包括添加新类,还包括向现有类添加方法和字段,以及更改现有函数。详情请参阅Flutter热重载 。

对于程序员/开发人员来说,要使用Flutter必须具备哪些经验?
Flutter对熟悉面向对象概念(类、方法、变量等)和命令式编程概念(循环、条件等)的程序员来说是很容易入门的。学习和使用Flutter,无需事先具有移动开发经验。 我们已经看到了一些不怎么有编程经验的人学习并使用Flutter进行原型设计和应用程序英国乐透8开发。

2021-11-17 11:11 0 回复
发布评论
回复X
聊天室(0