Flutter二:Dart基础语法
2019-12-11 本文已影响0人
Anwfly
前言:Google为什么选择
- 基于JIT的快速开发周期
Flutter在开发阶段采用JIT模式,这样就避免了每次改动都要进行编译,极大的节省了开发时间; - 基于AOT的发布包
Flutter在发布时可以通过AOT生成高效的ARM代码以保证应用性能。
为了快速流畅的用户体验需要能够在每个动画帧运行大量的代码,不能有周期性的停顿,否则会造成掉帧。 - 单线程:
不需要锁,不存在数据竞争和变量状态同步,也没有线程上下文切换的性能损耗和锁导致的卡顿。 - 垃圾回收
多生代无锁垃圾回收器,专门为UI框架中常见的大量Widgets对象创建和销毁优化。
一. 变量和数据类型Dart语言
- 常量:
从未打算更改的一个变量,那么使用 final 或 const,不是var,也不是一个类型。 一个 final 变量只能被设置一次,两者区别在于:const 变量是一个编译时常量,final变量在第一次使用时被初始化。被final或者const修饰的变量,变量类型可以省略
//可以省略String这个类型声明
final str = "hi world";
//final String str = "hi world";
const str1 = "hi world";
//const String str1 = "hi world";
- 变量:Dart使用var声明变量,他并不是一个类型,类型会自动识别的,var变量一旦赋值,类型便会确定,则不能再改变其类型
var t;
t = "hi world";
// 下面代码在dart中会报错,因为变量t的类型已经确定为String,
// 类型一旦确定后则不能再更改其类型。
t = 1000;
- 基本数据类型: Number、String、Boolean、List、Map
//Number:int和double
int score = 100;
double per = 3.14;
//string
String name = "anfly";
//boolean
bool isValid = true;
//string转义
String s = 'I\'m anfly';
String s1 = "I'm anfly";
//string拼接
//注意:不同类型的数据不能拼接,跟Java有所区别,Java可以强转为string
// print("我的成绩是" + score);
print("我的成绩是:${score}");
//StringBuffer实现字符串拼接,但用的不是append
StringBuffer sb= StringBuffer();
sb.write("");
//$变量
int a = 20;
int b = 40;
print("the sum of $a and $b is ${a + b}");
//List类型:具有相同类型的数据,使用方式和数组一样
var list = [1,2,3];//自动识别类型
//Map 类型
//方式一:
var weeks ={'Monday':'星期一','Tuesday':'星期二'};
//方式二:使用map的构造函数
var weeks = new Map();
weeks["Monday"] = "星期一";
weeks["Tuesday"] = "星期二";
//第二种方式可以增加一个值
weeks["Wednesday"] = "星期三";
//检查key是否在map中
assert(week["Monday"]==null)
//list转map,map转list
list.map()
map.tolist()
- dart分支:if switch
//if操作符
double salery = 2000;
if (salery < 2000) {
print("$salery 小于2000");
} else if (salery > 2000) {
print("$salery 大于2000");
} else {
print("$salery 等于2000");
}
if (a > b) {
print("$a is salery");
} else {
print("$b is salery");
}
//三元操作符 ?: 表达式
a > b ? print("$a is salery") : print("$b is salery");
//??表达式,判空,如果为空可默认??后边的内容
//区分null和""
String myName = null;
String newName = myName ?? "anfly";
print(newName);
//switch,用法和Java中一样的
String grade = "A";
switch (grade) {
case "A":
print("very good");
break;
case "B":
print("good");
break;
case "C":
print("enough good");
break;
}
- 循环
//for,知道循环次数
for (int i = 0; i < 4; i++) {
print(i);
}
List people = ["a", "b", "c"];
for (int i = 0; i < people.length; i++) {
print(people[i]);
}
//for in
for (String person in people) {
print(person);
}
//while,不知道循环次数
int i = 0;
while (i < people.length) {
print(people[i]);
i++;
}
//do while
do {
print(people[i]);
i++;
} while (i < people.length);
//break 停止当前循环
for (int i = 0; i < 10; i++) {
if (i == 5) break;
}
//指定停止的循环
outterLoop:
for (int i = 0; i < 10; i++) {
innerLoop:
for (int j = 0; j < 10; j++) {
if (j == 4) {
break outterLoop;
}
}
}
//continue退出本次循环
for (int i = 0; i < 10; i++) {
if (i == 5) continue;
}
- 函数的9个知识点:
//1.函数定义
void sumValue() {
int a = 1;
int b = 2;
int sum = a + b;
print("a+b=${sum}");
}
//2.函数传参
void sumValue(int a, int b) {
int sum = a + b;
print("a+b=${sum}");
}
//3.函数返回值
int sumValue(int a, int b) {
int sum = a + b;
return sum;
}
//4.箭头函数(无返回值)
void sumValue(int a, int b) => print("a+b=${a + b}");
//5.箭头函数(有返回值),不需要加return
int sumValue(int a, int b) => a + b;
//6.函数参数(可选参数)
//带有可选参数的函数:
void printCites(String c1, [String c2, String c3]) =>
print("城市一:${c1}\n城市二:${c2}\n城市三:${c3}");
//调用:调用的地方可以不后前两个参数
printCites("北京");
//7.函数参数 命名,如果形参被花括号包含,调用的时候就要指明形参名称
//函数
void printCites(String c1, String c2, {String c3}) =>
print("城市一:${c1}\n城市二:${c2}\n城市三:${c3}");
//调用
printCites("北京", "上海", c3: "天津");
//8.函数默认返回值
//函数
int sumValue(int a, int b) {
int sum = a + b;
}
//调用
print(sumValue(2, 2));
结果:null
//9.函数参数 赋默认值
void printCites(String c1, String c2, [String c3 = "深圳"]) =>
print("城市一:${c1}\n城市二:${c2}\n城市三:${c3}");
//调用的时候可以不赋值,直接用默认的参数值
printCites("北京", "上海", );
5.类
//1.类的基础知识
//2.构造函数
//3.自定义构造函数
class Student {
String name = "大飞";
int age = 18;
//构造与
//空参构造
// Student() {
// print("构造函数");
// }
//实参构造
// Student(String name, int age) {
// this.name = name;
// this.age = age;
// }
Student(this.name, this.age); //简写实参构造
//自定义构造函数
Student.CustomConstructor(this.name, this.age) {
print("自定义构造函数");
}
void study() {
print("${this.name} 正在学习呢");
}
}
//调用
var student = Student("awf", 10);
// student.name = "anfly";
// student.age = 28;
// print("姓名是${student.name} and 年龄是${student.age}");
// student.study();
var student2 = Student.CustomConstructor("anfly",12);
print("姓名是${student.name} and 年龄是${student.age}");
- 继承和重写父类的方法
//1.自定义setter和getter方法
//2.类的继承:跟Java一样单继承
//3.重写父类的方法和属性
var student = Student();
student.name = "大飞";//调用默认setter方法
print(student.name);//调用默认getter方法
student.setName("大飞");//调用自定义的setter方法
print(student.getName());//调用自定getter方法
class Student {
String name;
int age;
void setName(String name) => this.name = name
String getName() => return this.name;
}