Flutter混编集成方式
基于已经安装Flutter环境(Dart:2.8.4 )
在现有项目集成Flutter
- 打开Android Studio,打开已有项目
-
查看Plugins列表Android APK Support 是否勾选,很多人没有勾选,导致无法创建Flutter Module
image.png -
选择Flie->New->New Module 然后跳转到选择框,选择Flutter Module
image.png - 等待创建完毕后,在settings.gradle 会显示依赖情况
setBinding(new Binding([gradle: this]))
evaluate(new File(
settingsDir,
'vv_module_flutter/.android/include_flutter.groovy'
))
到这里混编创建过程的第一步就完成了,接下来描述,如何在原生的项目里面使用我们刚才创建的Flutter项目
在现有项目依赖Flutter项目
- 在我们的主工程的build.gradle 添加如下代码:
dependencies {
implementation project(':flutter')
}
- 创建一个TestActivity继承FlutterActivity
class TestLoginActivity : FlutterActivity() {
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine);
}
override fun onFlutterSurfaceViewCreated(flutterSurfaceView: FlutterSurfaceView) {
super.onFlutterSurfaceViewCreated(flutterSurfaceView)
}
}
最后,大胆Run起来了,这篇文章很简单,其实只是想作为一个案例来描述一个过程。我们根据这个简单混编例子进而来描述几个案例。
1.现在大部分的项目都是基于组件化开发,那么Flutter是否可以跟原生的组件化一样,有相关的管理模式
2.原生组件,需要跳转不同的Flutter页面,需要怎么跳转
3.原生组件与Flutter、Flutter与原生的组件传值
4.这一点是笔记好玩的,我们在编译如上的代码,为啥就默认是运行了Dart里面的main方法呢?先贴一段代码,入口默认是"main",所以,根据这个,我们是否可以自定义入口?
public static class DartEntrypoint {
@NonNull
public static DartEntrypoint createDefault() {
return new DartEntrypoint(FlutterMain.findAppBundlePath(), "main");
}
/** The path within the AssetManager where the app will look for assets. */
@NonNull public final String pathToBundle;
/** The name of a Dart function to execute. */
@NonNull public final String dartEntrypointFunctionName;
public DartEntrypoint(
@NonNull String pathToBundle, @NonNull String dartEntrypointFunctionName) {
this.pathToBundle = pathToBundle;
this.dartEntrypointFunctionName = dartEntrypointFunctionName;
}
答案应该是ok的》》》》》我们可以修改Android代码如下
var engine = FlutterEngine(this)
//自定义入口
var entrypoint = DartExecutor.DartEntrypoint(FlutterMain.findAppBundlePath(), "noMain")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
engine.dartExecutor.executeDartEntrypoint(entrypoint)
}
相关的dart入口也可以把void main 改为void noMain
void main() => runApp(MyApp());
嗯~~~~很好~
网友评论