集成
假设你已经有了一个原生项目…
- 在android项目路径的上层路径 执行
flutter create -t module flutter_module
创建完成后会出现一个与原生项目平级的文件夹“flutter_module”
- 在原生项目的settings.gradle中引入flutter_module组件
setBinding(new Binding([gradle:this]))
evaluate(new File(
settingsDir.parentFile,
'flutter_module/.android/include_flutter.groovy'
//注释:如果创建的flutter模块和该app不在同一个目录下 需要适当调整路径结构
))
- flutter最低兼容sdk 16 ,app下的build.gradle:minSdkVersion 设置为16以上即可;
- 指定java编译版本 app目录gradle文件的android层级下配置java编译版本
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
- 添加项目依赖 implementation project(’:flutter’)
//注释:第一步添加的配置后 会在本项目中生成一个"flutter"组件
调用
原生调用flutter并传递初始化数据
原生代码
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn).setOnClickListener(v -> {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.fl_container, FlutterFragment.withNewEngine().initialRoute("{name:'devep',dataList:['aa','bb','cc']}")
.build());
ft.commit();
});
}
}
Flutter代码
import 'dart:ui';
import 'package:flutter/material.dart';
void main() => runApp(FlutterModule(initParams: window.defaultRouteName));
class FlutterModule extends StatelessWidget {
//接收native端传来的数据
final String initParams;
const FlutterModule({Key key, this.initParams}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page',initParams:initParams),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title,this.initParams}) : super(key: key);
final String title;
//直接使用即可
final String initParams;
@override
_MyHomePageState createState() => _MyHomePageState();
}
热载
项目运行原生app后修改flutter代码是无法直接体验flutter热更新的特性的,需要先关闭app,在flutter_module路径下(flutter项目的根路径)执行命令flutter attach ,再客户端开启app,热重载就可以使用了
注意:如果说连接电脑的设备不止1个的话会出现以下提示
Multiple devices found:
M2002J9E (mobile) • 7d4f21c4 • android-arm64 • Android 11 (API 30)
sdk gphone x86 arm (mobile) • emulator-5554 • android-x86 • Android 11 (API 30) (emulator)
[0]: M2002J9E (7d4f21c4)
[1]: sdk gphone x86 arm (emulator-5554)
请执行 flutter attach -d ‘emulator-5554’
'emulator-5554’为设备id
调试
- 关闭app
- 打开flutter端,点击Flutter Attach按钮(androidstudio运行按钮旁边 前提需要安装flutter和dart插件)
- flutter项目中打断点 在客户端开启app
希望我的文章可以节约你一些学习时间