flutter学习那点事
Posted 技术从未如此性感
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flutter学习那点事相关的知识,希望对你有一定的参考价值。
Flutter Framework
这是一个纯 Dart实现的 SDK,它实现了一套基础库,自底向上,我们来简单介绍一下:
-
底下两层(Foundation和Animation、Painting、Gestures)在Google的一些视频中被合并为一个dart UI层,对应的是Flutter中的
dart:ui
包,它是Flutter引擎暴露的底层UI库,提供动画、手势及绘制能力。 -
Rendering层,这一层是一个抽象的布局层,它依赖于dart UI层,Rendering层会构建一个UI树,当UI树有变化时,会计算出有变化的部分,然后更新UI树,最终将UI树绘制到屏幕上,这个过程类似于React中的虚拟DOM。Rendering层可以说是Flutter UI框架最核心的部分,它除了确定每个UI元素的位置、大小之外还要进行坐标变换、绘制(调用底层dart:ui)。
-
Widgets层是Flutter提供的的一套基础组件库,在基础组件库之上,Flutter还提供了 Material 和Cupertino两种视觉风格的组件库。而我们Flutter开发的大多数场景,只是和这两层打交道。
Flutter Engine
这是一个纯 C++实现的 SDK,其中包括了 Skia引擎、Dart运行时、文字排版引擎等。在代码调用 dart:ui
库时,调用最终会走到Engine层,然后实现真正的绘制逻辑。
Dart
变量 var var一旦赋值其类型就确定了 再次赋值只能与第一次赋值类型一致
var i = 10;
// error
// i = "error";
dynamic和Object
Object
是Dart所有对象的根基类,也就是说所有类型都是Object
的子类(包括Function和Null),所以任何类型的数据都可以赋值给Object
声明的对象. dynamic
与var
一样都是关键词,声明的变量可以赋值任意对象。 而dynamic
与Object
相同之处在于,他们声明的变量可以在后期改变赋值类型。
dynamic
与Object
不同的是,dynamic
声明的对象编译器会提供所有可能的组合, 而Object
声明的对象只能使用Object的属性与方法, 否则编译器会报错。
final和const
如果您从未打算更改一个变量,那么使用 final
或 const
,不是var
,也不是一个类型。 一个 final
变量只能被设置一次,两者区别在于:const
变量是一个编译时常量,final
变量在第一次使用时被初始化。被final
或者const
修饰的变量,变量类型可以省略
函数
Dart函数声明如果没有显式声明返回值类型时会默认当做dynamic
处理,注意,函数返回值没有类型推断:
异步支持
Dart类库有非常多的返回Future
或者Stream
对象的函数。 这些函数被称为异步函数:它们只会在设置好一些耗时操作之后返回,比如像 IO操作。而不是等到这个操作完成。async
和await
关键词支持了异步编程
在Flutter中,Widget的功能是“描述一个UI元素的配置数据”,它就是说,Widget其实并不是表示最终绘制在设备屏幕上的显示元素,而它只是描述显示元素的一个配置数据。实际上,Flutter中真正代表屏幕上显示元素的类是Element
,也就是说Widget只是描述Element
的配置数据!
- Widget实际上就是
Element
的配置数据,Widget树实际上是一个配置树,而真正的UI渲染树是由Element
构成;不过,由于Element
是通过Widget生成的,所以它们之间有对应关系,在大多数场景,我们可以宽泛地认为Widget树就是指UI控件树或UI渲染树。 - 一个Widget对象可以对应多个
Element
对象。这很好理解,根据同一份配置(Widget),可以创建多个实例(Element)。
以上是关于flutter学习那点事的主要内容,如果未能解决你的问题,请参考以下文章