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

虽说 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 页面。
将 flutter 页面构建成 View,通过 addView 来显示 flutter 页面
将 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 源码相关分析
常见的一些原理性问题

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