基本和官网一毛一样。。。。看了官网就不用看这个了,看了也是浪费时间,我也写不出花来
创建flutter module
命令行执行 flutter create -t module flutter_module
或者直接使用AS创建。
路径可以和你的工程平级,也可以是工程的子级。只是在配置setting.gradle
时注意一下文件夹位置就好。
修改工程的 setting.gradle
添加如下代码
1 2 3 4 5
| setBinding(new Binding([gradle: this])) evaluate(new File( settingsDir.parentFile, 'flutter_check/.android/include_flutter.groovy' ))
|
如果flutter module和工程平级,则是上面的代码。
如果flutter module是工程的子目录,则settingsDir.parentFile,
改为settingsDir,
主工程依赖
1 2 3 4 5 6
| dependencies { ... implementation(project(':flutter'),{ exclude group: 'com.android.support' }) ...
|
设置一下编译用的Java版本
1 2 3 4
| compileOptions { sourceCompatibility 1.8 targetCompatibility 1.8 }
|
如果有support包冲突,则exclude排除一下
Android中加载flutter界面
找个Activity,在onCreate中
1 2
| FlutterView flutterView = Flutter.createView(this, getLifecycle(), "main"); setContentView(flutterView);
|
在flutter module中main.dart
中添加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| 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中
1 2 3 4 5 6 7 8 9 10 11
| MethodChannel channel = const MethodChannel('my_flutter/plugin');
onTap: () async { try { await channel.invokeMethod('to_webview',"https://blog.huangyuanlove.com"); } on PlatformException catch (e) { print(e.message); } },
|
反之,Android调用flutter也是一样的。Android中调用
mChannel.invokeMethod("methodName","params");
在flutter中
channel.setMethodCallHandler(methodHandler);
混编的情况下flutter的热重载还是有效的,在flutter module的目录下执行flutter attach
,会有提示。
以上