老菜鸟的Flutter 之旅
VC 命令
Flutter New Project
前言
- 万物皆对象。 数字 方法 或 null 都是对象,每个对象都继承自Oject。
- 强类型语言。
- 支持泛型。
- 支持顶级方法(不与类绑定的方法)和 顶级变量。
- 在方法或变量前添加
_即可标记为私有。
代码规范规范
- 导入lib 文件时尽量用包名 而避免用 ./ 或../
- 不需要时不用this,构造时一般用this,普通成员使用时就不用this,
- 尽量用初始化方法,而不要用new
注释
- 单行注释以
//开头。Dart编译器会忽略行头和行尾之间的所有内容。 - 多行注释以
/*开头,以*/结尾 - 文档或属性或类时注释以
///或者/**开头
变量
变量声明
变量可以明确指定类型,也可以用var声明来推导类型或用Object 修饰。
//类型推断
var userName = 'text';
userName = "newText";
userName = 123; //更改类型编译无法通过
//指定类型
String name = 'Json';
//类型不局限于String
dynamic name = 'Json'
默认值
Dart 中声明时未初始化会被自动默认为null
int lineCount ;
assert(lineCount == null);
常量
final const
用final或者const修饰的变量,只赋值一次。
final 运行时赋值,const 编译时赋值。
// final修饰时, 可省略类型声明
final String nickname = 'Json';
final name = 'Json';
//const 修饰的一般是确定的常量
const double PI = 3.1415926;
var foo = const []; //创建常量
const baz = []; //修饰常量
foo = [1,2,3]; //true
baz = [1,2,3]; //false
数据类型
数值类型
- 数值主要类型:
intdouble通用类型num可指代int或double, - 数值型操作:
+ 加 - 减 * 乘 / 除 % 求余 ~/ 取整
- 数值型常用属性
isEven 判断是否是偶数 isOdd 判断是否是奇数
- 数值型常用方法
abs() 返回表示数字绝对值的整数
round() 返回四舍五入最接近的整数
floor() 返回向下取整得到的整数
ceil() 返回向上取整得到的整数
toInt() 返回整数的表现形式
toDouble() 返回数字值的 double 类型表现形式
int a = 100;
double b = 200.62;
a.toDouble(); //100.0;
b.toInt(); //200 直接去掉小数点后面
//在 `double` 和 `int` 中,定义了 `parse` 方法用于通过解析数据获得数字
int sz = int.parse("100")
double fd = double.parse("123.40");
//数字转字符串
String str1 = 100.toString();
String str2 = 100.02.toStringAsFixed(2); //四舍五入保留2位小数
//数字可以进行位操作
assert((3 << 1) == 6); // 0011 << 1 == 0110
assert((3 >> 1) == 1); // 0011 >> 1 == 0001
assert((3 | 4) == 7); // 0011 | 0100 == 0111
字符串
- 字符串可以用 单引号 或 双引 或 三引号 (三引号其中的字符串可以换行)
- 字符串常用操作
+ 字符串相加
* 返回一定倍数的字符串的组合
== 两个字符串是否相等
[] 取出指定位置的字符串
$ 字符串变量
- 常用属性
length 字符串的长度
isEmpty 是否为空
isNotEmpty 是否不为空
- 常用方法
contains() 是否包含指定内容
subString() 字符串截取
startsWith() 是否以某个指定字符串开始
endsWith() 是否以某个指定字符串结尾
indexOf() 查找指定内容在字符串第一次出现的位置,没有返回-1
lastIndexOf() 查找指定内容在字符串最后一次出现的位置,没有返回-1
toLowerCase() 转小写
toUpperCase() 转大写
trim() 去掉前后空格
trimLeft() 去掉左侧空格
trimRight() 去掉右侧空格
split() 以指定内容对字符串进行分割
replaceAll() 将A 替换成B
//字符串
String c = "test";
String d = 'TEST';
String e = ''' hellow
Dart
'''
// 字符串拼接
print("$c$d");
print(c + d);
print("$c" + d);
// 重复
String str1 = 'my name is';
print(str1 * 3); // 'my name ismy name ismy name is'
//取出指定字符
String str2 = 'zhangsan';
print(str2[1]); // h
// 单引号里面有单引号,必须在前面加反斜杠
String str3 = '单引号里面有单引号it\'s,必须在前面加反斜杠.';
//双引号里面嵌套单引号(正常使用)
String str4 = "双引号里面有单引号it's.";
//单引号里面嵌套双引号(正常使用)
String str5 = '单引号里面有双引号,"hello world"';
//双引号里面嵌套双引号,必须在前面加反斜杠
String str6 = "双引号里面有双引号,\"hello world\"";
bool布尔类型
布尔类型值只有 true 和 false
bool result = 123 > 110; //true
bool result1 = (1==1);//true
bool result2 = (1 == '1');//false
List类型
List list = [1,2,3,'adc',true];
List list2 = [];
list2.add(3); //添加元素
list2.addAll(list); //添加数组
list2.insert(1, 123); //插入元素
list2.remove(3); //删除元素
list2.removeAt(0); //删除某个位置元素
list2.removeLast(); // 删除最后一个元素
list2.clear(); //清空数组
removeRange() 删除指定区域的元素
removeWhere() 删除符合某个条件的全部元素
indexOf() 找出某个元素在数组中的索引位置,如果没有返回 -1
lastIndexOf() 找出某个元素在数组中最后一次出现的位置,如果没有返回-1
sort() 按照回调中return 结果正负数来排序
sublist() 返回指定区间的值
shuffle() 随机打乱数组中元素的顺序
first() 返回数组中的第一个元素
last() 返回数组中最后一个元素
asMap() 将数组转为Map类型,并把索引作为key,list中的值作为value
forEach() 循环
根据条件删除
var list = [22, 19, 1, 99, 6];
list.removeWhere((age)=> age>10 );
排序
ar list = [3, 2, 6, 4, 6];
list.sort(a, b){
return a - b ;
};
print(list); // [6, 6, 4, 3, 2]
数组插入多个元素
//插入多个元素
var list1 = [1,2,3];
var list2 = [0,...list1];
或者
var list2 = [0,...?list1];判空处理
通过for 或 if 来插入元素
var nav = [
"home",
"Furniture",
"lants",
if(promoActive) "outLet"
];
var lisInts = [1,2,3];
var listString = ['0', for(var i int listInts) i.toString];
或者
var listString = ['0', for(var i int listInts) '$i'];
Set / Map 类型
- Set 是无序的唯一项的集合。
var names = <String>{};
Set<String> names = {};
- Mpa 是存储健值对集合
常用属性方法
[index] 获取数组中指定位置上的元素,index 为索引
length 返回数组长度
keys 键
values 值
isEmpty 是否为空
isNotEmpty 是否不为空
containsKey 是否包含指定的 key
containsValue 是否包含指定的 value
remove 删除指定 key 的健值对
removeWhere 删除此映射中满足给定条件的所有元素
forEach 循环遍历
Map map = {'x':1, 'y':2, 'z':3}; //key 必须为字符串
Map map2 = {};
map2['x'] = 3;
map2['y'] = 5;
map2.remove('x');
print(map2.containsKey('x'));
print(map2.containsValue(4));
//根据条件删除
var map1 = {"first": "Dart", 'second': 'Java', 'third': 'Python'};
map1.removeWhere((key,value) => value.startsWith('P'));
print(map1) // {"first": "Dart", 'second': 'Java'};
枚举
enum Color{
red,
green,
blure
}
assert(Color.red.index == 0);
assert(Color.green.index == 1);
assert(Color.blue.index == 2);
特殊类型
Object: 是除了Null类型以外所有类型的超集Future和Stream:用于异步Iterable:用于for-in循环和同步的generator构造器
获取对象类型
var s = 'string'; var n = 987;
pring(s.runtimeType); // String
print(n.runtimeType); // int
常用操作符
类型判断 is
var str = "123";
if(str is String){
Print("是字符串");
}else{
Print("不是字符串");
}
非空调用和三目运算
a?.b 相当于 a == null ? null : a.b;
a??b 相当于 a == null ? b : a;
a??= b 相当于 a = (a == null) ? a:b;
类型转换
a as int 相当于Java 中的(int)a;
级联操作
对一个对象进行连续操作可以用..级联操作符
var Person person = Person();
person.name = "Json";
person.age = 18;
相当于
person
..name = "Json"
..age = 18;
数学运算 关系运算符 逻辑运算符
int a=5;
int b=4;
print(a+b); //加
print(a-b); //减
print(a*b); //乘
print(a/b); //除
print(a%b); //取余
print(a~/b); //取整
print(a==b); //是否相等
print(a!=b); //是否不相等
print(a>b); //是否大于
print(a<b); //是否小于
print(a>=b); //是否大于或者等于
print(a<=b); //是否小于或者等于
print(!b); //取反
print(b && a); //且
print(b || a); //或
运算符在前先计算,运算符在后则后计算
++ 加加
-- 减减
异常处理
抛异常
Dart 可以抛出空对象作为异常,而不仅仅是 Exception 或 Error.
throw FormatException('Expected at least 1 section');
throw 'Out of llamas!';
void distanceTo(Point other) => throw UnimplementedError();
try-on 来捕获某个特定异常,
try {
throw 'This a Exception!';
} on Exception catch(e) {
print('Unknown exception: $e');
} catch(e) { //可以处理任意类型
print('Unknown type: $e');
}
流程控制
条件表达
** if else**
var b = true;
if (b) {
print("true");
} else {
print("false");
}
switch case
var sex = "boy";
switch(sex){
case "boy" :
print("boy");
break;
case "girl":
print("girl");
break;
default:
print("传入的参数错误");
break;
}
);
循环
for循环
for (int i = 0; i < 5; i++) {
print(i);
}
while和do while
var i = 0;
while (i < 5) {
print(i);
i++;
}
do {
print(i);
i++;
} while (i < 5);
函数
Dart是一个面向对象的语言,函数本身也是一个对象,并且它的类型是 Function,所以函数可以被赋值为一个变量,或作为参数在函数间传递。
String getUserName() {
return "Json";
}
//只有一句话的函数可以用=>简写,省去{} 和 return
String getUserName()=> "Json";
参数可选函数
可选参数函数,分为命名可选参数 和 位置可选参数,但不能在同一个函数使用,都支持设置默认值。
- 命名可选
@required标记为必传参数
void main() {
hello(name: 'Tom');
}
void hello({@required String name='Jack', int age=18}) {
print('Hello, my name is $name, i'm $age years old.');
}
- 位置可选
void main() {
sayHello('Tom', 19);
}
void sayHello(String name, int age, [String hobby = "aa"]) {
var result = 'Hello, my name is $name, i'm $age years old';
if (hobby != null) {
result += ', my bobby is $hobby.';
}
print(result);
}
匿名函数
相当于OC 中的Block 或 swift 中的闭包
var loge = (msg)=> Logger.print(Logger.Error,msg);
main(){
loge("some errors");
}
Dart中List Map 本身就有一些匿名函数。
var list = ['a', 'b', "c"];
list.forEach((element) {
print(element);
});
Map map = {'x': 1, 'y': 2};
map.forEach((key, value) {
print(value);
});
自执行函数
不需要主动的调用该方法,当程序启动的时候会自动执行该段代码,跟匿名函数有点像,也可以带参。
格式:
((){
//这里输入代码内容
})();
((int i) {
print(i);
print("这是一段自执行代码!");
})(50);