Flutter学习 dart语言特性

一、编译模式
JIT编译模式(JIT In Time,即时编译)
JIT在运行时即时编译,在开发周期中使用,可以动态下发和执行代码,开发测试效率高,但运行速度和执行性能则会因为运行时即时编译受到影响。
AOT(Ahead of Time,运行前编译)
AOT即提前编译,可以生成被直接执行的二进制代码,运行速度快、执行性能表现好,但每次执行前都需要提前编译,开发测试效率低。
在开发期间可以使用JTI编译,可以缩短产品的开发周期。Flutter最受欢迎的功能之一热重载,正是基于此特性。而在发布期使用AOT,就不需要React Native那样在跨平台 JavaScript代码和原生代码之间建立低效的方法调用映射关系。所以,Dart具有开发测试效率高,运行速度快、执行性能好的特点。
二、内存分配与垃圾回收
并发是通过Isolate实现的。Isolate是类似于线程,但是不会共享内存,独立运行的worker。这样的机制,就可以让Dart实现无锁的快速分配。
Dart的垃圾回收机制则是采用了多生代算法。新生代在回收内存时采用半空间机制,触发垃圾回收时,Dart会将当前半空间中的活跃对象拷贝到备用空间,然后整体释放当前空间的所有内存。回收过程中,Dart只需要操作少量的活跃对象,没有引用大量死亡的对象则会被忽略,这样的回收机制很适合Flutter框架中大量的Widget销毁重建的场景。
三、Dart中一切都是对象
int bool null等,以及函数都是对象
四、关键字 late延迟加载
延迟加载初始化变量
例如:late String str
类实例化时某些值不初始化,无法通过静态检查,通过late就可以了,不会带来运行时风险
late String str1 = getString();
如果str1没有被使用,getString()方法不会被调用,str1就不会被初始化。
五、Dart变量
var dynamic Object
var定义时初始化了的变量,编译器会被推断类型,在赋值的那一刻决定了它的类型。
dynamic和Object都是动态的任意类型。不过dynamic编译阶段不检查类型,而Object编译阶段检查类型。
六、Dart内置类型
6.1 num 包含 int double 数据类型 int是自动伸缩的可长整型也可短整型
6.2 final以及const
final 定义的变量是运行时赋值,const定义的是编译时常量。
用final或者const修饰的变量,不能再次赋值。
final 可以先定义后初始化,const必须在定义的时候初始化。
final 不可修饰常量,const可以。
final修饰的top-level变量,必须在定义时初始化,修饰类中的成员变量,需要在构造函数体开始前初始化(可以在定义时初始化或者构造函数参数初始化 或者构造函数的初始化列表中初始化):const修饰类中的成员变量,需要加上static修饰词。
实例变量可以用final修饰,但不能用const修饰。
6.3 String
单双引号的作用是一样的
字符串格式化用${}
r前缀 简化转义字符 ‘C:\Users\Administrator’ 通过r前缀可简化为:r’C:\Users\Administrator’
多行显示 三个单双引号都可以,并且可以换行
‘’’
hhh
hhh
hhh
‘’’
bool就是boolean
6.4 list数组
List list = [];初始化//List list = new List();已经弃用了
List数组的使用
List list = [1,2,3];
int i = list[0];
for(int i in list){}遍历整个数组
6.5Map集合
Map<Int,Int> map ={1:1,2:2,3:3};
map[1] = 100;//给key为1的value更改为100
map[4] = 4;//新增一条数据
print(map[5]);//null因为没有定义以5为key的数组
print(map.keys);//打印所有的key值
print(map);//打印数组key value值
七、操作符
7.1 类型判断操作符
类型转换 as
类型判断 is !is
str is String str !is String
7.2赋值操作符
??= 如果变量没有值才进行赋值,一般用于设置默认值。
7.3条件表达式
三目表达式 condition ? expr1 : expr2
expr1??expr2 如果expr1是非空的,则返回其值;否则,计算并返回expr2的值。
7.4级联操作符

class Person {
  var name;
  var age;
  Person(this.name, this.age);
  getInfo() {
    print("${this.name},${this.age}");
  }
}

main() {
  var p = new Person('张三', 20);
  p.getInfo();
  //..为级联操作,可以同时赋值执行方法
  p
    ..name = "李四"
    ..age = 30
    ..getInfo();
}


7.5 安全操作符
person?.name 相当于非空判断
7.6 判断操作符
“==”比较两个值的hashCode是否相等
7.7 重写操作符
operator 重写操作符,例如函数重写等。可以看num类的重写操作符。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值