Flutter进阶---dart 语法

763 阅读8分钟

前言

Flutter 跨平台解决方案,目前支持iOSAndroidWeb等平台,做到了一份代码多端运行,而且加上其自主的渲染引擎,虽说各方面有所欠缺,但是总体上体验还是很不错的。笔者是一个iOS开发者,其实在19年就开始断断续续接触了Flutter,可以说上手很快,门槛低,最让笔者喜欢上Flutter的是其热重载(神技啊),就如同前端一样,修改了代码能够立马看见效果(注意不是所有的都生效,例如一些配置文件等还是得重新编译的,主要是针对于UI布局)对比iOS重新编译这就很奈斯了,相信再使用过Flutter开发的同志们应该都或多或少了解了Flutter的一些优缺点,在这笔者也不多说,而此次写笔记也主要是为了重新认识一下Flutter,进阶一下(主要是现在公司(小公司,人手不够)也是在笔者的建议下采用Flutter实践了几个项目,运行在AndroidiOS上还是挺流畅的)在做这些项目的时候还是遇到很多坑的,业务事情也多,有很多不懂之处也是各种搜,没时间沉淀,最近闲下来,准备好好进阶一下,有啥说的不对的请指正啊,相互学习。

dart语法

我们知道Flutter使用的是dart语言开发,那么我们就从dart语法开始。

dart中的变量常量

  • 使用var声明一个变量,可以复制不同类型的值;如果没进行初始化复制,那么其是一个null
    • 我们可以将鼠标放在var声明的变量上,可以看出其是一个dynamic,也就是动态类型。
  • 使用final声明一个变量,则只可以赋值一次,否则会报错,也就可以理解为最终变量;
  • 使用const声明一个常量,注意常量在声明是必须赋值,且以后再也不能改变。

dart中的数据类型

  • 数值型numint,double继承自num类型;
  • 字符串型String,注意单引号,双引号,三单引号区别;
String a = 'a'; //单引号
String b = "b"
"bb"
"bbb"; //双引号
String c = '''c
''';//三引号

print('a=$a');// $ 表示取变量值
print('b=$b');
print('c=$c');

打印结果
flutter: a=a
flutter: b=bbbbbb
flutter: c=c

字符串常用操作:

  split('') //字符串分割split方法

  substring(a, b) //字符串截取substring方法 从第a位 b的长度

  codeUnitAt(a) //取当前索引a位置字符的UTF-16码

  startsWith('a') //当前字符串是否以指定字符a开头

  endsWith('a') //当前字符串是否以指定字符a结尾

  toUpperCase() //大写

  toLowerCase() //小写

  indexOf('a') //获取指定字符a的索引位置

  contains('a') //字符串是否包含指定字符a

  trim() //去除字符串的首尾空格

  a.length //获取字符串a长度

  replaceFirst('a', 'b') //替换第一次出现a字符位置的字符为b

  replaceAll('a', 'b') //全部替换a为b
  • bool型;
  • 集合List Set Map, 注意List里面可以存放不同的类型数据,Set只能存放不能重复的数据,Map存放键值对。

dart中的操作符

  • is 关键字来对类型进行检查;
  • as 关键字对类型进行强制转换;
  • 级联操作符是 .., 可以让你对一个对象中字段进行链式调用操作;
lhkhPerson
    ..name = 'lhkh'
    ..age = 18
    ..height = 180;
  • assert(断言)如果条件表达式结果不满足条件,则可以使用 assert 语句中断代码的执行。注意: 断言只在debug模式下运行有效,如果在release模式运行,则断言不会执行。

dart中的运算符

常见的算术、条件、逻辑、位、三目运算符就不介绍了,用法基本一样;

  • 空安全赋值运算 ??= 如果变量为nil就赋值,如果有值就直接返回。 声明变量a,但是没有赋值,所以anil,为nil时使用这个运算符就会给变量赋上等号后面的值,所以a = 10image.png

a = 5,所以直接返回 a = 5

image.png

  • 空安全赋值运算 ?? 如果左边有值就返回左边,没有就返回右边 b = 10,所以返回左边b的值; image.png

