携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第十八天,点击查看活动详情
重学Flutter之----Dart基础知识总汇(一)
声明变量方式
在flutter中变量的声明有很多方式,不想Java语言只能显示声明,那么我们看看有哪些方法来声明吧
显示声明
就是在声明的时候实现告诉编译器,这个变量是什么类型:
main() {
String str = "hello world";
int age = 19;
User user = User();
}
var
相当于Kotlin中的var,他可以接受任何类型的变量,但是对var类型一旦赋值,就不能改变类型
main() {
var str = "hello world";
var age = 19;
str = age;//error
}
var声明变量后,Dart会在编译时会根据第一次赋值类型进行推断,编译结束后类型就被确定了。
Object
Object是Dart所有对象的基类,所有类都是Object的子类(包括Function和null),所以所有类都可以赋值给Object。后期也可以改类型。
main() {
Object str = "hello world";
str = 19;
}
dynamic
dynamic 是 Drat 语言中的 动态数据类型,通过 dynamic 关键字定义的变量,在编译时不会管定义的数据类型,运行时才处理变量的类型,根据变量赋值的类型推测当前的dynamic数据类型的运行时数据类型,dynamic 变量只有在运行时才知道数据类型;
main() {
dynamic d = "hello world";
// 打印 dynamic 变量的运行时类型
print(d.runtimeType);
// 打印 dynamic 变量值
print(d);
}
输出:
String
hello world
final和const
在Dart中声明常量的就需要使用final和const。和kotlin中相似。final变量只能被设置一次值,const变量是一个编译时常量。
main() {
//可以省略String这个类型声明
final str = "hello world";
const str1 = "hello world";
}
空安全(null-safety)
Dart和Kotlin一样都是有空指针安全,默认不为null,如果要定义可null类型需要用?来表明可null
main() {
int i = 999; //默认为不可空,必须在定义时初始化。
int? j; // 定义为可空类型,对于可空变量,我们在使用前必须判空。
// 如果我们预期变量不能为空,但在定义时不能确定其初始值,则可以加上late关键字,
// 表示会稍后初始化,但是在正式使用它之前必须得保证初始化过了,否则会报错
late int k;
k=999;
}
函数
在Dart中函数也是Object,并且有一个类型Function,也就意味着函数可以作为变量或者参数传递其他函数,这也是面向函数的典型特征
函数声明
int sum(int num1, int num2) {
return num1+num2;
}
Dart函数声明如果没有显式声明返回值类型时会默认当做dynamic处理
注意,函数返回值没有类型推断
//不指定返回类型,此时默认为dynamic,不是int
sum(int num1, int num2) {
return num1+num2;
}
对于只包含一个表达式的函数,可以使用简写语法:
sum(int num1, int num2) => num1+num2;
函数作为变量
var log = (str){
print(str);
};
log("hello world");
函数作为参数传递
void execute(var callback) {
callback();
}
main() {
execute(() => print("hello world"));
}
可选的位置参数
用[]来标记为可选的位置参数,并且需要放在函数的参数列表最后面
log(String msg, String msg2, [String? msg3]) {
var result = 'msg:$msg msg2: $msg2';
if (msg3 != null) {
result = '$result msg3:$msg3';
}
print("$result")
}
我们来看怎么调用:
//两个参数
log('hello','world')
//三个参数
log('hello','world','dart')
输出:
msg:hello msg2:world
msg:hello msg2:world msg3:dart
可选的命名参数
定义函数时,使用{param1, param2, …},放在参数列表的最后面,用于指定命名参数
log({String msg, String msg2}) {
var result = 'msg:$msg msg2: $msg2';
print("$result")
}
使用{}的时候,我们需要指定参数名
log(msg:"hello", msg2:"world"})
输出:
msg:hello msg2: world
注意,不能同时使用可选的位置参数和可选的命名参数