1、var 变量、final,const常量编程
变量用关键词var来定义,Dart语言是类型推断的因此在定义变量的时候能够不用指明变量的类型,例子以下数组
void main() {
var name = "小明";
var age = 10;
var job;
print(name);
print(age);
print(job);
}
复制代码
在上面例子中,定义了变量 name 和 age ,job,其中给name赋值 "小明",根据类型推断name就是String 类型的,给 age赋值 10,根据类型推断age 就是 int 类型的。对job没有赋值job变量的默认值就是null。闭包
须要注意的是变量的类型一旦肯定就不能再给他赋不一样类型的值。异步
常量用 final 或 const 关键字,例子以下async
void main() {
final a = "好";
const b = 1;
}
复制代码
须要注意的是,常量在定义的时候必定要进行赋值,且定义好之后不能被修改不然会报错。编程语言
2、Dart中的数据类型ide
在Dart中all is Object ,Dart 中有 numbers(数值类型),strings (字符串类型),booleans(布尔类型),lists(列表类型),maps(字典类型),runes(字符类型),symbols(符号类型)异步编程
在Dart中数值类型只有int 和 double两种,例子以下函数
void main() {
int a = 1;
double b = 2;
print(a);
print(b);
}
复制代码
上面的例子中定义了整数类型的a,和double 类型的 b,打印结果是this
flutter: 1
flutter: 2.0
2.String字符串类型
Dart中字符串用单引号 '' 或双引号 "" 来建立,例子以下:
void main() {
var a = "热爱编程";
var b = '哈哈哈哈';
print(a);
print(b);
}
//输出结果:
//flutter: 热爱编程
//flutter: 哈哈哈哈
复制代码
字符串的格式化
在Dart 中用 ${} 来进行字符串的格式化,例子以下:
void main() {
var a = "热爱编程";
var b = '哈哈哈哈';
var c = "咱们都 ${a + b} ";
print(c);
}
//输出结果为
//flutter: 咱们都 热爱编程哈哈哈哈
复制代码
上面的例子中字符串 a 和 b 能够用 + 号 直接拼接在一块儿
在字符串中能够用反斜杠\来进行字符转译
字符串的相关方法使用例子以下:
void main() {
var a = "热爱编程";
//判断是否为空
print(a.isEmpty);
//字符串的长度
print(a.length);
//字符串的类型
print(a.runtimeType);
}
//输出结果为:
//flutter: false
//flutter: 4
//flutter: String
复制代码
上面例子是字符串的经常使用方法,isEmpty是判断字符串是否为空,length是求字符串的长度,runtimeType是求字符串的类型。
字符串也是一种集合类型,例子以下:
void main() {
var a = "热爱编程";
print(a[1]);
}
//输出为:
//flutter: 爱
复制代码
Dart中的布尔类型只有 true和false,例子以下:
void main() {
var a = false;
print(a.runtimeType);
}
//输出结果:
//flutter: bool
复制代码
4.List列表类型(数组类型)
用List来定义列表,能够在<>内指定列表元素的数据类型,例子以下:
void main() {
List<int> a = [10,100,1000];
List<String> b = ["热", "爱","编","程"];
}
复制代码
上面例子中,尖括号中的类型用来指定元素的数据类型,若是列表指定了元素的数据类型,就只能存放该种数据类型的数据。若是想在列表中存放不一样类型的数据,能够将列表中元素的类型用dynamic关键字声明为动态类型的,例子以下:
void main() {
List<dynamic> a = [10,"哈哈哈",99.9];
}
复制代码
可是在通常开发中咱们不须要指定列表的元素类型,由于Dart是能够类型推断的,因此直接使用var进行声明便可,上面的例子通常以下声明:
void main() {
var a = [10,"哈哈哈",99.9];
}
复制代码
列表中的经常使用方法的使用例子以下:
void main() {
var a = [10,"哈哈哈",99.9];
//添加元素
a.add("ccc");
//删除一个元素
a.remove(10);
//元素个数
a.length;
//...等等其余方法
}
复制代码
字典定义使用例子以下:
void main() {
Map<String, dynamic> a = {"name": "Flutter" , "languge": "Datr"};
}
复制代码
用Map来定义一个字典,在尖括号内来指定字典的key和value的数据类型,须要主要的是和数组同样,一旦类型被肯定,那么就必需要和定义的类型一致不然会报错。
由于 Dart是能够类型推断的,因此上面的例子能够直接用var来定义以下:
void main() {
var a = {"name": "Flutter" , "languge": "Datr"};
print(a);
}
//输出为:
//flutter: {name: Flutter, languge: Datr}
复制代码
Map能够经过键来获取,设置,新增值,例子以下:
void main() {
var a = {"name": "Flutter" , "languge": "Datr"};
//新增键值对
a["version"] = "1.1.0";
//修改键值
a["name"] = "Swift";
print(a);
}
//输出结果:
//flutter: {name: Swift, languge: Datr, version: 1.1.0}
复制代码
3、Dart中的运算符
1.算数运算符加"+",减 "-" ,乘"*" ,除"/",取整 "~/",取模%
"+"是用来作加的运算,除了数字类型外,字符串,列表,字典也支持相加运算,例子以下:
void main() {
var a = 10 + 20;
var b = "10" + "10";
print(a);
print(b);
}
//打印结果:
//flutter: 30
//flutter: 1010
复制代码
"~/" 是取整的运算符,例子以下:
void main() {
var a = 15;
var b = a ~/ 4;
print(b);
}
//打印结果:
//flutter: 3
复制代码
再其余运算符与其余编程语言基本同样不作介绍
与其余语言基本同样不作介绍
3.类型运算符 as,is, is!
as是作类型的转换
is是判断是否属于某个类型
is!是判断是否不属于某个类型
“??” 是Dart的空条件运算符,就是取默认值的意思,例子以下
void main() {
var a;
var b = a ?? 1;
print(b);
}
//输出结果:
//flutter: 1
复制代码
上面的例子中, 变量a没有赋值因此默认为null,在将a赋值给b的时候由于a是null,因此 经过?? 给把1赋值给了a。
5.级联运算符 “..”
级联运算符能够对某个对象进行连续的操做而不用生成中间变量,例子以下: 例子一
class Person{
func_one(){
print("Dart语言");
}
func_two(){
print("Flutter使用Dart");
}
}
void main() {
Person()..func_one()..func_two();
}
//打印结果以下:
//flutter: Dart语言
//flutter: Flutter使用Dart
复制代码
点运算符用来访问对象的属性或方法,对不肯定是否为null的对象能够用“?.”来进行操做,例子以下:
class Person{
var name;
}
void main() {
var p = Person();
print(p?.name);
}
复制代码
4、 函数
1.函数的通常书写格式:
返回值 函数名称(参数列表){
函数体
}
复制代码
例子以下:
void main() {
int func_add(int a,int b){
return a + b;
}
var c = func_add(1, 2);
print(c);
}
//打印结果:
//flutter: 3
复制代码
上面例子中main函数是程序的入口, 里面定义了func_add函数
Dart中的all is对象, 因此能够将函数赋值给一个变量或者将函数做为参数,例子以下;
void main() {
int func_add(int a,int b){
return a + b;
}
var c = func_add;
var d = c(1,2);
print(d);
}
复制代码
Dart语言中在定义函数的时候函数的参数类型和返回值类型均可以省略,Dart语言会根据传入的参数和返回的值来动态推断。例子以下:
void main() {
func_add(a,b){
return a + b;
}
var c = func_add(1, 2);
print(c);
}
//打印结果
//flutter: 3
复制代码
若是某个函数的函数体只有一句话能够用箭头函数来定义,例子以下:
void main() {
func_add(a,b) => a + b;
var c = func_add(1, 2);
print(c);
}
//输出结果:
//flutter: 3
复制代码
2.可选参数的函数定义
名称可选参数函数的通常格式为
返回值类型 函数名称({可选参数列表}){
函数体
}
复制代码
可选参数放在{}号内部,例子以下:
void main() {
func_text({a,b}) {
if(a != null){
print(a);
}
if(b != null){
print(b);
}
};
func_text(a: 2);
}
//打印结果
//flutter: 2
上面的例子中定义了函数func_text其中参数 a和b都是可选的,须要注意的是,在调用的时候须要参数名称加:的形式来进行传参数
复制代码
位置可选参数,只须要将可选参数放入中括号便可,例子以下;
void main() {
func_text(a, [b]) {
if(a != null){
print(a);
}
if(b != null){
print(b);
}
};
func_text(2,3);
}
//输出结果
//flutter: 2
//flutter: 3
复制代码
在上面例子中func_text中有两个参数a和b,其中b 是可选的。在调用的时候能够不传。
函数可选的能够给个默认值,若是没有默认值函数中取到的参数值为null,,设置默认值之后若是调用的时候没有传入这个参数,在函数内就会使用默认值,在定义可选参数的时候应该尽可能提供一个默认值。
例子以下:
void main() {
func_text(a, [b = 4]) {
if(a != null){
print(a);
}
if(b != null){
print(b);
}
};
func_text(3);
}
//打印以下:
//flutter: 3
//flutter: 4
复制代码
三、匿名函数
Dart中没有名称的函数是匿名函数,匿名函数能够直接赋值给变量,经过变量来调用。例子以下:
void main() {
var a = (b,c){
return b + c;
};
var d = a(1,2);
print(d);
}
//打印以下:
//flutter: 3
复制代码
在上面的例子中,把匿名函数赋值给了变量a,而后经过a来调用。
5、闭包
闭包是一种特殊的函数。
闭包是定义在函数内部的函数。
闭包可以访问外部方法内的局部变量并持有。
经典例子以下:
void main() {
var func = a();
func();
func();
func();
}
a(){
int count = 0;
func_count(){
print(count ++);
}
return func_count;
}
//打印结果:
//flutter: 0
//flutter: 1
//flutter: 2
复制代码
上面例子中, 函数a中的 func_count函数就是闭包,他定义在a函数内,可以访问并持有他外部函数的局部变量count,暂时理解到这里后面会详细说明闭包的使用。
6、类
Dart是基于类和继承的面向对象的语言。对象是类的实例。在类中定义了对象的属性和方法。
Dart中用 class关键字来进行类的定义,例子以下:
class Person {
double weight;
int age;
}
复制代码
上面的例子中定义了Person类,类中定义了两个属性weight和age;咱们能够经过Person来建立对象,经过类来建立对象须要调用类的构造函数。类的构造函数通常和类的名字同样。当定义一个类时Dart会默认生成一个没有参数的构造函数,能够直接经过类的名称来调用。例子以下:
class Person{
var name;
}
void main() {
var p = Person();
print(p?.name);
}
复制代码
上面的例子中,定义的Person类能够直接经过Person()来建立对象。类对象中的方法属性均可以经过点来访问调用。
通常Dart语言的构造方法的书写格式以下:
class Person{
var name;
var age;
//通常构造方法的书写格式
Person(this.name,this.age);
}
复制代码
2.类的实例方法:
类定义了属性和方法,通常属性用来存储数据,方法用来定义行为。
例子以下:
class Person{
var name;
var age;
//通常构造方法的书写格式
Person(this.name,this.age);
func_run(){
print("在跑步");
}
}
复制代码
上面的例子中定义了方法func_run()就是Person类中的方法。调用的例子以下:
void main() {
var p = Person();
p.func_run();
}
复制代码
在类中用this来访问自身的属性和方法,例子以下:
class Person{
var name;
var age;
//通常构造方法的书写格式
Person(this.name,this.age);
func_run(){
print(" ${this.name} 在跑步"); //用this访问name属性
}
}
复制代码
类中还有两个比较特殊的方法,Setters 和 Getters方法,Setters用来设置对象的属性,Getters用来获取对象的属性。在定义属性时Dart会默认生成Setters和Getters方法。
Dart中 在抽象类中能够定义抽象方法,抽象方法是只有定义没有函数实现的方法。抽象方法是面向接口开发的基础。
抽象类用abstract关键字来定义。例子以下:
abstract class PersonInterface{
func_run();
}
复制代码
上面例子中定义了一个PersonInterface 的接口,里面只定义了一个func_run()的抽象方法。Person类能够对这个接口进行实现例子以下:
abstract class PersonInterface{
func_run();
}
class Person implements PersonInterface{
var name;
var age;
//通常构造方法的书写格式
Person(this.name,this.age);
实现接口函数
func_run(){
print(" ${this.name} 在跑步"); //用this访问name属性
}
}
复制代码
一个类也能够同时实现多个接口。
抽象类不能够被实例化。
子类继承父类,就可使用父类中的属性和方法。而且子类能够重写夫类中的属性和方法。Dart中用extends关键字来进行类的继承。例子以下:
class Person{
var name;
var age;
//通常构造方法的书写格式
Person(this.name,this.age);
func_run(){
print("在跑步");
}
}
class Man extends Person{
//构造函数调用夫类的构造函数
Man(name,age) : super(name,age);
func_eat(){
print("正在吃饭");
}
}
复制代码
上面的例子中Man类继继承了Person类,须要注意的是构造函数不能被继承,但能够经过super来调用夫类的方法。子类也能够重载父类的方法。例子以下:
class Person{
var name;
var age;
//通常构造方法的书写格式
Person(this.name,this.age);
func_run(){
print("在跑步");
}
}
class Man extends Person{
//构造函数调用夫类的构造函数
Man(name,age) : super(name,age);
func_eat(){
print("正在吃饭");
}
@override
func_run(){
print("Man在跑步");
}
}
复制代码
上面例子中子类重载父亲类的func_run()方法,其中@override关键字用来标注这个方法是子类重载夫类的,@override关键字能够省略。
枚举用enum来定义。例子以下:
enum Language{
Dart,
Oc,
Swift
}
class Person{
var name;
Language language;
//通常构造方法的书写格式
Person(this.name,this.language);
}
void main() {
var p = Person();
p.language = Language.Dart;
print(p.language);
}
//输出:
//Dart
复制代码
七、 类的Mixin特性
Mixin是Dart中很是强大的一个功能。Dart语言是但继承的只能继承一个父类。不少时候须要集合多个类的功能来实现一个复杂的自定义类,这时候Mixin特性就会用到。
Mixin的功能就是让一个类把其余类的功能混合进来。例子以下:
能被用来混合的类是Mixin类,Mixin类不能实现构造方法不然不能被其余类混合,用with关键字来进行混合。Mixin也支持多混合。
例子以下:
class Person{
T data;
//通常构造方法的书写格式
Person(this.data);
}
复制代码
** 7、异步编程 async , await , Future的使用**
8、模块的引用
用 import来倒入模块
例子:
import "./lib/aa.dart";
重名的话能够用as来从新定义名称以下
import "./lib/aa.dart" as bb;
使用:
void main() {
aa();
bb.aa();
}
复制代码
未完待续