跨平台技术,不只仅是指的当前移动设备的平台,绝大部分电脑语言都是跨平台的,如 java, c/c++ 等等。而移动领域的跨平台,则面临了操做系统,设备版本,设备机型等各种问题。html
为了解决不一样操做系统终端开发一致性的问题,移动跨平台技术逐渐兴起,发展到今天,移动跨平台技术在某些应用场景下已经逐渐变成一种主流的开发方式。于此同时,各类跨平台技术框架更是满天飞。前端
从一开始的 web app,到后来的 PWA ,Hybrid。在到后来的 PhoneGap(Cordova 前身), 也有 web 技术结合 cordova 诞生的 ionic, Electron 框架等。html5
React-native,weex 彷佛已经很好了,可是在编译为不一样操做系统 UI 的过程当中,要耗费大量性能,不一样的语言通讯过程当中,又要耗费一部分性能。而且因为操做系统相同功能的 UI 组件在展现效果上可能不一样,开发者可能还须要花费不少精力去作UI的适配工做及性能优化工做。诸多缘由致使了开发一款高性能,优质体验的App可能须要花费大量的时间去打磨,因而自绘 UI 便诞生了。java
自绘 UI 经过在不一样平台间经过某种方式来渲染本身的 UI 组件,不去依赖原生的UI控件,从而保证了UI 体验的一致性。经过使用 GPU 等渲染引擎,来提升系统运行流畅度,Flutter 即是跨平台技术发展到今天使用自绘 UI 而开发出的一款高性能跨平台的 UI 框架。Flutter 借助其优秀的架构设计和前车可鉴,加持 google 大厂的光环和推广,到目前为止 github 的已获超过 85000 个star。react
Flutter 在系统架构上共分为三层:Framework层、Engine层、Embedder层,分别对应不一样的功能模块:android
Framework层:经过 Dart 语言实现,包含了对于安卓主推的 Material Design 和 iOS 系统主流的 Cupertino 风格。Framework 中包含了大量的模块如动画、手势等。Framework 用于支持平常应用开发过程当中的各类功能,咱们的开发也主要是针对 Framework 层进行的。ios
Engine层:该层由C/C++实现,主要包含了Flutter 通信机制、Dart 虚拟机、UI线程、GPU线程、渲染等。nginx
Embedder层:该层主要用于操做系统的相关处理,如本地插件、打包等。c++
经过运行 flutter --version 能够查看当前 flutter 版本号及相关版本信息:git
Facebook也于2015年4月开源了跨平台移动应用开发框架 React-native, RN 做为JS 框架 React 在移动平台的衍生物,也支持多平台快速开发。相比之下,RN 经过 JavaScriptCore 来做为 Javascript 的编译环境,经过 React 生成 Virtual DOM 并使用 JS Engine 来解析 React 语法。在 JS 和 原生代码之间,经过 JS bridges 来完成必要的通信。
Flutter 在不少设计思想上参考了 React 的设计理念, 列如
下面两段代码分别展现了一样的功能,在 Flutter 和 React-native 中实现:
//dart 代码
import 'package:flutter/material.dart';
import 'package:flutter_state/Redux/screens/redux_perview.dart';
class ReduxPage extends StatefulWidget {
@override
_ReduxPage createState() => _ReduxPage();
}
class _ReduxPage extends State<ReduxPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: Column(
children: <Widget>[
TestPage()
]
),
)
);
}
}
复制代码
// React 代码
import { SafeAreaView } from "react-native";
import { useNavigation } from "react-navigation-hooks";
import { ScrollView } from "react-native-gesture-handler";
export const HomePage: React.FC<Props> = ({ navigation }) => {
const navigate = useNavigation();
return (
<SafeAreaView>
<ScrollView>
<TestPage />
</ScrollView>
</SafeAreaView>
);
};
复制代码
能够看到,两段代码风格特别类似。
// dart
class _HomePage extends State<HomePage> {
bool showClear = false;
Widget clearWidget = GestureDetector(
onTap: () {
setState(() {
showClear = false;
});
},
child: Icon(Icons.clear, size: 20, color: Colors.grey),
);
@override
Widget build(BuildContext context) {
return Container(
child: showClear ?
clearWidget : Icon(Icons.mic, size: 20, color: Colors.grey),
);
}
复制代码
// react 代码
export class FormMessage extends React.Component {
constructor(props) {
super(props);
}
...
setTxt = txt => this.setState({ txt: txt });
}
复制代码
因为与 React 有着类似的设计思想,因此在 React 上使用的状态管理方案也能够用在 flutter 中,如Redux, Redux-thunk 等。
因为其基于 html5,在默认开发模式下,能够直接在浏览器 中进行开发,这对咱们调试和修改应用带来了很大的方便。
在打包 app 时,框架会帮助咱们将项目压缩,并经过 cordova-plugin-ionic-webview 实现的 webview 加载咱们的 html5 应用。
因为Ionic 本质仍是 html5 技术,在部署相对灵活不少,能够直接将其部署在 nginx 或者 tomcat 等应用服务器上进行使用,也能够将其嵌套在公众号中使用。
Flutter 由 google 推广及维护,抱大腿总没错。
Flutter 做为新起 UI 框架,在编程语言上 dart 做为其开发语言,对于 flutter 的上手首先须要学习 dart 语言。
Flutter 目前的社区还相对年轻,很多坑尚未填平,目前其官方的 issues 已经突破 8000+
Flutter 对声明式 UI 作到了最大程度的细粒化。全部的元素,如内外边距,均可以采用 widget 进行最大程度的定制化开发。所以,使用 flutter 编写 UI 界面须要先系统的学习 flutter 经常使用的布局 widget
Flutter 再做为绘制 UI 的开发框架,须要运行在android, ios 设备上进行开发。所以对业务逻辑的调试上没法像浏览器那般简单。
Flutter 采用 GPU 进行渲染,不少原生的功能没法与其配合使用,须要作额外处理。
Flutter 是目前跨平台框架中性能最好的。
现在跨平台技术逐渐成为一种主流,各类框架琳琅满目。可是不论如何跨平台,都是基于设备去作的。若是没有这些的平台,那么跨平台也就没有意义了。不一样的框架在不一样的场景中都有必定的优点,在实际开发中,能够结合项目的类型和需求,灵活选择不一样的框架来进行开发。