dart notes

变量定义与扩展

Dart数字变量定义

var a = 1;
num b = 1;
int c = 2; // 整型
double d = 3.4; // 浮点型

Dart字符串变量定义

var a = '456';
String b = '123';

Dart布尔值变量定义与扩展

var a = true;
bool b = false;

// 扩展
bool foo = true;
var str = '123';
if(foo) {
  // 可执行
}
if(str) {
  // 不执行
}
if(str == '123') {
  // 可执行
}
  • 如果单个变量作为条件进行判断时候,变量类型必须为布尔型,否则报错
  • 与JS相比,没有JS变量类型灵活多变,更受控

Dart列表变量定义

var list = [1, 2, 3];
List list1 = [4, 5, 6];

Dart对象变量定义

var map = {'a': 123, 'b': 456};
Map map1 = {'a': 123, 'b': 456};
  • 键名需要用引号,键名也可以是纯数字不含引号,区别于JS
  • Dart对象没有点方法,调用对象中某键值或者赋值,使用 Map['key']来实现

Dart函数定义与扩展

func() {
  // statement
}

func() => statement

// 扩展
func(int a, [bool b, String c: '123']) { // 必填参数:a,可选参数:b,可选默认参数:c
  // statement
}

变量申明

// var
// 申明动态类型变量
// 不能与静态类型申明同时出现
var a = '123';
var String a1 = 'abc'; // 错误申明方式

// dynamic
// 申明动态类型变量
// 不能与静态类型申明同时出现
dynamic b = 123;
dynamic String b1 = 'abc'; // 错误申明方式

// final
// 申明动态类型变量,赋值后不可变更
// 可以与静态类型申明同时出现
final c = true;
final bool c1 = false;

// const
// 申明动态类型变量,赋值后不可变更
// 可以与静态类型申明同时出现
const d = true;
const bool d1 = false;
  • var 和 dynamic 可以互换通用
  • final 和 const 可以互换通用
  • final 和 const 申明的列表或对象类型的Dart变量,内部元素值也不能做修改,不同于JS

操作符

对比 Dart 与 JS 操作符号

运算符 Dart JS 备注
赋值、加、减、乘、除、取余 = + - * / % = + - * / % 完全相同
向下取整 ~/ N/A
自增、自减 ++var var++ --var var-- ++var var++ --var var-- 完全相同
全等 == ===
抽象等于 N/A ==
不等 != !==
小于、小于等于、大于、大于等于 < <= > >= < <= > >= 完全相同
类型判断 is is! N/A

字符串属性与操作方法

属性
属性 描述
isEmpty 判断字符串是否为空字符串
isNotEmpty 判断字符串是否为非空字符串
length 获取字符串长度
方法
方法 描述
compareTo(String other) → int 将此对象与另一对象进行比较,小于本身1,相等0,大于本身-1,字符串比较
contains(Pattern other, [int startIndex = 0]) → bool 判断字符串中是否包含给定字符串或正则表达式,返回【boolean】
endsWith(String other) → bool 判断字符串是否以给定字符串结尾,返回【boolean】
indexOf(Pattern pattern, [int start]) → int 获取给定字符串在字符串中的第一个指针值
lastIndexOf(Pattern pattern, [int start]) → int 获取给定字符串在字符串中的最后一个指针值
padLeft(int width, [String padding = ' ']) → String 如果字符串自身长度小于width,在字符串左侧填补padding补足
padRight(int width, [String padding = ' ']) → String 如果字符串自身长度小于width,在字符串右侧填补padding补足
replaceAll(Pattern from, String replace) → String 全局替换内容,返回替换后字符串,不改变原字符串
replaceFirst(Pattern from, String to, [int startIndex = 0]) → String 替换字符串中第一个匹配内容,可指定匹配起始指针,返回新字符串,不改变原字符串
split(Pattern pattern) → List<String> 按照给定方式,将字符串拆分为列表,返回列表
splitMapJoin(Pattern pattern, {(Match) → String onMatch, (String) → String onNonMatch}) → String 同时替换匹配目标和不匹配目标,返回字符串
startsWith(Pattern pattern, [int index = 0]) → bool 判断字符串是否以给定字符串开头,返回【boolean】
substring(int startIndex, [int endIndex]) → String 返回此字符串的子字符串,[左闭右开),未指定结束指针默认为末尾指针
toLowerCase() 将此字符串中的所有字符转换为小写,不改变本身
toString() 返回此对象的字符串表示形式
toUpperCase() 将此字符串中的所有字符转换为大写,不改变本身
trim() 去除字符串首尾空格,不改变本身
trimLeft() 去除字符串首部空格,不改变本身
trimRight() 去除字符串尾部空格,不改变本身

