flutter学习--第2篇:Dart语言基础
Posted 去酒吧喝酸奶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flutter学习--第2篇:Dart语言基础相关的知识,希望对你有一定的参考价值。
一、谈谈Dart
dart是google发明的一门语言,可以运行于移动端、Server端、浏览器(前端)。
目前,程序主要有两种运行方式:静态编译与动态解释。静态编译的程序在执行前全部被翻译为机器码,通常将这种类型称为AOT (Ahead of time)即 “提前编译”;而解释执行的则是一句一句边翻译边运行,通常将这种类型称为JIT(Just-in-time)即“即时编译”。AOT程序的典型代表是用C/C++开发的应用,它们必须在执行前编译成机器码,而JIT的代表则非常多,如javascript、python等,事实上,所有脚本语言都支持JIT模式。而dart两种方式都支持,这一特性大大提高了我们的开发效率,可以在编码阶段使用JIT,在发布阶段使用AOT。
二、A basic Dart program
// Define a function.
printInteger(int aNumber) {
print('The number is $aNumber.'); // Print to console.
}
// This is where the app starts executing.
main() {
var number = 42; // Declare and initialize a variable.
printInteger(number); // Call a function.
}
通过以上简单的几句代码,我们可以看出很多Dart的用法
// This is a comment.
注释和oc是一样的,也可以多行注释
printInteger(int aNumber) { … }
函数的定义,和C语言很像,但是如果没有显示声明返回类型,默认为dynamic类型
int
整型,内置类型,其他的内置类型有(具体含义后面再说)
numbers
strings
booleans
lists (also known as arrays)
sets
maps
runes (for expressing Unicode characters in a string)
symbols
‘The number is $aNumber.’ or “…”
字符串可以用单引号或者双引号表示,要想在字符串中加入其他值,直接使用$varName or ${expression}
main()
主函数入口
var
类似于js的var,它可以接受任何类型的变量,但是一旦给它赋值,其类型便确定下来,不可更改。
printInteger(number);
函数调用,和C语言类似
至此,我们对dart语言应该有了一个大概的了解了。接下来我们更详细地研究。
三、变量声明
1. var
类似于JavaScript中的var,它可以接收任何类型的变量,但最大的不同是Dart中var变量一旦赋值,类型便会确定,则不能再改变其类型,如:
var t;
t = "hi world";
// 下面代码在dart中会报错,因为变量t的类型已经确定为String,
// 类型一旦确定后则不能再更改其类型。
t = 1000;
上面的代码在JavaScript是没有问题的,前端开发者需要注意一下,之所以有此差异是因为Dart本身是一个强类型语言,任何变量都是有确定类型的,在Dart中,当用var声明一个变量后,Dart在编译时会根据第一次赋值数据的类型来推断其类型,编译结束后其类型就已经被确定,而JavaScript是纯粹的弱类型脚本语言,var只是变量的声明方式而已。
2. dynamic和Object
dynamic 和var一样都是关键字,声明的变量都可以赋予任何类型的值,但是var一旦赋值,不可以再修改其类型,dynamic可以随时修改,Object是Dart所有对象的根基类,也就是说所有类型都是Object的子类(包括Function和Null),任何类型的数据都可以赋值给Object声明的变量,而且和dynamic一样,后期也可以修改(毕竟都是它的子类,随便赋值都不会错)。Object和dynamic的区别是,dynamic声明的对象编译器会提供所有可能的组合, 而Object声明的对象只能使用Object的属性与方法, 否则编译器会报错。看下面代码就会理解了,
void main() {
var v = "ds";
dynamic d = "ada";
Object o = "adfs";
print(v.length);//correct
print(d.length);//correct
print(o.length);//error, The getter 'length' isn't defined for the class 'Object'.
v = 110;//error, 已经确定为String了,不能再赋值为int
d = 120;//correct,可以用其他类型的值来赋值
o = 120;//correct,可以用其他类型的值来赋值
}
下面用表个整理一下var、dynamic和Object的对比,看起来dynamic更灵活一点,但是恰恰也是最不安全的,需要小心dynamic声明的变量的类型
赋值任何类型 | 中途修改类型 | 调用任何类型的方法 | |
---|---|---|---|
var | 可以 | 不可以 | 可以 |
dynamic | 可以 | 可以 | 可以 |
Object | 可以 | 可以 | 只可以调用Object有的方法 |
3.final和const
如果您从未打算更改一个变量,那么使用 final 或 const,不是var,也不是一个类型。一个 final 变量只能被设置一次,两者区别在于:const 变量是一个编译时常量,final变量在第一次使用时被初始化。被final或者const修饰的变量,变量类型可以省略,如:
//可以省略String这个类型声明
final str = "hi world";
//final String str = "hi world";
const str1 = "hi world";
//const String str1 = "hi world";
四、函数
Dart是一种真正的面向对象的语言,所以即使是函数也是对象,并且有一个类型Function。这意味着函数可以赋值给变量或作为参数传递给其他函数,这是函数式编程的典型特征。
1.函数声明
int add(int a, int b) {
return a + b;
}
Dart函数声明如果没有显式声明返回值类型时会默认当做dynamic处理,注意,函数返回值没有类型推断:
//不指定返回类型,默认为dymanic,而不是int
add(int a, int b) {
return a + b;
}
对于只包含一个表达式的函数,可以使用简写语法int add(int a, int b) => a+b;
函数作为变量和作为参数传递
void main() {
var add = (int a, int b) => a+b;
print(add(add(1,2),2));
}
可选的位置参数
包装一组函数参数,用[]标记为可选的位置参数,不传递可选参数的值为null:
String say(String from, String msg, [String device]) {
var result = '$from says $msg';
if (device != null) {
result = '$result with a $device';
}
return result;
}
下面是一个不带可选参数调用这个函数的例子:
say('Bob', 'Howdy'); //结果是:Bob says Howdy
下面是用第三个参数调用这个函数的例子:
say('Bob', 'Howdy', 'smoke signal'); //结果是:Bob says Howdy with a smoke signal
可选的命名参数
定义函数时,使用{param1, param2, …},用于指定命名参数。例如:
//设置[bold]和[hidden]标志
void enableFlags({bool bold, bool hidden}) {
// ...
}
调用函数时,可以使用指定命名参数。例如:paramName: value
enableFlags(bold: true, hidden: false);
可选命名参数在Flutter中使用非常多。
五、参考文献
1、Dart官网 https://dart.dev/guides/language/language-tour
2、https://book.flutterchina.club/chapter1/dart.html
以上是关于flutter学习--第2篇:Dart语言基础的主要内容,如果未能解决你的问题,请参考以下文章