字符串的差异
- dart中字符串的表示方法有很多:
'Single quotes work well for string literals.'
"Single quotes work well for string literals."
'''Single quotes work well for string literals.
dsa'''
"""Single quotes work well for string literals.
dsa"""
- raw string,在前几种表示方式之前加上r即可。
r"Single quotes work well for string literals."
- 字符串拼接,跟js不同,+可有可无。比如 'test '"string" 和 'test ' + "string" 都是可以的。
- 使用变量, {name} 都可以,前一种方法的后面不能直接跟字符串,要用空格或者逗号等方式隔开
String name = 'hello';
print('$name string'); // hello string
print('${name} string'); // hello string
布尔值的转换
在js中,使用判断的时候空字符串,0,null,undefined都会被转换为false。
但是在dart中,判断条件就只能用bool值,如果是其他类型的数据,就会 抛出类型错误 。
List
dart中的List和js中的数组比较像,都可以使用..展开数组。
List list = [1, 2, 3];
List list2 = [0, ...list];
不同点:
- ...? 防止被扩展数组为null的时候程序报错
var list;
var list2 = [0, ...?list];
- 使用List<变量类型>声明后,该数据中就只能存放同种类型的数据,而不是随意混合
- 突然发现dart2.3以后支持在List中直接使用表达式了
- 判断语句
var nav = [
'Home',
'Furniture',
'Plants',
if (promoActive) 'Outlet'
];
- 循环语句
var listOfInts = [1, 2, 3];
var listOfStrings = [
'#0',
for (var i in listOfInts) '#$i'
];
Map和js中的对象
// var gifts = Map();
var gifts = {'first': 'partridge'};
gifts['second'] = 'partridge';
注意:
- 存取时都只能通过['键名']的方式访问值,而不能用.操作符,因为dart算是一个强类型语言, Map并不知道它本身有这个键 ,所以用.就会报错
- 定义时键名如果是字符串, 不能像js一样省略
在某种意义上来说, dart的类实例和js的对象也比较像 ,可以通过.操作符访问某个键的值,毕竟声明过了嘛,哈哈。
初学dart的前端可能经常分不清 Map和类实例 ,就觉得不都是对象嘛,怎么访问不到呢?这里教大家一个方法:使用 print(变量); 如果是Map,打印出来就类似js中的对象,而如果是类实例,打印出来就是 Instance of '类' 。
其实这种困惑主要发生在使用网络请求后,其实返回的不是List就是Map,要想使用.操作符的话,就需要自己转换类型了。json转model的话可以看看这个
函数
dart函数的参数分为 positional parameters(位置参数) 和 named parameters(命名参数)。
// positional parameters(位置参数,默认必传)
bool isNoble(int atomicNumber) {
return atomicNumber != null;
}
// named parameters(命名参数,默认可选)
bool isNoble({ int atomicNumber }) {
return atomicNumber != null;
}
调用
// positional parameters(位置参数)
isNoble(1);
// named parameters(命名参数)
isNoble(atomicNumber: 1);
参数可选和必填:
// positional parameters(位置参数,默认必传,用[]表示可选)
bool isNoble([int atomicNumber]) {
return atomicNumber != null;
}
// named parameters(命名参数,默认可选,使用@required表示必传)
bool isNoble({ @required int atomicNumber }) {
return atomicNumber != null;
}
要使用required注解的话,还需要引入 package:meta/meta.dart ,否则会报错的。在flutter中, package:flutter/material.dart 已经默认引入了,所以才可以直接使用。
类
这个的话其实也没什么好多的了,
- 在定义时访问实例的方法和参数时,不需要加上this
- 构造函数中使用this.参数可以直接赋值
class User {
String name;
// 位置参数
User(this.name);
// 相当于 User([name]): this.name = name;
// 命名参数的形式
// User({this.name});
}
网友评论