不得不看的Flutter与Android混合开发

记得在flutter刚出来时,笔者就开始学习flutter。但由于当时嫌弃flutter复杂的层级组合且未推出稳定版,所以当时就放弃了深入学习,现如今随着flutter的蓬勃发展及大佬们的力推,就又入坑flutter。

虽说flutter能够跨平台,但由于现在几乎都是现成的项目,所以不可能用flutter来重头开发,所以目前几乎都是采用native+flutter的混合开发方案。那么该方案该如何实现尼?
1、flutter模块的导入
首先,切换到native项目的根目录的上一级目录。以笔者项目为例,路径为D:\FlutterHybrid\FlutterHybridAndroid,然后通过命令cd ../切换到上一级目录。再执行下面命令来创建一个flutter模块。

    flutter create -t module flutter_module

上面的flutter_module就是我们创建的flutter模块名称。

当flutter模块创建成功后,我们就需要通过以下步骤来导入该模块。

1.首先在在settings.gradle文件中添加如下代码。

    setBinding(new Binding([gradle:this]))
    evaluate(new File(
            settingsDir.parentFile,‘flutter_module/.android/include_flutter.groovy‘
    ))

添加完成后,就能够在Android Studio中看到flutter模块,如下图。

2.其次,在能够正确显示flutter模块后,我们就需要通过implementation project(‘:flutter‘)来导入该模块。添加成功后就开始编译项目,这时候就可能会遇到如下错误。

这就是我们需要注意的一点,native项目的minSdkVersion不能小于Flutter模块的minSdkVersion。解决方案就是把native项目的minSdkVersion的值修改为大于flutter模块的minSdkVersion的值。
经过上面两步后,native项目就成功导入了flutter模块,这时候就可以来运行native项目。但在运行native项目时却又可能出现如下错误。

该问题该怎么解决尼?其实在上图的最下面已经给出解决方案了,就是native项目必须使用Java 8,否则不让运行。所以我们需要在app目录下的build.gradle文件中添加如下代码。

    android {
        compileOptions {
            sourceCompatibility 1.8
            targetCompatibility 1.8
        }
    }

然后继续运行native项目,这时候就能够在设备上跑起来了,但如何验证flutter模块是否打包进apk里尼?这时候就可以借助Android Studio的apk分析工具。通过该工具可以发现apk包由以下内容组成。

其中flutter_assets存放的就是flutter代码,到这里native项目就成功的导入了flutter模块。

注意:如在果项目中使用AndroidX,就会导致很严重的兼容性问题。所以如果项目中使用了AndroidX,则要慎重导入flutter模块。如果一定要导入,则可以去阅读flutter官方提供的解决方案——AndroidX compatibility。

2、native项目加载flutter页面
经过前面的一些操作,我们就在Native项目中成功依赖了flutter模块,那么下面学习如何在Native项目中加载flutter页面。通过查看flutter模块代码可以发现,该模块提供了以下两种方式来加载flutter页面。

1.将flutter页面构建成View,通过addView来显示flutter页面
2.将flutter页面构建成Fragment,通过对fragment的操作来显示flutter页面

2.1、将flutter页面构建成View
在flutter模块的Flutter类中给我们提供了一个方法——createView。通过该方法,我们可以将flutter页面构建成一个View。而View的相关操作想必对于Android开发者来说都不陌生,所以就通过addView将flutter页面添加到相应的地方。实现代码如下:

    public void onLoadFlutter(View view) {
        View flutterView = Flutter.createView(this, getLifecycle(), "route1");
        FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(600, 600);
        layoutParams.topMargin = 100;
        addContentView(flutterView, layoutParams);
    }

2.2、将flutter页面构建成fragment
同样,flutter模块也提供了方法——createFragment,通过该方法就将flutter页面构建成一个fragment,然后根据fragment的操作将flutter页面添加到相应的地方。实现代码如下:

    public void onLoadFlutter(View view) {
       FragmentTransaction transaction= getSupportFragmentManager().beginTransaction();
       transaction.replace(R.id.someContainer,Flutter.createFragment("这里是flutter页面"));
       transaction.commit();
    }

2.3、flutter页面
在前面讲述了如何在native项目中加载flutter页面,下面就来看一下flutter页面的代码。代码还使很简单的,基本的都是创建module时自动生成的代码。

import ‘package:flutter/material.dart‘;
import ‘dart:ui‘;

void main() => runApp(MyApp(
      initParams: window.defaultRouteName,
    ));

class MyApp extends StatelessWidget {
  final String initParams;

  MyApp({Key key, @required 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 {
  final String initParams;

  MyHomePage({Key key, this.title, this.initParams}) : super(key: key);
  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState(initParams);
}

class _MyHomePageState extends State<MyHomePage> {
  final String initParams;

  _MyHomePageState(this.initParams);

  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              ‘initParams:$initParams‘,
              style: TextStyle(color: Colors.red),
            ),
            Text(
              ‘$_counter‘,
              style: Theme.of(context).textTheme.display1,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: ‘Increment‘,
        child: Icon(Icons.add),
      ),
    );
  }
}

可以发现,在上面代码中,我们传入了一个初始化属性,它其实就是一个路由名称,但其实我们也传入一个json或者其他类型的数据,从而来做一些其他操作。其实这样就可以看做native与flutter之间的一种通信。
3、flutter模块的调试
3.1、flutter模块的热重载
flutter的优势之一就是在开发过程中能够通过热重载功能来实现快速的调试,但通过运行上面代码就会发现,flutter模块代码修改后无法立即生效,需要重新打包Native才能生效。这样就让flutter的一个重大优势失效了,降低了调试效率。那么我们能不能在混合项目中做到flutter模块的热重载尼?其实也是可以的,但需要经过一些步骤。
1.首先,关闭当前应用,注意:是要杀死当前应用所在进程,而不是退出应用。

