flutter的邂逅之旅

作者简介

目前就职于甜橙金融,负责公司的前端开发工作。Flutter作为一款跨平台的移动APP开发框架,受到的关注也是越来越高。于是为追赶潮流,利用自己业余时间学习了一波,但还有很多需要学习的地方。下面记录下初识flutter的一些知识点。方便自己以后学习查阅,也希望有志同道合的人可以一起学习,一起进步,一起交流~~~

Flutter介绍

    Flutter 是谷歌基于 Dart 语言开发的一款跨平台的移动 App 开发框架,可以让我们快速的在 Android 和iOS 上构建高质量 App。它最大的特点就是跨平台、以及高性能。

先展示一下初期写的几个小demo,给你们看看~~

为啥选择Dart呢?

据称Dart语言可以编译成原生代码,直接跟原生通信。

1. 灵活性

基于 Flutter 框架使用 Dart 编写的移动应用都是原生的跨平台应用,因此可以同时支持 Android 和 iOS。甚至可以是Web 应用,然后这些应用就可以在任意浏览器上运行了。

2. 易上手

Dart是强类型语言,并支持类型推断:类型推断是指在编程语言中自动检测表达式的数据类型

3. 足够的生产力

Dart 集成了大量的库和框架;你想实现一项功能的时候不需要重新发明轮子,节省了大量时间;你只要按文档说明扔进去一些代码就足够了,从而显著提高生产力。

4.  稳健的语言

Dart 由谷歌开发,其主要目的是创造像 C#和 Java 之类基于 C 语言的面向对象编程语言。它是一种相对简单、现代化且高效的语言。它像 C 一样也是编译语言,所以它比 Java 快得多。Dart 比 Javascript 也快了大约 1 倍。它是类型安全语言,并可使用 AOT(静态编译) 和 JIT(动态编译) 编译器编译

Flutter框架设计

Flutter框架是由Dart语言实现的,提供了 Material、Cupertino 风格的小部件,框架的底层是flutter引擎,它负责绘图,动画,网络,Dart运行时等功能。从上到下包含三个不同的层:框架、引擎和嵌入器。

框架设计图


Framework层

Material,Cupertino:针对 Android 的 Material 风格,和针对 iOS 的 Cupertino 风格;

Widgets: 按钮、文本、输入框、图片等组件;

Rendering:渲染层,负责布局、绘制、合成等;

Animation, Painting, Gestures:动画、绘图、手势;

Foundation:最底层,提供上层需要使用的工具类和方法;

Engine由C++实现,包含以下三项

Skia:图形绘制; 渲染引擎依靠跨平台的Skia图形库来实现

Dart:主要包括Dart运行时和垃圾回收

Text:文本渲染库

嵌入器将Flutter嵌入到各种平台中

Flutter部件生命周期&状态控制

Flutter 框架的 UI 是基于 Widget 的,一切皆 Widget,这些widget都有自己的生命周期。

大致可以看成三个阶段

1. 初始化(插入渲染树)

2. 状态改变(在渲染树中存在)

3. 销毁(从渲染树中移除)


Flutter如何渲染界面的

移动设备中有GPU和CPU,一般是GPU控制将数据渲染到显示设备上的,GPU主要是通过发出VSync同步信号去帧数据来传递给显示器。

1. GPU将信号同步到UI线程

2. UI线程用Dart来构建RenderTree

3. RenderTree在GPU线程进行合并

4. 合成后的试图数据提供给Skia引擎

5. Skia引擎将显示数据提供给GPU

Flutter Widgets

有些widget是有状态的,有些事无状态的。如果用户与widget发生交互,widget发生变化,那么这个widget就是有状态的。

无状态Stateless widget 不会发生变化。IconIconButton和 Text 都是无状态widget,它们都是StatelessWidget的子类。

有状态Stateful widget 是动态的。例如,可以通过与用户的交互或是随着数据的改变而导致外观形态的变化。 CheckboxRadioSliderInkWellFormTextField都是有状态 widget,它们都是StatefulWidget的子类。当 widget 状态改变时, State对象调用 setState(), 告诉框架去重绘 widget。

Flutter应用怎么编写

Flutter从 lib/main.dart文件的 main 函数开始:

Flutter 布局的核心机制是widgets。在 Flutter 中,几乎所有东西都是widget,且Widget前面的new可省略。

布局Widget

Flutter自带了一套强大的基础widgets;

Container widget 可以用来创建一个可见的矩形元素。 类似于html中的div, Container可以使用BoxDecoration来进行装饰,如背景,边框,或阴影等;

Row,Column这两个 flex widgets 可以让你在水平 (Row) 和垂直(Column) 方向创建灵活的布局。它是基于 web 的flexbox 布局模型设计的。

Stack widget 不是线性(水平或垂直)定位的,而是按照绘制顺序将 widget 堆叠在一起。可以用 Positioned widget 作为Stack 的子 widget,以相对于 Stack 的上,右,下,左来定位它们。 Stack 是基于 Web 中的绝对位置布局模型设计的。

路由和导航

路由对象会放在堆(stack)中

1、普通路由跳转:Navigator.push()

2、命名路由跳转:Navigator.pushNamed()

如果我们需要在应用的很多地方导航到同一界面,这样做就会导致代码重复。在这种情况下,定义命名路由(named route)并使用它进行导航就会非常方便。通过 MaterialApp额外的属性:initialRoute 和 routes 自身,来定义我们的路由。

MaterialApp(     //定义命名路由

            initialRouter : '/', //初始化路由,不用设置home属性

                     routes: {

                            '/': (context)=> Home( ),

                            /about': (context)=> Page(title : 'about')

                     }

)

跳转:

Navigator.pushNamed(context, '/about')

路由返回:Navigator.pop(context)

路由传参

回传参数到上一个页面

Navigator.pop() 方法可以接受第二个参数 result,它是可选的,如果传递了 result,数据将会通过 Future 方法的返回值传递。

Navigator.pop(context, 'Yep!');

状态管理Provider

当我们想在多个页面(组件/Widget)之间共享状态(数据),或者一个页面(组件/Widget)中的多个子组件之间共享状态(数据),这个时候我们就可以用 Flutter 中的状态管理来管理统一的状态(数据),实现不同组件直接的传值和数据共享。

现在Flutter 的状态管理方案很多,redux、bloc、state、provide、provider。

目前我们推荐使用 provider,这个是官方提供的状态管理解决方案。相比其他状态管理库使用起来比较方便。

用法:

1、配置依赖provider

2、新建一个文件夹叫 provider,在provider 文件夹里面放我们对于的状态管理类

3、 在 provider 里面新建Counter.dart

4、main.dart中

5、 获取并设置

从我目前接触到的flutter来说,最大的困难是找不到合适的widget去实现相应的布局及相应widget中的属性及样式,比如说Padding是一个Widget而不是CSS样式。所以还是要多实践。

好啦,今天的分享就到这里,欢迎大佬们私信批评指正。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343