示例

// padLeft
'abc'.padLeft(5, '_'); // __abc
'abc'.padLeft(1, '_'); // abc

// splitMapJoin
'ababab'.splitMapJoin('a', onMatch: (m) => 'c', onNonMatch: (n) => 'd'); // cdcdcd
'ababab'.splitMapJoin('a', onMatch: (m) => 'c', onNonMatch: (n) => n); // cbcbcb

数字属性与操作方法

属性
属性 描述
isFinite 判断数字是否为有限大小
isInfinite 判断数字是否为无穷大小
isNegative 判断数字是否为负数
sign 判断数字为正数、负数或零,返回 1,-1,0
isEven 判断数字为偶数
isOdd 判断数字为奇数
方法
方法 描述
abs() 取绝对值
ceil() 向上取整
ceilToDouble() 向上取整同时转为浮点型
clamp(num lowerLimit, num upperLimit) → num 数字在区间内,返回该数字;数字不在区间内,返回最接近该数字的边界值 lowerLimit || upperLimit
compareTo(num other) → int 比较数值两数值大小,返回 1,-1,0
floor() 向下取整
floorToDouble() 向下取整同时转为浮点型
round() 四舍五入
roundToDouble() 四舍五入同时转为浮点型
remainder(x) x表述除数,计算数值除以除数后得到的余数
toInt() 转为整型
toDouble() 转为浮点型
toString() 转为字符串
truncate() 舍去小数,截断功能

示例

// clamp
num number = 6,4;
number.clamp(5, 7); // 6.4
number.clamp(5, 6); // 6
number.clamp(7, 9); // 7

列表属性与操作方法

