重学Flutter之----Dart基础知识总汇(一)

152 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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

注意,不能同时使用可选的位置参数和可选的命名参数