Flutter(一)Dart语言需要了解的事

571 阅读5分钟

前言

公司最近新开了一个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”:换行 插值:表达式使用expression,单个变量直接使用{expression} , 单个变量直接使用 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();
}