属性
属性 描述
first 返回列表中第一个元素
isEmpty 判断列表为空列表【boolean】
isNotEmpty 判断列表为非空列表【boolean】
length 列表长度
last 返回列表中最后一个元素
reversed 返回倒序列表
single 检查列表是否只用一个元素并返回该元素,否则报错[Too many elements]
方法
方法 描述
add(el) 在列表末尾添加单个元素
addAll([el1, el2, ...]) 在列表末尾添加多个元素
asMap() 将列表转换为对象,键名为原列表指针
any() 列表中是否有至少一个元素满足条件【boolean】,类同于contains()
clear() 清空列表,改变原列表
contains(el) 列表中是否包含某元素【boolean】,类同于any()
elementAt(index) 返回对应指针的元素值
every((E) → bool test) → bool 列表中是否每个元素都满足条件【boolean】
expand((el) => statement) 对列表中的每个元素进行扩展操作,返回可遍历对象(el1, el2, el3, ...)
fillRange(int start, int end, [int fillValue]) 指定指针区间单一元素填充,start 必填,end 必填,[左闭右开),fillValue 为单个 int 型变量
firstWhere((E) → bool test, {() → E orElse}) 返回列表中满足条件的第一个元素,不满足则返回-1
getRange(int start, int end) → Iterable<E> 获取指针区间内元素的可遍历对象,[左闭右开)
insert(int index, int value) 在列表指定指针位置插入单个int型元素
insertAll(int index, Iterable<int> iterable) 在列表指定指针位置插入int型元素列表
indexOf(el) → int 返回给定元素指针,不满足则返回-1
indexWhere((int) → bool test, [int start = 0]) 返回列表中满足条件的第一个元素的指针,可指定验证起始指针,默认从头开始,不满足则返回-1
join([String separator = ""]) 返回字符串,默认不分割,参照JS中join方法
lastIndexOf(int element, [int start]) 返回指定元素的指针值,可以给定起始查询指针,不满足则返回-1
lastIndexWhere((dynamic) → bool test, [int start]) → int 返回列表中满足条件的倒数第一个元素的指针,可指定起始指针,不满足则返回-1
lastWhere((E) → bool test, {() → E orElse}) → E 返回列表中满足条件的倒数第一个元素,否则报错
map<T>((E) → T f) → iterable<T> 遍历扩展每个列表中的元素,返回可遍历对象
removeAt(int index) → int 删除指定指针对应的元素值,返回被删除元素,更改原列表
remove(el) 删除指定元素值,返回【boolean】,更改原列表
removeLast() → int 删除列表最后一个元素,返回被删除元素值,更改原列表
removeRange(int start, int end) 删除列表指针区间内元素,无返回值,更改原列表
removeWhere((String) → bool test) → void 删除列表中满足判断条件的所有元素,无返回值,更改原列表
replaceRange(int start, int end, Iterable<int> replacement) 替换列表中给定指针区间内的元素,更改原列表
retainWhere((int) → bool test) → void 筛选出列表中满足条件的所有元素的列表,替代原列表,无返回值
setAll(int index, Iterable<int> iterable) → void 从指定指针开始替换列表元素,不能溢出,无返回值
setRange(int start, int end, Iterable<int> iterable, [int skipCount = 0]) → void 更改列表指定指针区间内的元素,无返回值
shuffle() → void 随机排序列表,无返回值
skip(int count) → Iterable<E> 跳过列表前count个元素,返回可遍历对象,非列表
sort([(int, int) → int compare]) → void 快速排序
sublist(int start, [int end]) → List<String> 从列表中截取起止指针区间内的元素,返回结果列表,[左闭右开)
take(int count) → Iterable<E> 截取列表前count个元素,并返回可遍历对象
takeWhile((E) → bool test) → Iterable<E> 从列表首个元素开始验证条件,返回可遍历对象,任一元素不符合条件,立即停止条件判断
toList() 列表化数据,可遍历对象转列表
toSet() 去重列表化数据
toString() 字符串话数据
where((E) → bool test) → Iterable<E> 筛选出满足条件的可遍历对象
whereType<T>() → Iterable<T> 筛选列表中某类型的所有元素,返回可遍历对象

示例:

// expand
List a = [1, 2, 3];
var b = a.expand((el) => [el, el + 1]);
var c = b.toList();
print(b); // (1, 2, 2, 3, 3, 4)
print(c); // [1, 2, 2, 3, 3, 4]

// fillRange
List list = [1, 2, 3];
list.fillRange(1, 2, 4); // [1, 4, 3]
list.fillRange(1, 3, 4); // [1, 4, 4]

// getRange
List foo = [1, 2, 3];
var res = foo.getRange(1, 3);
print(res); // (2, 3)

// lastIndexWhere
List liw = [4, 5, 6];
liw.lastIndexWhere((el) => el > 4); // 2
liw.lastIndexWhere((el) => el > 1, 1) // 1
liw.lastIndexWhere((el) => el > 1, 0) // -1

// lastWhere
List lw = [4, 5, 6];
lw.lastWhere((el) => el > 1); // 6

// map
var ls = [1, 2, 3];
var resls = ls.map((el) => el + 1);
var resls = ls.map((el) => el + 1).toList();
print(resls); // (1, 2, 3)

// replaceRange
List l = [1, 2, 3, 4, 5];
l.replaceRange(0, 2, [4, 5, 6]); // [4, 5, 6, 3, 4, 5]
l.replaceRange(0, 2, [4]); // [4, 3, 4, 5]
l.replaceRange(0, 2, []); // [3, 4, 5]

