Android 项目中集成 Flutter
一、新建 Android 工程
正常新建一个 Android 项目即可。
二、新建 Flutter module
1、新建一个 Flutter Module
image.png
2、新建完成之后,这个 Flutter Module 也是可以正常运行的。
可以打开 Flutter Module 里面的 android 项目。也就是 .android 文件夹下。
image.png
里面也是分为了 Android 原生和 Flutter Module 两个部分。如果在原有项目集成 Flutter 的过程中遇到依赖冲突,比如 support 包里面 appcompat 版本冲突等,就需要在 Flutter Module 里面的 Android 工程里,找到 build.gradle 文件进行修改。
image.pngimage.png三、Android 项目集成 Flutter
Android 原生项目可以通过两种方式依赖 Flutter module。一种是通过 aar 的方式,一种是通过依赖源码的方式。
1、aar 方式集成
1、Android 原工程需要使用 java 8 编译
在 工程的 build.gradle 里面,android {} 下修改
android { //... compileOptions { sourceCompatibility 1.8 targetCompatibility 1.8 }}
2、生成 aar 文件
通过集成 arr 的方式需要先生成 Flutter Module 的 arr,Flutter 官网上是通过在 Flutter Module 的根目录下通过运行
flutter build aar
得到 aar 文件。但是我运行这个命令没有成功。
还有一种方式,是在 android 工程里面,也就是 .android 目录下,执行
gradlew assembleRelease
运行这个命令,也会生成 aar 文件。
image.png
上面那个 debug 版本的 aar 是运行 module 之后自动生成的,一般不建议使用这个。
3、使用 aar
主工程的 build.gradle repositories 闭包 里面加入
flatDir { dirs 'libs' // aar目录 }
需要注意的是,两处都要添加
buildscript { repositories { flatDir { dirs 'libs' // aar目录 } google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.4.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files }}allprojects { repositories { flatDir { dirs 'libs' // aar目录 } google() jcenter() }}
复制 aar 文件到 app/libs 里
image.png接着 app 的 build.gradle 里面添加依赖
implementation 'com.example.flutter_module:flutter-release:1.0@aar'
这里的包名替换为自己的。
4、java 代码里面加载 Flutter 页面
布局文件:
<?xml version="1.0" encoding="utf-8"?>
代码加载 Flutter
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FragmentTransaction tx = getSupportFragmentManager().beginTransaction(); tx.replace(R.id.flutter_container, Flutter.createFragment("route1")); tx.commit(); }}
运行项目,效果:
f.jpg
2、module 源码方式继承。
1、Android 原工程需要使用 java 8 编译
在 工程的 build.gradle 里面,android {} 下修改
android { //... compileOptions { sourceCompatibility 1.8 targetCompatibility 1.8 }}
2、修改 Android 工程里面的 setting.gradle 文件
// MyApp/settings.gradleinclude ':app' // assumed existing contentsetBinding(new Binding([gradle: this])) // newevaluate(new File( // new settingsDir.parentFile, // new 'my_flutter/.android/include_flutter.groovy' // new))
注意 这个路径不要写错了,都修改为自己的路径。上面的路径的意思是,setting.gradle 的父目录下的 有 flutter_module 。
3、android 工程依赖 Flutter module
修改 app 的 build.gradle
dependencies { implementation project(':flutter')}
4、实现 Android 项目跳转到 Flutter 页面。
这个就和集成 arr 的里面一样了。在 Java 里面有两种方式使用 Flutter Module 。一种就是上面那样使用 Fragment 的方式。还有一种是使用 View 的方式,代码如下:
View flutterView = Flutter.createView( MainActivity.this, getLifecycle(), "route1" ); FrameLayout.LayoutParams layout = new FrameLayout.LayoutParams(600, 800); layout.leftMargin = 100; layout.topMargin = 200; addContentView(flutterView, layout);
这里可以传递一个参数 "route1",这个参数可以当作路由的名字,Flutter 里根据这个名字返回指定的页面视图。
import 'dart:ui';import 'package:flutter/material.dart';void main() => runApp(_widgetForRoute(window.defaultRouteName));Widget _widgetForRoute(String route) { switch (route) { case 'route1': return SomeWidget(...); case 'route2': return SomeOtherWidget(...); default: return Center( child: Text('Unknown route: $route', textDirection: TextDirection.ltr), ); }}
这样就实现了 Android 原生跳转到 Flutter 页面。
参考:
https://github.com/flutter/flutter/wiki/Add-Flutter-to-existing-apps#make-the-host-app-depend-on-the-flutter-module
更多相关文章
- fullScreen时的软键盘监听(非重写Layout方式)
- Android设定屏幕只竖屏或只横屏的两种方式
- android工程导出成为jar包。
- Android cocos2d-x开发(三)之创建Android工程和编译
- Android 客户端发送邮件(JMail方式)
- Android Activity四种加载方式
- Android原生运行uniapp使用5+app创建项目时的SDK集成步骤(一)
- Android开源项目第二篇——工具库篇