Flutter作为Google的一个跨平台解决方案,已经推出有段时间了。如果用Flutter独立开发一个项目,可能会由于生态还不够成熟,很多功能还不太好实现。但如果用Flutter开发项目中的一个模块,还是可以大大提高效率的,毕竟只写一套代码,就可以在Android和ios两个平台上运行,可以很好的节约时间成本。本文主要讲在Android项目中快速集成Flutter模块。
集成Flutter模块
首先,在settings.gradle中添加以下代码
setBinding(new Binding([gradle: this]))
evaluate(new File(
settingsDir.parentFile.parentFile,
'flutter_demo/.android/flutter_demo.groovy'
))
其中,settingsDir表示settings.gradle所在的目录,也就是Android项目所在的目录,settingsDir.parentFile.parentFile表示settings.gradle所在目录的父目录的父目录,由于我们flutter_demo模块目录与settings.gradle所在目录的父目录的父目录同级,这里指示了flutter_demo所在的根目录。我们最终要定位于flutter_demo.groovy文件,该文件位于flutter_demo下的.android目录下。
然后在build.gradle文件中添加以下代码
dependencies {
//flutter
implementation project(':flutter')
}
简单两步就可以将flutter子模块集成到我们的Android主工程中了。
调用Flutter模块
在Android主项目中,添加以下代码:
FlutterView flutterView = Flutter.createView(this, getLifecycle(), "flutter_page");
ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
);
addContentView(flutterView, params);
在Android中调起Flutter模块有两种方式,一种是创建FlutterView,如上面代码所示;另一种是创建FlutterFragment,通过研究源码发现,这种方式最终还是创建了FlutterView。新创建的FlutterView可以理解为一个独立的小窗口,嵌入到Android项目的某一个页面中,可以类比于一个WebView页面,可以铺满Android中的某个页面,也可以位于某个页面中的一小块。
接下来看看Flutter中的代码:
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Main',
home: FlutterMainPage(),
routes: {
"flutter_page":(context) => FlutterPage(),
"flutter_page2":(context) => FlutterPage2(),
},
);
}
}
Andorid主项目的某个页面到Flutter中的某个页面的跳转是通过路由来实现的。如上面代码所示,Android代码中定义了路由“flutter_page”,在Flutter的main.dart中,如果没有定义routes列表,会直接启动home页面,也就是示例中的FlutterMainPage()页面。而如果定义了routes路由列表,则会对Android中定义的路由名称“flutter_page”进行匹配,这里我们匹配到FlutterPage(),所以上图示例代码最终会跳转到Flutter模块中的FlutterPage()页面。