我们上一篇讲了变量、数据类型以及运算符的一些知识,我们这篇博客讲一下关于函数的一些知识
函数
Dart是一个面向对象的语言,函数也是对象,函数属于Function对象。函数可以像参数一样传递给其他函数。
1.可选参数
将参数使用中括号[]括起来,用来表明是可选位置参数。示例代码如下:
printPerson(String name,[int age,String gender]){
print("name=$name,age=$age,gender=$gender");
}
void main(){
printPerson("张三");
}
2.参数默认值
如果参数指定了默认值,当不传入值时,函数里会使用这个默认值。如果传入了值,则用传入的值取代默认值。通常参数的默认值为null。代码示例如下:
void main(){
printPerson("张三",age: 20,gender: "2");
}
printPerson(String name,{int age=30,String gender="1"}){
print("name=$name,age=$age,gender=$gender");
}
调用上面的main()方法会输出:name=张三,age=20,gender=2,取代了默认值。
3.main函数
Flutter应用程序必须要有一个main函数,和其他语言一样作为程序的入口函数。
流程控制语句
Dart语言的流程控制语句如下:
1.if和else
2.for(循环)
3.while和do-while(循环)
4.break和continue
5.switch和case
6.assert(断言)
7.try-catch和throw
1.if和else
Dart支持if及else的多种组合,代码示例如下:
int score=90;
if(score>90){
print("优秀");
}else if(score>60){
print("及格");
}else if(score<60){
print("不及格");
}
2.for循环
代码示例如下:
var list=[1,2,3,4,5];
for(var i=0;i<list.length;i++){
print(list[i]);
}
除了常规的for循环外,针对可以序列化的操作数,可以使用forEach()方法。当不关心操作数的当前下标时,forEach()方法是很简
便的。代码如下所示:
var list=[1,2,3,4,5];
for(var i in list){
print(i);
}
3.while和do-while(循环)
我们用例子来看一下他们之间的区别,代码示例如下:
void main(){
int count=0;
while(count<5){
print(count++);
}
}
void main(){
int count=0;
do{
print(count++);
}while(count<5);
}
上面两个例子的输出为:
0
1
2
3
4
4.break和continue
break用来跳出循环,代码示例如下:
var list=[1,2,3];
for(var i in list){
if(i==2){
break;
}
print(i);
}
continue只是跳出本次循环,但是代码还是会往下执行,代码示例如下:
var list=[1,2,3];
for(var i in list){
if(i==2){
continue;
}
print(i);
}
5.switch和case
Dart中switch/case语句使用==操作来比较整数、字符串或其他编译过程中的常量,从而实现分支的作用。switch/case语句的前后
操作数必须是相同类型的对数实例。每一个非空的case字句最后都必须跟上break语句。代码示例如下:
String language = "android";
switch (language) {
case "android":
print("android");
break;
case "java":
print("java");
break;
case "phython":
print("phython");
break;
default:
break;
}
6.assert
Dart语言可以使用assert语句来中断正常的执行流程,当assert判断的条件为false时发生中断。assert判断的条件是任何可以转化
为boolean类型的对象,即使是函数也可以。如果assert判断为true,则继续执行下面的语句;反之则会抛出一个断言错误异常
AssertionError。代码示例如下:
assert(name!=null)//确定变量的值不为null
面向对象
Dart作为高级语言支持面向对象的很多特性,并且支持基于mixin的继承方式。
基于mixin的继承方式是指:一个类可以继承自多个父类,相当于其他语言里的多继承。所有的类都有同一个基类Object,一切皆为对象。
使用new语句实例化一个类,代码示例如下:
var person=new Person('tom');
实例化成员变量
类定义中所有的变量都会隐式的定义setter方法,针对非空的变量会额外增加getter方法。实例化成员变量代码示例如下:
void main(){
var student=new Student();
student.name="Tom";
student.age=18;
}
class Student {
String name;
int age;
}
构造函数
1.常规构造函数
构造函数是用来构造当前类的函数,是一种特殊的函数,函数名称必须要和类名相同才行。构造函数代码示例如下:
class Person{
String name;
int age;
Person(String name,int age){
this.name=name;
this.age=age;
}
}
可以使用this关键字,this关键字指向了当前类的实例。代码示例如下:
class Person{
final name;
final age;
Person(this.name,this.age);
}
2.命名的构造方法
使用命名构造函数从另一类或现有的数据中快速实现构造函数,代码示例如下:
class Person{
String name;
int age;
Person(this.name,this.age);
Person.withMap(Map map){
this.name=map["name"];
this.age=map["age"];
}
}
3.工厂构造方法
在构造方法前添加关键字,factory实现一个工厂构造方法,在工厂构造方法中可返回对象。代码示例如下:
class Logger{
final String name;
static final Map<String,Logger> cache=<String,Logger>{};
factory Logger(String name){
if(cache.containsKey(name)){
return cache[name];
}else{
final logger=Logger._internal(name);
cache[name]=logger;
return logger;
}
}
Logger._internal(this.name);
void log(String msg){
print(msg);
}
}
4.构造函数初始化列表
除了调用父类的构造函数,也可以通过初始化列表在子类的构造函数运行前来初始化实例的成员变量值,代码示例如下:
class Person{
String name;
int age;
Person.withMap(Map map):name=map["name"],age=map["age"];
}
5.常量构造方法
如果类是不可变状态,可以把对象定义为编译时常量。使用const声明构造方法,并且所有变量都为final,使用const声明对象,可以省略,代码示例如下:
class Person{
final name;
final age;
const Person(this.name,this.age);
}
读取和写入对象
get()和set()方法是专门用于读取和写入对象的属性的方法,每一个类的实例,系统都隐式地包含有get()和set()方法。代码示例如下:
void main(){
var rect=new Rectangle();
rect.width=10;
rect.height=20;
print(rect.area);
rect.area=200;
print(rect.width);
}
class Rectangle{
num width,height;
num get area{
return width * height;
}
set area(value){
width=value/20;
}
}
继承类
继承是面向对象编程技术的一块基石,因为它允许创建分等级层次的类。继承就是子类继承父类的特征和行为,使得子类对象(实
例)具有父类的实例域和方法;或子类从父类继承方法,使得子类具有父类相同的行为。Dart里使用extends关键字来创建一个子
类,super关键字来指定父类。代码示例如下:
void main(){
var student=new Student();
student.name="Tom";
student.age=18;
student.work();
student.study();
}
class Student extends Person{
void study(){
print("study");
}
}
class Person{
String name;
int age;
void work(){
print("work");
}
}
抽象类
抽象类类似于Java语言中的接口。抽象类里不具体实现方法,只是写好定义接口,具体实现留着调用的人去实现。抽象类可以使
用abstract关键字定义类。代码示例如下:
void main(){
var student=new Student();
student.run();
}
abstract class Person{
void run();
}
class Student extends Person{
@override
void run() {
// TODO: implement run
print("run");
}
}
枚举
枚举类型是一种特殊的类,是一种有穷序列集的数据类型,通常用来表示相同类型的一组常量值。每个枚举类型都用于一个index
的getter,用来标记元素的元素位置。第一个枚举元素的索引是0;代码示例如下:
enum Season{
spring,
summer,
autumn,
winter
}
枚举类里面的每个元素都是相同类型,可以使用switch语句来针对不同的值做不同的处理,代码示例如下:
void main(){
var currentSeason=Season.autumn;
print(currentSeason.index);
switch(currentSeason){
case Season.spring:
print("1-3月");
break;
case Season.summer:
print("4-6月");
break;
case Season.autumn:
print("7-9月");
break;
case Season.winter:
print("10-12月");
break;
}
}
enum Season{
spring,
summer,
autumn,
winter
}
Mixins
Mixins类似于多继承,是在多类继承中重用一个类代码的方式。
作为Mixins的类不能有显示声明构造方法。作为Mixins的类只能继承自object,使用关键字with连接一个或多个mixin。代码示例
如下:
void main(){
var d=new D();
d.a();
d.b();
d.c();
}
class A{
void a (){
print("a");
}
}
class B{
void a (){
print( "A a");
}
}
class C {
void c (){
print("c");
}
}
class D extends A with B,C{
}
泛型
泛型通常是为了类型安全而设计的,适当地指定泛型类型会生成更好的代码,可以使用泛型来减少代码的重复。Dart中使用<T>
的方式来定义泛型。代码示例如下:
var list=new List<String>();
list.add("hello");
list.add("1");
1.用于集合类型
泛型用来List和Map类型参数化:List:<type>、Map:<keyType,valueType>,代码示例如下:
var list=<String>["h","e","l","l","o"];
var map=<String,String>{
"1":"first",
"2":"second",
"3":"third",
"4":"forth",
};
2.在构造函数中参数化。代码示例如下:
var persons=new Map<String,Person>();
库的使用
1.引用库
通过import语句在一个库中引用另一个库的文件。需要注意以下事项:
①.在import语句后面需要接上库文件的路径。
②.对Dart语言提供的库文件使用dart:xx格式。
③.第三方的库文件使用package:xx格式。
import的例子如下:
import 'person.dart';
import 'dart:io';
2.指定一个库的前缀
当引用的库拥有相互冲突的名字,可以为其中一个或几个指定不一样的前缀。代码示例如下:
import 'package:person1/person.dart';
import 'package:person2/person2.dart' as person2;
Person person=new Person();
person2.Person person=new person2.Person();
person1/person.dart以及person2/person2.dart里都有Person类,如果直接引用就不知道具体引用哪个Person类,所以代码中把
person2/person2.dart指定成person2,这样使用person2.Person就不会发生冲突。
3.引用库的一部分
如果只需要使用库的一部分内容,可以有选择地引用,有如下关键字:
①.show关键字:只引用一点。代码示例如下:
import 'package:lib1/lib1.dart' show foo;//只引用lib1.dart下的foo部分
②.hide关键字:除此之外都引用。代码示例如下:
import 'package:lib2/lib2.dart' hide foo;//引用lib2.dart下的所有内容,除了foo部分
到这里的话,Dart语言的讲解就结束了。后面要开始Flutter知识了,要开始Flutter的踩坑之路了,加油,各位!