开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1 天,点击查看活动详情
背景简介
去年就开始着手准备学习Flutter,由于或这或那的原因,最后搁浅到今年。从开年到现在已经陆陆续续看了一些Flutter 学习相关的一些资料,在这里准备把自己学习的进程和一些自己的感受记录分享一下,主要目的是知识重温的同时能帮助到和我一样准备学习Flutter的jym。
正文: Dart 语法基础
1、var 变量声明
和 iOS的Swift语言类似, var 用于接收任何类型的变量,同时一旦赋值,类型便会确定,不能再改变其他类型。用法如下
var words = "hello word";
var length = 3;
等价于
String words = "hello word";
Int length = 3;
下面是直接确定变量类型,不需要系统推断。
2、final 和 const
有变量就有常量,在Flutter 中声明常量通常使用const 和 final,不同的是final 是在使用时被初始化,也就是final在声明后,可以不立即初始化,在被赋值后才会初始化,常被用于给Widget中上层变量值的接收者,这个后面再说。const则是在编译时就被替换为常量,这个和大多语言的表示相似。
final str = "hello word";
final num = 3;
const str = 'hello word';
const num = 3;
可以看到 final 和 const 也是可以接收任意类型的对象。
3、空安全(null-safety)
Dart 的空安全是在后面版本更新后才有的。那么什么是空安全,iOSer应该都比较清楚,比如定义一个对象,但是未对对象进行初始化,那么调用这个对象的时候,会Cashed。但是如果是对一些常用类型,比如int类型,在未被初始化调用时,系统会给一个默认值0,此外就是我们可以定义一个可能不存在的对象,如iOS中常用的nullable、_Nullable等表示该参数可为空。Dart也是同理,采用的方法类似于Swift 中的语法:
int i = 8;不为空
int? j;仅声明,但是未初始化,使用时需要判空
如果预期变量不为空,但是开始不能确定初始值,则使用late 关键字
late int k;
k = 9; 同理,也是需要在使用时确定是否被赋值。
同Swift 类似,有?表示不确定,也就有!表示对象已存在
int? i;
i = 8;
print(i!*8);
4、dynamic 和 Object
Object 是 Dart 所有对象的根基类,类似于iOS中的NSObject。也就意味着,Object 可以接受任何对象,和iOS中NSObject不同的是 Dart中还可以接受 Function,这个和Swift有些类似。
dynamic 和Object 相同的是可以接收任何类型的对象,且对象类型可以改变,不同的是,dynamic接收的对象是会动态的分析对应的类型,这点和var相似。
dynamic t;
Object c;
t = 'word';
c = 'hello';
print(t.length);可以运行
print(c.length);不可以运行
t = 100;可以修改
c = 10;可以修改
5、函数使用
和iOS相差不大
void loadMoreData(index){//这里的index 类型为dynamic
}
void loadMoreData(int index, String name){//确定类型则这样带
}
函数作为变量
var test = (str){
print(str);
}
test(str);
有没有很像iOS的block,哈哈。
函数作为参数
void test11(var callback){
callback("hello word");
}
test11(test);
当然,如果不确定参数是否存在则:
void test12(String? name){
}
如果是参数不确定,比如可能有多个参数,可能只有几个参数
void test13(int num, String? name,[String? address, int money]){
}
test13(12, "name");
test13(12, "name", "address");
test13(12, "name", "address", 55);
可以看到,可选参数是非必要参数,可以不填写
如果想要指定参数名称
void test14(String dd,{String? name, int? money}){
debugPrint("ssl name ${name ?? "ss"}, money ${money ?? 0}");
}
test14("ss",money: 88,name: "sss");
test14(name: "dd","dgg");
可以看到,指定名称的参数可以是无序的
先记录到这里,后续还有mixin 和 Future 在实战中再一起温习。。。