写点什么

不得不看的 Flutter 与 Android 混合开发,android 蓝牙开发 rom

作者:嘟嘟侠客
  • 2021 年 11 月 28 日
  • 本文字数:2595 字

    阅读完需:约 9 分钟


虽说 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.8targetCompatibility 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.defaul


《Android 学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享


tRouteName,));


class MyApp extends StatelessWidget {final String initParams;


MyApp({Key key, @required this.initParams}) : super(key: key);


@overrideWidget 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++;});}


@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text(widget.title),),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[Text('initParams:_counter',style: Theme.of(context).textTheme.display1,

最后

最后为了帮助大家深刻理解 Android 相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的 24 套腾讯、字节跳动、阿里、百度 2019-2021BAT 面试真题解析,我把大厂面试中常被问到的技术点整理成了视频和 PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。


还有 高级架构技术进阶脑图 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。


Android 基础知识点


Java 基础知识点


Android 源码相关分析


常见的一些原理性问题



希望大家在今年一切顺利,进到自己想进的公司,共勉!


本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

用户头像

嘟嘟侠客

关注

还未添加个人签名 2021.03.19 加入

还未添加个人简介

评论

发布
暂无评论
不得不看的Flutter与Android混合开发,android蓝牙开发rom