Dart 语法基础

185 阅读5分钟

老菜鸟的Flutter 之旅

  1. Dart语言在线编辑器

  2. 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

数据类型

数值类型

  • 数值主要类型: int double 通用类型 num 可指代 intdouble,
  • 数值型操作:

+ 加 - 减 * 乘 / 除 % 求余 ~/ 取整

  • 数值型常用属性

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);