前言
React-Native相比 ,Flutter是真正能实现跨平台保持UI一致性的移动跨平台UI框架,它是谷歌Fuchsia新版操作系统使用的UI框架,Flutter预置的很多组件都是可以直接拿来使用,而且在Android和IOS系统上表现完全一致,通过消息渠道MethodChannel,更方便简洁的实现了和原生端通信;想要开始编写Flutter应用,那么我们就先学Dart语言开始吧
正文
上节课我们介绍了Flutter从工程搭建到运行的知识,下面我们要对于变成语言做些简单了解,这里只介绍常用的语法,如果想要了解更多,请查看官方介绍
Flutter采用Dart语言进行开发,而并非Java,Javascript这类热门语言,这是Flutter团队对当前热门的10多种语言慎重评估后的选择。因为Dart囊括了多数编程语言的优点,它更符合Flutter构建界面的方式
Dart & FlutterDart语言
1,数据类型
2,类
3,函数
第一节:数据类型
Dart中共可以分为9种数据类型,分别为num,int,double,bool,list,set,map,runes,symbol;常用的就是前7种,runnes是用于显示Unicode字符的,而symbol是Dart语言内部使用的;同时,Dart的变量声明,也可以不使用具体的上述9种类型来声明,仅使用var或者dynamic来修饰即可
num(int,double)类型
num类型其实是int和double类型的基类,也就是父类,可以隐式转换为两种子类型,样例如下:
num _age = 0;
num _age2 = 1.0;
_age表示num类型的私有变量,初始化的值未0,此时打印出_age的类型(_age.runtimeType),发现类型是int类型的;而_age2同样以num类型声明,只是初始化的值给了1.0,打印的类型却是double类型的;
double _age = 0;
double _age2 = 1.0;
上面的例子,将num换成了double来修饰,那么_age和_age2的数据类型却都是double了,这里不难理解,因为double和int都属于最小修饰单位了,修改的是具体实际类型
int _age = 0;
int _age2 = 1.0;
再把double同时换成int来修饰,这里其实1.0这一行的_age2就会报错了,因为int是整形的,所以这里声明初始化不合法;同样改成1后,两种类型都是int类型
bool类型
bool类型也是常用类型之一,比如我们需要控制某个流程是否执行,我们会声明一个布尔值来操作,如果为true则执行,否则不执行,这是很常见的使用bool来控制流程的情景,Dart中使用样例如下
bool a = true;
bool _b = false;
a是一个公用的布尔类型,值为true;_b是一个私有的布尔类型,值为false;注意,此处不存在默认值为false的情况,不给默认值,默认值就是null,而null和非null是不可以直接放入判断的,这里和JavaScript要区别来对待
list类型
我们和后台进行数据交互时都会存在列表数据,而这些列表数据则是需要存储在list中,const声明后的list不能修改,常用空List声明几种方式如下
List声明set类型
有时候我们需要列表中的数据是不重复的,但是我们又不想自己去主动维护,这里我们可以使用set来作为list的替代品,常见的空set几种声明方式如下
Set声明map类型
需要存储键值对的时候,我们就需要使用map类型了,比如一个姓名对应一个学生,那么不使用对象来封装的列表的时候,我们就需要使用键值对map来存储,常见几种空的声明方式如下
Map声明runes类型
该种类型主要用于在字符串中表示Unicode字符,表示Unicode码位的方法是\uxxxx,其中XXXX是4位十六进制值。例如,心脏字符(♥)是\u2665。要指定多于或少于4个十六进制数字,请将该值放在大括号中。例如,笑符号(😆) is \u{1f600}
Runes使用动态类型var,dynamic
var是JavaScript语言中使用的变量声明关键字,dart中也可以使用var来声明变量类型并执行自动推断,如下_age就是int类型的,而_age2就是double类型的,很像num类型的自动转换;
注意,使用了var就不能使用上述具体类型来修饰了,即var int a = 0;是错误的
var声明变量dynamic是C#语言中的特性,Java里是不存在这种弱类型声明的,而dart中也有此种类型,这种类型其实和var有内在联系,如果我们使用var声明一个变量,并未赋值,那么打印出类型就是dynamic类型的,当然dynamic也可以直接修饰变量,如下两个变量都是string类型的
dynamic声明变量final,const,static修饰类型
上述我们介绍了如何修饰变量名,这里我们介绍如何修饰变量类型,我们使用final和const来修饰不可变变量/对象,使用static来修饰类成员;final和const都是在声明的时候就要初始化,两者的区别在于编译时常量和运行时常量,如下图
final和const而static则可以用在任意地方,但是有一种情境下必须使用static来修饰;在类种使用const修饰变量的时候,必须使用static关键字来修饰变量类型
static&const第二节:类
类是dart中常用的对象之一,用class表示类的修饰关键字,这里和Java里的关键字是一样的,我们使用class来封装对象,把不同类型的数据绑在一起进行处理传递等;
类分为普通类和抽象类,dart中没有接口的概念,所有的类都是隐式的接口,也就是可以使用implements来实现类,抽象类使用abstract修饰,Java内的抽象类内的方法必须要有方法体的,这里抽象类内可以不写方法体,只声明方法;当然,这里的class也可以被extends的,也不能使用多个extends,但是可以使用多个implements,从这个来说,也就是变相实现了多继承
继承有参构造方法上述OneChild继承了One,但是发现OneChild报错,这里如果使用继承关键字extends关键字,需要重定向父类的非空构造方法,如果是父类里没有有参构造方法或使用可选参数构造方法,则此处就不会报错;此处修改后如下:
构造方法父类重定向类也可以继承extends抽象类,但是继承抽象类要注意必须要重写父抽象类的中方法声明,父抽象类已经有方法体的可以有选择的重写与否,如下中的getT方法必须要重写,而getT2则可以不写
继承抽象类同时类也可以实现implements抽象类,但是要重写抽象类中的所有非构造方法以外的部分,具体样例如下:
实现抽象类会根据构造方法的执行顺序是:初始化列表->父类的无参构造函数->当前类的无参构造函数,这里后面两个我们都清除,但是对于初始化列表构造函数,我们需要特别说明下,这个构造方法是最早运行的,我们可以做些赋值或者规则判断,也可以加上方法体,样例如下:
初始化列表上例中,我们看到在调用默认构造函数时,我们直接对a进行初始化,assert用于断言中断,意思是如果判断为false,则不执行后面的逻辑,并抛出错误,此处错误并不会导致界面上的crash,只是内部中断处理
第三节:函数
dart中的函数声明基本和Java差不多,但是可以不用声明返回类型,也可以声明了类型,不加return,比较灵活
无参函数上述是无参函数的声明,有参函数又可以分为3种:参数,位置参数,可选命名参数,前两种必须要写,但是最后一种可以不写,类似Java中的可变参数;位置参数和可选参数不能同时使用,且位置放在普通参数后面,部分样例如下:
有参函数其他:
Dart种不使用private,public,protected等修饰词来限制访问范围,使用下划线_来作为开头表示私有变量或者对象,不加下划线的表示公共的,类似于public修饰的
Dart中声明过但是未初始化的所有变量的值皆为null,即使变量声明使用num,int等声明
Dart中使用双英文点来直接调用对象内部方法,实现链式调用
Dart中表达式需要用分号结尾,这点和Kotlin有所不同
网友评论