群组
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;// 此时报错
可以使用特定类型来定义变量
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
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";
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