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

 
   
   
 
  1. // Define a function.

  2. printInteger(int aNumber) {

  3. print('The number is $aNumber.'); // Print to console.

  4. }

  5. // This is where the app starts executing.

  6. main() {

  7. var number = 42; // Declare and initialize a variable.

  8. printInteger(number); // Call a function.

  9. }

通过以上简单的几句代码,我们可以看出很多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变量一旦赋值,类型便会确定,则不能再改变其类型,如:

 
   
   
 
  1. var t;

  2. t = "hi world";

  3. // 下面代码在dart中会报错,因为变量t的类型已经确定为String,

  4. // 类型一旦确定后则不能再更改其类型。

  5. 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的属性与方法, 否则编译器会报错。看下面代码就会理解了,

 
   
   
 
  1. void main() {

  2. var v = "ds";

  3. dynamic d = "ada";

  4. Object o = "adfs";

  5. print(v.length);//correct

  6. print(d.length);//correct

  7. print(o.length);//error, The getter 'length' isn't defined for the class 'Object'.

  8. v = 110;//error, 已经确定为String了,不能再赋值为int

  9. d = 120;//correct,可以用其他类型的值来赋值

  10. o = 120;//correct,可以用其他类型的值来赋值

  11. }

下面用表个整理一下var、dynamic和Object的对比,看起来dynamic更灵活一点,但是恰恰也是最不安全的,需要小心dynamic声明的变量的类型


赋值任何类型 中途修改类型 调用任何类型的方法
var 可以 不可以 可以
dynamic 可以 可以 可以
Object 可以 可以 只可以调用Object有的方法

3.final和const
如果您从未打算更改一个变量,那么使用 final 或 const,不是var,也不是一个类型。一个 final 变量只能被设置一次,两者区别在于:const 变量是一个编译时常量,final变量在第一次使用时被初始化。被final或者const修饰的变量,变量类型可以省略,如:

 
   
   
 
  1. //可以省略String这个类型声明

  2. final str = "hi world";

  3. //final String str = "hi world";

  4. const str1 = "hi world";

  5. //const String str1 = "hi world";

四、函数

Dart是一种真正的面向对象的语言,所以即使是函数也是对象,并且有一个类型Function。这意味着函数可以赋值给变量或作为参数传递给其他函数,这是函数式编程的典型特征。
1.函数声明

 
   
   
 
  1. int add(int a, int b) {

  2. return a + b;

  3. }

Dart函数声明如果没有显式声明返回值类型时会默认当做dynamic处理,注意,函数返回值没有类型推断

 
   
   
 
  1. //不指定返回类型,默认为dymanic,而不是int

  2. add(int a, int b) {

  3. return a + b;

  4. }

对于只包含一个表达式的函数,可以使用简写语法
int add(int a, int b) => a+b;
函数作为变量和作为参数传递

 
   
   
 
  1. void main() {

  2. var add = (int a, int b) => a+b;

  3. print(add(add(1,2),2));

  4. }

可选的位置参数

包装一组函数参数,用[]标记为可选的位置参数,不传递可选参数的值为null:

 
   
   
 
  1. String say(String from, String msg, [String device]) {

  2. var result = '$from says $msg';

  3. if (device != null) {

  4. result = '$result with a $device';

  5. }

  6. return result;

  7. }

下面是一个不带可选参数调用这个函数的例子:

 
   
   
 
  1. say('Bob', 'Howdy'); //结果是:Bob says Howdy

下面是用第三个参数调用这个函数的例子:

 
   
   
 
  1. say('Bob', 'Howdy', 'smoke signal'); //结果是:Bob says Howdy with a smoke signal

可选的命名参数

定义函数时,使用{param1, param2, …},用于指定命名参数。例如:

 
   
   
 
  1. //设置[bold]和[hidden]标志

  2. void enableFlags({bool bold, bool hidden}) {

  3. // ...

  4. }

调用函数时,可以使用指定命名参数。例如:paramName: value

 
   
   
 
  1. 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语言基础的主要内容,如果未能解决你的问题,请参考以下文章

Flutter学习笔记·初识Dart语言

快速学习Dart语言

Flutter入门篇

Flutter工程解析篇 + 工程代码部分解析记录

Flutter系列博文链接

Flutter必备语言Dart教程03 - 类,泛型