Flutter开发-Dart语言基础

群组
Flutter,iOS,Android,Python等,闲聊工作&技术&问题;
个人主页:https://waitwalker.cn
telegram群链接:https://t.me/joinchat/Ej0o0A1ntlq5ZFIMzzO5Pw

        Dart是一种易于学习,易于扩展,并且可以部署到任何地方的应用编程语言.Dart是面向对象的编程语言,由Google在2011推出.

相关概念:

1)Dart真正实现了”一切皆对象”,即使数值类型,函数方法和null都是对象,上帝类是Object类.
2)Dart是强类型语言,类型标识是可选的,Dart会自动推断变量的具体类型.如果要指明某个对象为不确定类型,可以用dynamic(动态性)关键字来修饰变量.
3)Dart支持泛型,和Swift类似.
4)Dart支持顶级函数(main函数等,也是程序的入口),静态方法,实例方法.支持嵌套函数(函数内部创建函数)等.
5)Dart没有public,private等关键字,默认一些变量和方法都是公有的,如果想声明私有变量或者方法,可以用”_(下户线)”开头声明.
6)Dart可以使用分号作为语句的结束,也可以不写.
7)Dart注释.//和/**/

变量

变量的定义用var关键字,类型可以不写:

var name = "flutter";// String类型
var age = 20; // int 类型
var height = 1.80; // Double 类型

        当给变量赋值的时候,变量的类型已经确定,此时不能给变量赋值其他类型值:

var name = "flutter"; //String
name = 12;// 此时报错

var error

可以使用特定类型来定义变量

String newName = "my flutter";
int newAge = 21;
double newHeighth = 1.85;

变量的类型如果可变,可以用dynamic或者Obejct关键字来定义变量

dynamic flu = "Flutter"; //String类型
print("flu的值为:$flu");
flu = 12; //int 类型
print("flu的值为:$flu");

I/flutter (25846): 开始点击count
I/flutter (25846): 点击完成count=1
I/flutter (25846): flu的值为:Flutter
I/flutter (25846): flu的值为:12

Object da = "Dart";
print("da的值为:$da");

da = 2.0;
print("da的值为:$da");
I/flutter (25846): da的值为:Dart
I/flutter (25846): da的值为:2.0

变量默认值

如果声明一个变量而没有给他赋值的话,其默认值是null,null在Flutter中也是一个对象.

var stuName;
print("stu name:$stuName");
dynamic stuNewName;
print("stu new name:$stuNewName");

I/flutter (25846): stu name:null
I/flutter (25846): stu new name:null

class关键字

class关键字用于创建一个类,如果不指明继承哪个类,默认继承上帝类Object

class Student extends Object {

}

常量

final 和 const

        如果一个想定义一个常量,即一个变量的值被赋值后一直不会改变,可以通过final和const来声明,final修饰的变量在声明时不赋值,而在对象初始化时赋值;const修饰的变量必须赋值,否则报错.final 类似于Swift或者OC中的只读属性.

class Student extends Object {
  static const constVar; //const 修饰的变量必须赋值
  final name;
  Student(this.name);
}

// 使用
Student stu_1 = Student("waitwalker");
print("stu_1 name:${stu_1.name}");
I/flutter (25846): stu_1 name:waitwalker

final error

        const 修饰的变量赋值后就不会报错了,此时如果给stu_1.name重新赋值会报错,final修饰的变量不允许调用setter方法:

class Student extends Object {
  static const constVar = "const 修饰的变量必须赋值"; //const 修饰的变量必须赋值
  final name;
  Student(this.name);
}

// 使用
Student stu_1 = Student("waitwalker");
print("stu_1 name:${stu_1.name}");
stu_1.name = "new";

const error

Dart标准库中内置类型

判断对象的类型

在上帝类中有个只读属性runtimeType用于获取对象的类型:

print("stu_1 type:${stu_1.runtimeType}");
print("stu_1 type:${stu_1.name.runtimeType}");

I/flutter (25846): stu_1 type:Student
I/flutter (25846): stu_1 type:String

数值类型num

        num是Dart基本数值类型,其是int和doule的父类,Dart只有整型和浮点型两种基本数据类型,其长度依据操作系统自由伸缩:

abstract class int extends num {
}

abstract class double extends num {
}

        可以看到int类在num基本的运算操作基础上增加了一些位运算方法,double增加了一些如取绝对值等方法.

