一、新建 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.png image.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

更多相关文章

  1. Android处理9.png文件流程
  2. fullScreen时的软键盘监听(非重写Layout方式)
  3. android和vue交互之js调取原生安卓扫码库
  4. Android(安卓)Activity四种加载方式
  5. Android设定屏幕只竖屏或只横屏的两种方式
  6. 用ndk-build 工具手动生成编译android原生程序
  7. android工程导出成为jar包。
  8. Android横屏预竖屏
  9. Android中ExpandableListView控件基本使用

随机推荐

  1. Android Bad notification for startFore
  2. Android中执行adb命令
  3. 获取android 刚发出去的短信
  4. Android Support Multidex原理分析
  5. How to compile Android(安卓)2.3 on Ubu
  6. Android获取通讯录联系人,右侧字母滑动索
  7. Android 发送通知 notification
  8. android 调用系统照相机拍照后保存到系统
  9. Android / iOS 招聘
  10. Linux Mint下Kindle Fire调试android程序