学Flutter就和学iOS一样,先学基本语言语法的使用,再学习搭UI,iOS是OC和Swift,Flutter么就是Dart,语言学多了语法都差球不多,特别是这些新的语言,很多东西都是相似的,但是长时间不用容易忘记,与其每次去网上瞎jb找,不如自己总结一些,以后看自己写的东西就行了。文中个别结论是我自己总结出来的,不能保证准确性,看到的同学仅供参考。
距上次写文章也有一段时间了,本来打算去掘金重新开始的,因为感觉自己之前在简书写的这些东西技术含量太低了,后来因为简书把我保存的草稿莫名其妙丢失了,加上百度出来的答案还是以简书居多,决定还是待在这吧,虽然简书这个环境大不如从前了,但是现在写东西更多的是自己记录和梳理的一个过程,还没达到给别人指导的水平,和之前写的文章对比对比,也算是记录一段开发的心路历程。
本章提纲:
1.变量定义
2.基本数据类型
3.集合类型及其相关操作
main函数
1.Dart语言也需要有一个main函数作为入口,该函数接收一个List
类型的参数,目前不知道有啥用,后期知道了再补充吧,这个main
函数没有返回值。
main(List<String> args) {
print('Hello World');
}
变量定义
1.定义变量有两种方式,显示申明和类型推断,变量相互赋值的时候也会进行类型检查,int
和float
不能相互赋值,这个和Swift相似。
2.字符串用单引号和双引号都可以,字符串和其他变量或表达式拼接用${expression}
,如果表达式是一个标识符,那么{}可以省略,查看一个变量的具体类型用runtimeType
。
var name = 'tong';
print(name.runtimeType); // String
var a = 1;
print('num is $a');//num is 1
3.var
就是基本的申明一个变量,不多讲,dynamic
感觉和OC里的id修饰的变量一样,就是告诉编译器不做静态类型检查了,反正怎么用都行,但是在运行的时候如果类型不匹配就可能产生问题。
//显示声明变量
String name = 'tong';
int i = 1;
float = 1.0;
//类型推导声明变量,几个关键字后面再讲
var/dynamic/const/final name = xx;
4.const
和final
都是用来定义常量的,主要讲一下区别,const
修饰的变量值必须是在编译期间就确定的值,你不能赋给它一个运行期间才能得到的值,而final
可以。另外const
放在赋值语句的右边,可以共享对象,提高性能,这个后边再补充。
String getName() {
return 'tong';
}
main(List<String> args) {
const name = getName(); // 错误的做法, 因为要执行函数才能获取到值
final name = getName(); // 正确的做法
}
5.Dart 没有 public
、private
、protected
这些关键字,变量名以"_"开头意味着对它的 lib 是私有的。
基本数据类型
1.基本数据类型常用的就int
,double
,和NSInteger
和CGFloat
一样,他们可表示的精度范围是根据平台变化的。
2.字符串和数字之间的转换,有几个方法,直接上代码:
// 字符串和数字转化
// 1.字符串转数字
var one = int.parse('111');
var two = double.parse('12.22');
print('${one} ${one.runtimeType}'); // 111 int
print('${two} ${two.runtimeType}'); // 12.22 double
// 2.数字转字符串
var num1 = 123;
var num2 = 123.456;
var num1Str = num1.toString();
var num2Str = num2.toString();
var num2StrD = num2.toStringAsFixed(2); // 保留两位小数
print('${num1Str} ${num1Str.runtimeType}'); // 123 String
print('${num2Str} ${num2Str.runtimeType}'); // 123.456 String
print('${num2StrD} ${num2StrD.runtimeType}'); // 123.46 String
3.布尔类型true
和false
,不能用非0或者非空判断真假,if条件判断的时候必须使用布尔类型,这个和Swift一样。
枚举类型
枚举类型中有两个比较常见的属性:
index
:用于表示每个枚举常量的索引,从0开始。
values
:包含每个枚举值的List。
main(List<String> args) {
print(Colors.red.index);
print(Colors.green.index);
print(Colors.blue.index);
print(Colors.values);
}
enum Colors {
red,
green,
blue
}
集合类型
1.集合类型Dart内置三种List
/ Set
/ Map
,其中,List
可以这样来定义:
// List定义
// 1.使用类型推导定义
var letters = ['a', 'b', 'c', 'd'];
print('$letters ${letters.runtimeType}');//[a, b, c, d] List<String>
// 2.明确指定类型
List<int> numbers = [1, 2, 3, 4];
print('$numbers ${numbers.runtimeType}');//[1, 2, 3, 4] List<int>
Set
可以这样来定义:
其实,也就是把[]换成{}就好了。
Set
和List
最大的两个不同就是:Set
是无序的,并且元素是不重复的。
// Set的定义
// 1.使用类型推导定义
var lettersSet = {'a', 'b', 'c', 'd'};
print('$lettersSet ${lettersSet.runtimeType}');//{a, b, c, d} _CompactLinkedHashSet<String>
// 2.明确指定类型
Set<int> numbersSet = {1, 2, 3, 4};
print('$numbersSet ${numbersSet.runtimeType}');//{1, 2, 3, 4} _CompactLinkedHashSet<int>
最后,Map
是我们常说的字典类型,它的定义是这样的:
// Map的定义
// 1.使用类型推导定义
var infoMap1 = {'name': 'tong', 'age': 18};
print('$infoMap1 ${infoMap1.runtimeType}');//{name: tong, age: 18} _InternalLinkedHashMap<String, Object>
// 2.明确指定类型
Map<String, Object> infoMap2 = {'height': 1.88, 'address': '北京市'};
print('$infoMap2 ${infoMap2.runtimeType}');//{height: 1.88, address: 北京市} _InternalLinkedHashMap<String, Object>
集合操作
1.获取集合长度,用length
属性:
// 获取集合的长度
print(letters.length);
print(lettersSet.length);
print(infoMap1.length);
2.集合添加/删除/包含操作:
// 添加/删除/包含元素
numbers.add(5);//向List中添加数字5
numbersSet.add(5);//向Set中添加数字5
numbers.remove(1);//删除List中的数字1
numbersSet.remove(1);
// List根据index删除元素
numbers.removeAt(3);
print(numbers.contains(2));//判断List是否包含数字2
print(numbersSet.contains(2));
3.Map相关操作
var infoMap1 = {'name': 'tong', 'age': 18};
// Map的操作
// 1.根据key获取value
print('${infoMap1.entries} ${infoMap1.entries.runtimeType}'); // (MapEntry(name: tong), MapEntry(age: 18)) MappedIterable<String, MapEntry<String, Object>>
// 2.获取所有的entries
print(infoMap1.entries); // (MapEntry(name: tong), MapEntry(age: 18))
// 3.获取所有的keys
print('${infoMap1.keys} ${infoMap1.keys.runtimeType}'); // (name, age) _CompactIterable<String>
// 4.获取所有的values
print('${infoMap1.values} ${infoMap1.values.runtimeType}'); // (tong, 18) _CompactIterable<Object>
// 5.判断是否包含某个key或者value
print('${infoMap1.containsKey('age')} ${infoMap1.containsValue(18)}'); // true true
// 6.根据key删除元素
infoMap1.remove('age');
print('${infoMap1}'); // {name: tong}
网友评论