前言
公司最近新开了一个Flutter项目,项目组分给了几个几乎无flutter经验的人,我距离上次flutter开发已经有一年时间了,也忘了差不多,项目开始磕磕绊绊,到现在趋于稳定,这里整理一些flutter相关以及开发过程中遇到的坑,主要用作记录。 Flutter的开发语言为Dart,Dart是一门面向对象的语言,语法上来看像是Java和Js的混合体,语法上有点大杂烩的意思,本篇不做过多拓展,只留下些常用的可以日后作为字典来查看。
常用数据类型
(一)数字 Number
有num,int,double三种,num是int和double的父类,即num可以被赋值成int或double类型。 num a = 10; a = 20; a = 20.3; 复制代码 常用方法:
isNaN :是否是非数字
isEven:是否是偶数
isOdd:是否是奇数
abs():绝对值
round():四舍五入
floor():向下取整
ceil():向上取整
toInt():转成整型
toDouble:转成浮点型
/:除完再取整 eg: 5/2 = 2
(二)字符串 String
字符串类型同Java相差不多,使用' '或者“” “”定义字符串,这里主要介绍下字符串相关操作。 String str1 = ' ' ; String str2 = '' ''; String str2 = ''' '''; double price = 30.0; print('价格为$price'); 复制代码 字符串操作:
”\n”:换行 插值:表达式使用variable
常用属性: length ,isEmpty,isNotEmpty ,注:声明为空双引号的字符串‘’‘’长度大于0,且为isNotEmpty 常用方法:
contains():是否包含某个字符串 substring(startIndex,endIndex): 截取一段字符串 startsWith():是否以某个字符串开头 endsWith():是否以某个字符串结尾 indexOf():某个字符串的下标 lastIndexOf():最后一次出现某个字符串的下标 toLowerCase():转为小写 toUpperCase():转为大写 trim():清除空格 split():分割字符串 ”replace(),replaceAll(‘old’,’new‘)“替换字符串。
(三)布尔型
使用bool声明布尔值,布尔值只有false和true。 bool isShow = true; 复制代码
(四)List与数组
var list = [ 1,2,3]
List list = List();
取值 : 类似Java里list.get(index) ,Dart里为list[index]
常用方法:
- list.add(‘str’) :添加一个元素
- list.remove('str'): 移除一个元素
- list.insert(1,'str'):在指定位置添加一个元素
- list.indexOf('str'):获取元素所在位置
- list.sublist(2): 移除前两个元素,并返回一个新的List
- list.every((元素) => 条件): 所有元素符合条件,返回true,否则false. eg:list.every((element) => element<5)
- list.any((元素) => 条件):只要有一个元素符合条件,返回true,否则false
- list -> map: list.asMap() eg: list [1, 1, 1, 1, 1] map{0: 1, 1: 1, 2: 1, 3: 1, 4: 1}
(五)Map
Map以key-value(键值对)的形式存储,key和value可以是任意类型的对象,每个key只可以出现一次。
Map map = {
"key": "value",
"age": age,
};
// 添加属性
map.addAll({
"width": 90,
"height": 180,
});
// 移除属性
map.remove("key");
// 是否包含某个值
map.containsValue("key");
// 是否包含某个key
map.containsKey("key");
常量:final和const 及区别
Dart里的常量使用const和final来声明。
final price = 20;
const price = 20;
final和const区别:const变量是一个编译时常量,final变量在第一次使用时被初始化(const是隐式的final),实例变量可以是final,但不能是const。常量如果是类级别的,可以使用static const。例如:static const PI = 3.14。
注意:
dart语言在操作变量上与Java和kotlin比较接近,声明变量有以下方式:
var str = 'stringValue';
String str = 'stringValue';
dynamic str = 'stringValue';
建议使用第二种方式声明变量,指定变量类型,可加快运行速度。
函数
(一)函数声明及参数
- 不带返回值:
void getData(){}
//调用:
xx.getData();
- 带返回值:
void getData(int id){}
//调用
xx.getData(1);
- 可选参数:使用{param,param2,...}指定命名参数
void getData({int count , int id}){}
//调用
xx.getData();
xx.getData(count: 1);
xx.getData(count: 1,id:12345);
- 必传参数:声明参数使用@required,有利于编译器检查。
void getData({@required int count , int id}){}
//调用
xx.getData(count: 1);
xx.getData(count: 1,id:12345);
- 默认参数:
void getData({int count = 1 , int id = 2}){}
//调用
xx.getData(); //不传值进来,方法体内参数为默认值
xx.getData(count: 1);
xx.getData(count: 1,id:12345);
(二)函数作为参数
前面提到过Dart是面向对象的,所以函数也可以是对象,这点在Kotlin中也有所体现。
void getData(int id) {
print(id.toString);
}
main() {
var list = [123456, 211111, 3111111];
list.forEach(getData); //forEach方法的参数为一个泛型方法体
}
直观一点:
int getMainParams(int x,int y){
return x+y;
}
int getOtherParams(int x,int y){
return x/y;
}
int getData(Function(int,int) function){
function(1,1)
}
void main(){
var mainData = getData(getMainParams);
var otherData = getData(getOtherParams);
}
函数作为参数传递的设计有点Java中多态的味道,注意函数传递时,只需要传递函数名称即可,不需要加函数后的括号。
常用操作符
- 类型判断:判断是否属于同一类型
如:is 相当于 Java 中的 instanceof
- 整除
如:a ~/ b 等价于 (a /b) as int
- 非空调用
如:a?.b 相当于 a == null ? null : a.b
- 三目运算
如:a??b 相当于 a == null ? b : a
- 三目赋值运算
如:a ??= b 相当于 a = a == null ? b : a
- 类型转换
如:a as int 相当于 Java 中的 (int) a
- 级联操作符
级联操作符用.. 来表示,主要用来对一个对象进行连续操作,有点类似 kotlin 中的 apply 和 let,如:
CalendarController controller = CalendarController();
controller.setData();
等价于:
CalendarController controller = CalendarController()..setData();
循环及条件表达式
(一) 循环
- for循环:
void main() {
var list1 = [1,2,3,4,5,6,7,8,9,10];
for(int index = 0; index < list1.length; index ++){
print(list1[index]);
}
}
- foreach形式:
void main(){
var list = [1,2,3];
for (var item in list){
if(item != 2){
print(item);//1 3
}
}
}
- while循环:
void main() {
int a = 0;
while(a < 5){
print(a++);
}
}
- do... while...:
void main(){
var b = 1;
do{
print(b++);
}while(b > 0 && b < 5);
}
(二) 终止循环
- break 和 continue:
// break 终止循环
void main(){
var list = [1,2,3];
for (var item in list){
if(item == 3){
break;
}
print(item);
}
}
// 1 2
- assert: 如果布尔条件为false,则使用assert语句来中断正常执行。
void main() {
var a = 1;
assert(a != 3);
print(a);//1
}
void main() {
var a = 1;
assert(a != 1);
print(a);//没有执行
}
- continue: 跳出当前循环 继续循环
void main(){
var list = [1,2,3,4,5,6];
for (var item in list){
if(item == 2){
continue;
}
print(item);
}
}
- switch...case:
var command = 'OPEN';
switch (command) {
case 'CLOSED':
executeClosed();
break;
case 'PENDING':
executePending();
break;
case 'APPROVED':
executeApproved();
break;
case 'DENIED':
executeDenied();
break;
case 'OPEN':
executeOpen();
break;
default://默认情况
executeUnknown();
}