// retainWhere
var retainList = [1, 2, 3, 4];
retainList.retainWhere((el) => el > 2)
print(retainList); // [3, 4]

// setAll
var setList = [1, 2, 3];
setList.setAll(1, [4, 5]);
print(setList); // [1, 4, 5]
setList.setAll(1, [4, 5, 6]);
print(setList); // RangeError.checkValidRange

// setRange
List<int> list1 = [1, 2, 3, 4];
List<int> list2 = [5, 6, 7, 8, 9];
list1.setRange(1, 3, list2, 3);
print(list1); // [1, 8, 9, 4]
list1.setRange(1, 3, list2, 1);
print(list1); // [1, 6, 7, 4]
list1.setRange(1, 3, list2, 4);
print(list1); // Too few elements

// skip
List ls1 = [1, 2, 3, 4];
var iterable = ls1.skip(2);
var iterable1 = ls1.skip(2).toList();
print(iterable); // (3, 4)
print(iterable1); // [3, 4]

// sort
List<num> ls2 = [1, 2, 3, 4];
List<num> ls3 = [5, 6, 7];
ls2.sort((a, b) => b - a);
ls3.sort((a, b) => a - b);
print(ls2); // [4, 3, 2, 1]
print(ls3); // [5, 6, 7]

// takeWhile
List<int> list2 = [6, 5, 7, 8, 9];
var res1 = list2.takeWhile((el) => el > 5);
var res2 = list2.takeWhile((el) => el > 4);
var res1 = list2.takeWhile((el) => el > 6);
print(res1); // (6)
print(res2); // (6, 5, 7, 8, 9)
print(res3); // ()

// whereType
List list2 = [6, '5', 7, 8, 9];
var res = list2.whereType<String>();
print(res); // (5)

函数

函数定义

// 函数通常定义方式
func_name() {
  // func_body
}

// void 表示函数没有任何返回值
void func_name() {
  // func_body
}

函数调用

void main() {
  func()
}

func() {
  print('function')
}

函数返回值

return_type func_name() {
  return value;
}
  • return_type 为有效的数据类型
  • return 可选,未指定为 null
  • 函数实际返回值,必须与指定的 return_type 相一致
  • 单个函数只有一个返回值
void main() {
  print(func());
}

String func() {
  return 'abc';
}

函数可选参数,命名参数,默认参数

void main() {
func1(123);
func2(123);
func2(123,s1:'abc');
func2(123,s2:'abc',s1:'def');
func3(123);
}

void func1(n1,[s1]) {
print(n1);
print(s1);
}

void func2(n1,{s1,s2}) {
print(n1);
print(s1);
}

void func3(n1,{s1:12}) {
  print(n1);
  print(s1);
}
/**
123
null
123
null
123
abc
123
def
123
12
*/

字典(对象)

属性
属性 描述
keys 获取所有键名可遍历对象
values 获取所有键值可遍历对象
length 获取键值对数量
isEmpty 判断是否为空对象
isNotEmpty 判断是否为非空对象
方法
方法 描述
addAll() 末尾添加键值对
clear() 清空对象
containsKey(Object key) → bool 判断对象中是否包含某个键名
containsValue(Object value) → bool 判断对象中是否包含某个键值
forEach((k, v) => ...) 循环调用内部键值对方法
remove(key) 删除指定键值对,返回值为指定键值对应的值
removeWhere((dynamic, dynamic) → bool predicate) → void 删除满足条件的键值对
toString() 转换为字符串
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,084评论 1 32
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,072评论 0 3
  • 函数和对象 1、函数 1.1 函数概述 函数对于任何一门语言来说都是核心的概念。通过函数可以封装任意多条语句,而且...
    道无虚阅读 4,521评论 0 5
  • HTML 5 HTML5概述 因特网上的信息是以网页的形式展示给用户的,因此网页是网络信息传递的载体。网页文件是用...
    阿啊阿吖丁阅读 3,828评论 0 0
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,409评论 1 45