初识flutter
关注flutter已经好久,因为没有发正式版,所以一直也不想过早的躺浑水,但是最近无意中看到几篇文章,再加上美团和咸鱼等app也一直在做灰度测试,所以上周开始看了一下官方文档,地址:https://flutter.io/docs/get-started/install,然后在此做一下总结。
flutter是Google开发的一套全新的跨平台开源框架。目前flutter已经发布很多很多版本,正在逐步的完善,它的目标其实是和react native一样的,就是同一份代码可以同时运行在Android和iOS两个系统上。如果你同时有react native和flutter开发经验,你就会发现flutter的很多设计理念和react native是一样的,react native基于组件开发页面,flutter则是widget,他们都有自己的生命周期,他们都是自己的属性或者状态,所以对于react native开发者来说,flutter开发只不过换了一种Dart语言,换了一批API,当然这些都是表面的理解。因为react native和flutter有本质的不同,react native渲染的是系统原生控件,flutter则是从头到尾重写了一套UI框架,渲染引擎则依靠Skia图形库实现。下面就具体说一下H5、react native、flutter这些跨平台UI框架的方案。
H5、react native、flutter
最开始的跨平台开发的方案就是H5开发,然后基于Android和iOS的webView完全继承web开发的所有成果,但是由于webview的渲染效率和js的执行性能问题,很难与原生相提并论。然后就到了react native、weex的时代,为了解决webview性能差的问题,这类框架将最终的渲染工作交还给了系统,抛开react native和weex自身对系统版本的bug,性能问题依然没有完美的解决,比如加载react native生成的bundle.js的size过大、bundle.js的加载时间过长导致白屏、页面内手势滑动导致大量的丢帧问题等等,所以我们在适用reactnative时还是需要大量的优化和维护。这个时候flutter借鉴react native孕育而生,为什么是借鉴呢,上面也有提到,其实react native在开发时有很多思想都是相同的。
flutter所使用的语言是Dart,这种语言既支持动态编译又支持静态编译,这也就意味着在JIT模式下我们可以实现热刷新,就像开发js一样,编辑完代码之后,只要保存或者点击 Hot Reload按钮,就可以立即更新到设备上,不用重新编译app。在Flutter中,所有功能都可以通过组合多个Widget来实现,包括对齐方式、按行排列、按列排列、网格排列甚至事件处理等等。Flutter控件主要分为两大类,StatelessWidget和StatefulWidget,StatelessWidget用来展示静态的文本或者图片,如果控件需要根据外部数据或者用户操作来改变的话,就需要使用StatefulWidget。State的概念也是来源于Facebook的流行Web框架React,React风格的框架中使用控件树和各自的状态来构建界面,当某个控件的状态发生变化时由框架负责对比前后状态差异并且采取最小代价来更新渲染结果。
flutter应用
flutter的安装很简单,我们只需要一个flutter的sdk就可以,这里类似于Android里的sdk,开发flutter的编辑器也有很多选择,Android studio、intellij、VS code,这里我选择的是最轻量的vs code。关于这些配置环境我们可以参考官网,说的很清晰。
当我们用vs code生成一个项目后,项目目录如下:
其中lib文件夹下的main.dart文件就是我们要开发的dart文件,pubspec.yaml就是项目的配置文件,ios文件夹和android文件夹分别是iOS和Android两个项目工程
然后我们看一下dart文件:
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: MyHomePage(title: 'Flutter Demo Home Page'), ); } } class MyHomePage extends StatefulWidget { MyHomePage({Key key, this.title}) : super(key: key); final String title; @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { 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( 'You have pushed the button this many times:', ), Text( '$_counter', style: Theme.of(context).textTheme.display1, ), ], ), ), floatingActionButton: FloatingActionButton( onPressed: _incrementCounter, tooltip: 'Increment', child: Icon(Icons.add), ), // This trailing comma makes auto-formatting nicer for build methods. ); } }
可以看到两个类MyApp和MyHomePage,从名字我们就可以看出,一个是App的入口,一个是首页,前者继承StatelessWidget,后者继承StatefulWidget,说明MyApp是不需要状态的,而MyHomePage是需要的,所以它实现了createState方法来生成一个State(不管是StatelessWidget还是StatefulWidget,本身都是不可变的),_MyHomePageState继承了State<MyHomePage>,重写了build方法,返回Scaffold,其实Scaffold中的代码就是展示在页面中的内容。
最后附上flutter的架构图:
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
在Ignite中使用k-最近邻(k-NN)分类算法
在本系列前面的文章中,简单介绍了一下Ignite的线性回归算法,下面会尝试另一个机器学习算法,即k-最近邻(k-NN)分类。该算法基于对象k个最近邻中最常见的类来对对象进行分类,可用于确定类成员的关系。 一个适合k-NN分类的数据集是鸢尾花数据集,它可以很容易地通过UCI网站获得。 鸢尾花数据集由150个样本组成,来自3种不同种类的鸢尾花各有50朵(Iris Setosa, Iris Versicolour和Iris Virginica)。以下四个特征可供每个样本使用: 萼片长度(cm) 萼片宽度(cm) 花瓣长度(cm) 花瓣宽度(cm) 下面会创建一个模型,利用这四个特征区分不同的物种。 首先,要获取原始数据并将其拆分成训练数据(60%)和测试数据(40%)。然后再次使用Scikit-learn来执行这个任务,下面修改一下前一篇文章中使用的代码,如下: from sklearn import datasets import pandas as pd # Load Iris dataset. iris_dataset = datasets.load_iris() x = iris_d...
- 下一篇
JAVA + LR实现apache流媒体的性能测试
最近的一个项目,视频点播系统,使用apache实现的流媒体服务器。其实准确的说叫做伪流(HTTP Pseudo-Streaming),基本原理和概念自行了解吧。 让我简单的描述就是仍然是HTTP下载,播放器播放本地缓存。只不过它也实现了一些和正规流媒体服务类似的功能。视频点播类系统的性能测试,说简单了主要就是模拟大量用户去看视频。服务端监控整体性能,客户端关注各自表现。这里难点主要在于如何模拟大量用户观看视频?如何判断各客户端展现? 多客户端的模拟无外乎3种方法: 1.全公司总动员,一起看。 2.一台机器开多个播放页面(或者是一个页面上嵌入多个播放器),调用多台机器。 3.抛弃客户端的解码播放过程,直接想法下载视频文件。 第一种方法不用说,虽然最真实,但太原始没有技术含量,如果是小公司人还不一定够。 第二种方法在需要测试的用户数不大时还可以,否则会占用较多资源,而且技术含量也较低。这种方式,一台机器上能模拟的用户数很有限,因为CPU会很快成为瓶颈。 第三种方法最高效,在千兆网环境下,一台机器可以模拟很多路用户,此时网络带宽是瓶颈(如果带宽更大,估计硬盘IO就是瓶颈了)。但是没有解码和播...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS8安装Docker,最新的服务器搭配容器使用
- MySQL8.0.19开启GTID主从同步CentOS8
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS7设置SWAP分区,小内存服务器的救世主