前言
Flutter
跨平台解决方案,目前支持iOS
,Android
,Web
等平台,做到了一份代码多端运行,而且加上其自主的渲染引擎,虽说各方面有所欠缺,但是总体上体验还是很不错的。笔者是一个iOS开发者,其实在19年就开始断断续续接触了Flutter
,可以说上手很快,门槛低,最让笔者喜欢上Flutter
的是其热重载
(神技啊),就如同前端一样,修改了代码能够立马看见效果(注意不是所有的都生效,例如一些配置文件等还是得重新编译的,主要是针对于UI布局)对比iOS
重新编译这就很奈斯了,相信再使用过Flutter
开发的同志们应该都或多或少了解了Flutter
的一些优缺点,在这笔者也不多说,而此次写笔记也主要是为了重新认识一下Flutter
,进阶一下(主要是现在公司(小公司,人手不够)也是在笔者的建议下采用Flutter
实践了几个项目,运行在Android
和iOS
上还是挺流畅的)在做这些项目的时候还是遇到很多坑的,业务事情也多,有很多不懂之处也是各种搜,没时间沉淀,最近闲下来,准备好好进阶一下,有啥说的不对的请指正啊,相互学习。
dart
语法
我们知道Flutter
使用的是dart
语言开发,那么我们就从dart
语法开始。
dart
中的变量常量
- 使用
var
声明一个变量,可以复制不同类型的值;如果没进行初始化复制,那么其是一个null
;- 我们可以将鼠标放在
var
声明的变量上,可以看出其是一个dynamic
,也就是动态类型。
- 我们可以将鼠标放在
- 使用
final
声明一个变量,则只可以赋值一次,否则会报错,也就可以理解为最终变量; - 使用
const
声明一个常量,注意常量在声明是必须赋值,且以后再也不能改变。
dart
中的数据类型
- 数值型
num
:int
,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
,但是没有赋值,所以a
为nil
,为nil
时使用这个运算符就会给变量赋上等号后面的值,所以a = 10
;
a = 5
,所以直接返回 a = 5
。
- 空安全赋值运算
??
如果左边有值就返回左边,没有就返回右边b = 10
,所以返回左边b
的值;
b
为nil
,所以这边就返回右边a
的值5
。
dart
中的方法
dart
中的方法
- 可以作为一个对象,即可当着参数传递;
- 返回值和参数的类型可以省略;
- 方法的执行体中只有一句时可以使用箭头函数
=>
表达式
- 可选参数:
- 使用{}括起来,参数可以不带类型;
- 调用传参的时候必须带上形参的名字;如果使用的是[]括起来,那么此时是可以不带形参名的,赋值按照参数传递的顺序来赋值;
- 当调用时如果没有传值,方法里面必须对可选参数进行空值判断.
注意在dart 2.12
过后出现了空安全,如果给可选参数带上类型,那么需要给可选参数必须做空安全处理:可以通过?
(注意dart
版本),还可以直接加上初始值.
- 匿名函数 顾名思义就是没有方法名的函数;经常用来类似于一个方法对象做函数回调;
- 闭包 定义在函数里面的函数,闭包也是一个对象,可以访问外部函数的局部变量;
理论上理解,当一个方法执行完毕后,其内部的局部变量也会随之销毁,但是在dart里面可以发现,其并没有被销毁,会一直存在内存中并没有被释放;再次调用的话 ,由于是一个新的对象了,所以不一样。
dart
的类和对象
上面讲的是dart
的一些基本语法,那么下面一起来看看dart
中的面向对象。
dart
中的类使用class
来声明,所有的类都继承自Object
类;可以使用new
加构造函数创建一个对象。
注意当前示例中dart
版本为2.10大版本,所以没有空安全的错误,在dart
2.12版本中引入了空安全,直接这种定义属性是会报错的,可以通过在属性类型后面加上?
来处理空值错误,也可以直接通过构造函数初始化属性。
-
通过
class
来创建一个类LhkhPerson
,然后定义属性,方法等;dart
中可以通过属性前面加上_
来创建私有属性,这样的属性是外界无法使用的,注意这边的外界指的是跨文件,同文件中的类的属性是随意访问的;dart
会默认生成属性的getter
和setter
方法;- 注意声明方法时要注意
dart
中的方法名是找到方法的唯一标识,也就是方法不能重载,相同的方法名返回值,参数不同是不允许的;
-
可以通过默认构造函数创建一个对象,对象可以通过
.
方法访问类里面的属性和方法; -
类的构造函数系统会默认创建一个,也可以自己创建一个,还可以通过命名构造函数
定义的名字
来创建构造函数,例如LhkhPerson.init()
其中init
就是自定义的;
dart
的工厂构造和单例对象与初始化列表
创建一个类FactoryClass
,
因为不是单例对象,所以每次构造都是一个新的对象,输出false
通过构建单例对象,输出为true
初始化列表,在构造函数后面加上 :assert() 可对类的属性进行检查判断,不符合判断条件则会报错,正确的就会执行初始化列表的函数体代码。
dart
的继承
dart
中的继承大致都差不多,通过关键词 extends
修饰;可以使用父类中的属性并赋值,可以调用父类的方法;
有些小细节需要注意:
- 子类会默认调用父类的构造方法;
- 如果父类中没有写构造方法,就调用默认的构造方法;
- 如果父类中有带参数的,或者有命名构造方法,那子类必须主动调用;
- 多肽
dart
的抽象类和接口
dart
中有抽象类,也有抽象方法,一个类通过abstract
修饰时就是一个抽象类,里面的方法即为抽象方法,这个接类似于OC
中的协议
;
使用extends
只能实现一个抽象类里面的方法,也乐意通过implements
修饰来使得子类能实现多个抽象方法,就类似于OC
中的多个协议;一旦使用implements
来修饰的话,那么子类中必须实现所有抽象类中的方法;
dart
的Mixins
dart
中存在混入,通过with
修饰;这个就相当于多继承;注意不能混入带有构造函数的类,也不能是继承于其他类的类。
以上只是dart
的一些基础的语法,并且也只做了简单的使用,后期会继续深入。