bnil,所以这边就返回右边a的值5
image.png

dart中的方法

dart中的方法

  • 可以作为一个对象,即可当着参数传递;

image.png

image.png

  • 返回值和参数的类型可以省略;
  • 方法的执行体中只有一句时可以使用箭头函数 =>表达式

image.png

  • 可选参数:
    1. 使用{}括起来,参数可以不带类型;
    2. 调用传参的时候必须带上形参的名字;如果使用的是[]括起来,那么此时是可以不带形参名的,赋值按照参数传递的顺序来赋值;
    3. 当调用时如果没有传值,方法里面必须对可选参数进行空值判断.
      image.png

注意在dart 2.12过后出现了空安全,如果给可选参数带上类型,那么需要给可选参数必须做空安全处理:可以通过?(注意dart版本),还可以直接加上初始值.

  • 匿名函数 顾名思义就是没有方法名的函数;经常用来类似于一个方法对象做函数回调;

image.png

  • 闭包 定义在函数里面的函数,闭包也是一个对象,可以访问外部函数的局部变量;

image.png

理论上理解,当一个方法执行完毕后,其内部的局部变量也会随之销毁,但是在dart里面可以发现,其并没有被销毁,会一直存在内存中并没有被释放;再次调用的话 ,由于是一个新的对象了,所以不一样。

dart的类和对象

上面讲的是dart的一些基本语法,那么下面一起来看看dart中的面向对象。

dart中的类使用class来声明,所有的类都继承自Object类;可以使用new 加构造函数创建一个对象。

image.png 注意当前示例中dart版本为2.10大版本,所以没有空安全的错误,在dart2.12版本中引入了空安全,直接这种定义属性是会报错的,可以通过在属性类型后面加上?来处理空值错误,也可以直接通过构造函数初始化属性。

  • 通过class来创建一个类LhkhPerson,然后定义属性,方法等;

    • dart中可以通过属性前面加上_来创建私有属性,这样的属性是外界无法使用的,注意这边的外界指的是跨文件,同文件中的类的属性是随意访问的;
    • dart会默认生成属性的gettersetter方法;
    • 注意声明方法时要注意dart中的方法名是找到方法的唯一标识,也就是方法不能重载,相同的方法名返回值,参数不同是不允许的;
  • 可以通过默认构造函数创建一个对象,对象可以通过.方法访问类里面的属性和方法;

  • 类的构造函数系统会默认创建一个,也可以自己创建一个,还可以通过命名构造函数定义的名字来创建构造函数,例如 LhkhPerson.init()其中init就是自定义的;

dart的工厂构造和单例对象与初始化列表

创建一个类FactoryClassimage.png 因为不是单例对象,所以每次构造都是一个新的对象,输出false image.png 通过构建单例对象,输出为true image.png

初始化列表,在构造函数后面加上 :assert() 可对类的属性进行检查判断,不符合判断条件则会报错,正确的就会执行初始化列表的函数体代码。 image.png

image.png

image.png

dart的继承

dart中的继承大致都差不多,通过关键词 extends 修饰;可以使用父类中的属性并赋值,可以调用父类的方法;

image.png 有些小细节需要注意:

  • 子类会默认调用父类的构造方法;
    • 如果父类中没有写构造方法,就调用默认的构造方法;
    • 如果父类中有带参数的,或者有命名构造方法,那子类必须主动调用;

image.png

image.png

image.png

  • 多肽

image.png

dart的抽象类和接口

dart中有抽象类,也有抽象方法,一个类通过abstract修饰时就是一个抽象类,里面的方法即为抽象方法,这个接类似于OC中的协议

image.png

使用extends只能实现一个抽象类里面的方法,也乐意通过implements修饰来使得子类能实现多个抽象方法,就类似于OC中的多个协议;一旦使用implements来修饰的话,那么子类中必须实现所有抽象类中的方法;

image.png

dartMixins

dart中存在混入,通过with修饰;这个就相当于多继承;注意不能混入带有构造函数的类,也不能是继承于其他类的类。

image.png

以上只是dart的一些基础的语法,并且也只做了简单的使用,后期会继续深入。