欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

flutter-Android混编及互相调用

程序员文章站 2022-03-31 08:21:05
2019-03-13文章目录创建flutter module修改工程的 setting.gradle主工程依赖Android中加载flutter界面互相调用基本和官网一毛一样。。。。看了官网就不用看这个了,看了也是浪费时间,我也写不出花来创建flutter module命令行执行 flutter create -t module flutter_module或者直接使用AS创建。路径可以和你的工程平级,也可以是工程的子级。只是在配置setting.gradle时注意一下文件夹位置就好。修改工程...

2019-03-13


基本和官网一毛一样。。。。看了官网就不用看这个了,看了也是浪费时间,我也写不出花来

创建flutter module

命令行执行 flutter create -t module flutter_module或者直接使用AS创建。
路径可以和你的工程平级,也可以是工程的子级。只是在配置setting.gradle时注意一下文件夹位置就好。

修改工程的 setting.gradle

添加如下代码

setBinding(new Binding([gradle: this]))                       
evaluate(new File( 
        settingsDir.parentFile,
        'flutter_check/.android/include_flutter.groovy'
))

如果flutter module和工程平级,则是上面的代码。
如果flutter module是工程的子目录,则settingsDir.parentFile,改为settingsDir,

主工程依赖

dependencies {
    ...
    implementation(project(':flutter'),{
        exclude group: 'com.android.support'
    })
    ...

设置一下编译用的Java版本

compileOptions {
        sourceCompatibility 1.8
        targetCompatibility 1.8
    }

如果有support包冲突,则exclude排除一下

Android中加载flutter界面

找个Activity,在onCreate中

FlutterView flutterView = Flutter.createView(this, getLifecycle(), "main");
setContentView(flutterView);

在flutter module中main.dart中添加

import 'dart:ui';
void main() {
  runApp(_widgetForRoute(window.defaultRouteName));
}

Widget _widgetForRoute(String route) {
  switch (route) {
    case 'main':
    case '/':
      return App();
    default:
      return Center(
        child: Text('Unknown route: $route', textDirection: TextDirection.ltr),
      );
  }
}

这里注意的是,case中的main要和Activity中创建FlutterView参数一致。

互相调用

通过 MethodChannel互相调用
在Activity中初始化一个MethodChannel

private void initChannel(FlutterView flutterView) {
        mChannel = new MethodChannel(flutterView, "my_flutter/plugin");

        mChannel.setMethodCallHandler(new MethodChannel.MethodCallHandler() {
            @Override
            public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {
                switch (methodCall.method) {
                    case "to_license":
                        startActivity(new Intent(MainActivity.this,LicenseActivity.class));
                        result.success(true);
                        break;
                    case "to_webview":
                        String url = methodCall.arguments.toString();

                        Uri uri = Uri.parse(url);
                        Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                        if (intent.resolveActivity(getPackageManager()) != null) {
                            // 网址正确 跳转成功
                            startActivity(intent);
                            result.success(true);
                        } else {
                            result.success(false);
                        }
                        result.success("jump");
                        break;
                    default:
                        break;
                }
            }
        });

注意channel的名字,这里设置一个MethodChannel.MethodCallHandler,在回调函数中可以通过methodCall.method拿到fluter调用的方法名字。result则是回调flutter,这个方法执行的结果。
在flutter中

//初始化一个channel,名字和Android中一致
MethodChannel channel = const MethodChannel('my_flutter/plugin');
//在某个控件的点击事件上调用Android
onTap: () async {
    try {
        await channel.invokeMethod('to_webview',"https://blog.huangyuanlove.com");
        // 将 dynamic 类型转换成需要的类型(与平台端返回值给定的类型要一致)
    } on PlatformException catch (e) {
        print(e.message);
    }
},

反之,Android调用flutter也是一样的。Android中调用
mChannel.invokeMethod("methodName","params");
在flutter中
channel.setMethodCallHandler(methodHandler);
混编的情况下flutter的热重载还是有效的,在flutter module的目录下执行flutter attach,会有提示。


以上

本文地址:https://blog.csdn.net/huangyuan_xuan/article/details/109350494