字符串String

        String是charCodes字符的集合,charCodes默认采用的是UTF-16编码,一个String在定义时可以采用单引号或者双引号将内容包起来.

abstract class String implements Comparable<String>, Pattern {

}

        如果多行字符串,可以采用三重(单/双)引号,将内容包起来,这个类似于Python和Swift的相关语法.

String today = """
Today is very hot.
Yes.
No.
""";
print("toady:$today");

I/flutter (26474): toady: Today is very hot.
I/flutter (26474): Yes.
I/flutter (26474): No.

        String类中还定义了一些截串,获取索引,比较两个字符串,获取长度等一些常规方法.

布尔类型bool

bool类型很简单,非零即真:

bool isiPad = false;
print("is iPad:$isiPad");
I/flutter (26474): is iPad:false

集合类型List

        Dart中集合类型List和Python中的List可以说一脉相承,List是一个泛型集合,可以存储任何需要的对象类型,其常规的增删改查操作方法和其他语言集合类型相似.

List list = ["date",12,45.0,"weather"]; //初始化方式
List list_a = List(10); //指定长度初始化
list_a.add("12"); //添加操作
list_a.add(12);
list_a.removeAt(1); //移除指定索引位置元素
list_a.removeLast(); //移除最后一个元素

字典类型(键值类型)Map

        Dart中的Map类型和其他语言中Map或者Dictionary中相似,在定义的时候可以指定键值得类型.

Map dic = Map();
dic["name"] = "flutter";
dic["version"] = "1.2";
Map dic_a = {
"name":"flutter",
"version":"1.2"
};

print("dic:$dic");
print("dic_a:$dic_a");

I/flutter (26474): dic:{name: flutter, version: 1.2}
I/flutter (26474): dic_a:{name: flutter, version: 1.2}

Runes类型

Runes类型一般用于编码特殊的Unicode,例如emoji.

方法

方法是程序功能的集合.

方法的常规定义

返回值类 方法名() {
return value;
}

// 例如
String getName() {
return name;
}

Student stu_1 = Student("waitwalker");
print("stu_1 name:${stu_1.name}");
String newN = stu_1.getName();
print("newN:$newN");

I/flutter (26474): stu_1 name:waitwalker
I/flutter (26474): newN:waitwalker

方法参数

        Dart方法的参数可以是变量也可以是一个方法,如果方法参数是一个变量,可以指定变量类型也可以不指定,建议指定.

方法中也可以设定可选参数,可选参数用[]包起来.

// 显示名称
String showName(String firstName) {
  return name + firstName;
}

Student student = Student("xiaoming");
String fullName = student.showName("wang");
print("full name:$fullName");

I/flutter (26474): full name:xiaomingwang

方法作为参数

Dart允许在方法中传递参数,其实传递的是方法的地址:

int sum(int a, int b) {
  print("sum result:${a + b}");
  return a + b;
}

int toatl(int a, int b, Function getSum) {
  return getSum(a,b);
}

void result() {
int r = toatl(12, 18, sum);
print("result:$r");
}

Student student = Student("xiaoming");
String fullName = student.showName("zhang",12);
print("full name:$fullName");
student.result();

I/flutter (26474): sum result:30
I/flutter (26474): result:30

方法参数默认值

在定义方法时,可选参数也可以指定一个默认值:

// 显示名称
String showName(String firstName, [int age = 20]) {
return name + firstName + "age is" + age.toString();
}

Student student = Student("xiaoming");
String fullName = student.showName("zhang",12);
print("full name:$fullName");
I/flutter (26474): full name:xiaomingzhang age is12

方法中嵌套方法

Dart语法方法中是可以嵌套方法的:

void size(int a) {
void intervalSize () {
print("size in:$a");
}

print("size out:$a");
}

匿名函数

        Dart中匿名函数和Python中的lamada匿名函数一样,不用给方法起名字了,在定义的时候直接用一个变量来接收,引用时直接引用这个变量:

var lamadaFunc = (String name) => "${name}";
student.lamadaFunc("wangxiaoming");

闭包

        闭包是对匿名函数的一种应用,Dart 其在Function类型,而在Swift中常当作函数参数用于一些异步回调,在Dart定义:

Function totalNum(int a) {
return (int b) => a + b;
}

var totalNum = student.totalNum(12);
var value = totalNum(3);
print("value:$value");
I/flutter (26474): value:15

  目录