2.其次,在flutter模块中输入命令flutter attach,就会显示以下内容

3.最后,再次打开应用,就会出现如下内容。
请注意图中的这段话

原文地址:https://blog.51cto.com/14295695/2410072

时间: 2024-07-30 22:12:17

不得不看的Flutter与Android混合开发的相关文章

一看就懂的Android APP开发入门教程

一看就懂的Android APP开发入门教程 作者: 字体:[增加 减小] 类型:转载 这篇文章主要介绍了Android APP开发入门教程,从SDK下载.开发环境搭建.代码编写.APP打包等步骤一一讲解,非常简明的一个Android APP开发入门教程,需要的朋友可以参考下 工作中有做过手机App项目,前端和android或ios程序员配合完成整个项目的开发,开发过程中与ios程序配合基本没什么问题,而android各种机子和rom的问题很多,这也让我产生了学习android和ios程序开发的

Android混合开发,html5自己主动更新爬过的坑

如今使用混合开发的公司越来越多,尽管出现了一些新技术,比方Facebook的react native.阿里的weex,但依旧阻挡不了一些公司採用h5的决心.当然,这也是从多方面考虑的选择. 在三年前就使用过html5混合开发,当时做的是一款贵金属软件,涨跌五线谱.乾坤交易,还有各个股市的信息,那时候还是上波牛市爆发的前夕,哎... 近期公司让用h5混合开发.一些页面和功能有h5分担,最初时候放在本地assets目录下,后来因为前端同事频繁改动和更新.再加上数据安全方面考虑,决定把包放在serve

android混合开发,webview的java与js互操作

android原生应用,用webview加载应用中的网页,并且java代码与js代码可以互相操作. 这是混合开发的基石,最基本也最重要的东西,实验代码在这里. 概括说说—— java调js:调用webView.load("javascript:someFunction()"); 这样可以调用webView里页面上的全局方法.这不是什么新鲜东西,你在网页中也可以这么做,试试在浏览器地址栏输入javascript:alert("427studio");也可以在浏览器地址

Android 混合开发,html5 自动更新爬过的坑

现在使用混合开发的公司越来越多,虽然出现了一些新技术,比如Facebook的react native.阿里的weex,但依然阻挡不了一些公司采用h5的决心,当然,这也是从多方面考虑的选择. 在三年前就使用过html5混合开发,当时做的是一款贵金属软件,涨跌五线谱.乾坤交易,还有各个股市的信息,那时候还是上波牛市爆发的前夕,哎... 最近公司让用h5混合开发,一些页面和功能有h5分担,最初时候放在本地assets文件夹下,后来由于前端同事频繁修改和更新,再加上数据安全方面考虑,决定把包放在服务器,

Android 混合开发 的一些心得。

其实所谓这个混合开发,也就是hybird,就是一些简单的,html5和native 代码之间的交互.很多电商之类的app里面都有类似的功能, 这种东西其实还是蛮重要的,主要就是你有什么功能都可以进行热部署,不需要再重新发版本.下面就简单介绍一下这种技术. 我们首先看下面一个场景,我们打开网易云音乐的app 里面的积分商城,(此时实际上是一个webview去加载了一个html界面.) 然后在显示出来的界面里面点击一下我的订单,因为我们没有登录过,所以此时自动给我弹出了native的登录界面.你看这

Flutter + Android 混合开发

JIT (Just In Time) 即时编译器, 边执行边编译 程序运行时,JIT 编译器选择将最频繁执行的方法编译成本地代码.运行时才进行本地代码编译而不是在程序运行前进行编译 AOT可以理解为“全时段的编译”(All-Of-the-Time compilation).即在安装的时候,就把所有的运行代码都编译到本地,这样在运行时就可以直接执行机器代码 Android N引入了一种包含编译.解释和JIT(Just In Time)的混合运行时,以便在安装时间.内存占用.电池消耗和性能之间获得最

8-4 Flutter Android混合开发实战-调试与发布

在flutter的目录下运行命令 第二步,运行原生,点击按钮后,控制台的输出. 同步代码到安卓设备上已经完成.热加载小r 热重启的是大R.请求帮助按h .退出按q 这个时候原生的效果就出来了 原生这里就看到了效果 调试Dart代码 原生运行的app打开.点击加载flutter模块. 加载完成后就出现了调试面板 也可以加断点调试 点击按钮会触发代码 点击后 就在断点这里暂停了. 只要让原生项目和flutter项目监理debug的链接.调试和原有flutter的调试是一样的 发布应用 首先是签名,

Android开发不得不看的11个实战小项目

是不是想学Android开发(http://www.maiziedu.com/course/android-px/)却不知道如何下手?懂得一点点入门基础知识却无法应用到实际开发中?看相关资料觉得都懂了实际动手却发现什么都不懂?本地搭建Android开发环境太麻烦? 如果你有以上的各种问题,那么今天小编推荐的Android开发的这11个小项目,你一定要看!! 因为,这些实战项目都是基于google 官方的API Demos制作而成,而且全部配有Android在线开发环境,你可以随时动手跟着课程操作

Flutter基础系列之混合开发(二)

1.混合开发的场景 1.1作为独立页面加入 这是以页面级作为独立的模块加入,而不是页面的某个元素. 原生页面可以打开Flutter页面 Flutter页面可以打开原生页面 1.2作为页面的一部分嵌入 比如说原生页面中只有某一个item是Flutter: Flutter页面中只有某一部分是原生视图 2.Flutter混合开发的集成步骤 2.1创建Flutter Module 在做混合开发之前,我们首先需要创建一个Flutter Module. 这里建议Flutter Module的创建目录和原生工