Dart 语言优势

  • Dart 中的所有东西都是对象,包括数字、函数等、他们都继承自 Object,并且对象的默认值都是 null (包括数字)。
  • Dart 即可以支持 JIT(动态编译),也可以支持 AOT (静态编译)、
  • Dart 是强类型语言,但是由于 Dart 可以推断类型,所以也可以支持动态类型,例如 var、dynamic
  • Dart 有强大的异步编程能力。

    Dart 用法

    1. // 导入库
    2. import 'package:flutter/material.dart';
    3. /** 入口函数 */
    4. void main() => runApp(MyApp());
    5. /** 定义一个 MyApp Widget */
    6. class MyApp extends StatelessWidget {
    7. var content = 'Dart 语法'; // 声明并初始化变量
    8. String _name = by 小德“;
    9. @override
    10. Widget buildBuildContext context){
    11. print(‘display $content’);
    12. // return a Widget
    13. return MaterialApp(
    14. title: "Flutter Demo",
    15. theme: ThemeData(
    16. primaryColor: Colors.blue,
    17. ),
    18. home: Scaffold (
    19. appBar: AppBar(title: Text("Flutter Dart 语法")),
    20. body: Text(content + _name)
    21. ),
    22. );
    23. }
    24. }
  • import 导入库

  • 注释 有两种:/ .. /多行注释,// 单行注释
  • => Dart 的箭头语法,即 Lambda 表达式。
  • class Dart的类
  • extends 继承
  • var 一种声明变量而不指定其类型的方法。
  • 以下划线 开头的类或成员变量时私有的 Dart 没有 Public、Protected、Private 的关键字,在 Dart 里,类或成员变量默认都是 Public 的,以下划线 开头的就是私有的,例如成员变量 _name 就是私有的。
  • String 在声明变量时也可以指定具体类型,String 是字符串,还有其他的数据类型:int、double等 。
  • ‘ … ‘ 或 “ … “ 字符串的使用,用单引号或双引号都行。
  • $variableName 或 ${ expression } 字符串插值:将变量的值直接插入字符串中

    变量声明

    总共有四种: ``` var content = ‘Dart 语法’; var switchOn = false; var current = 0;

String name = ”by 小德“; int count = 0;

dynamic example = ’example‘; Object index = 100;

  1. - var : 使用 var 来声明变量,不需要特别指定变量的数据类型,因为 Dart 会自动推断其数据类型,所以可以使用 var 来定义任何的变量。var 为什么能定义所有的变量。因为 Var 并不是直接存储值,而是存储的值的对象的引用,例如:var content = ' Dart 语法 '这句,是名字为 content var 变量存储了值为 'Dart 语法' String 对象的引用。所以 var 才能定义任何变量。

var content = ’Dart 语法‘; var switchOn = false; var current = 0;

  1. - 明确的数据类型:就是在声明变量的时候,使用明确的数据类型。

String name = “by 小德”; int count = 0;

  1. - dynamic 意思是数据类型是动态可变的,也可以定义任何变量,但是和var不同的是,var一旦赋值后,就不能改变数据类型了,例如以下用法就是错误的。但是 dynamic 就可以,dynamic 可以这么使用:

var content = ’Dart 语法‘; content = 1; // 错误的使用方法,content为String,不能赋值数字类型。

dynamic example = ‘example’; example = 1; // 这个使用方法正确,因为 dynamic 的类型是动态可变的。

  1. - Object Dart里所有的东西都是对象,是因为 Dart 的所有东西都继承自 Object,因此 Object 可以定义任何变量,而且赋值后,类型也可以更改。注意:请不要滥用 dynamic。一般情况下都可以使用 Object 代替 dynamic。那什么情况下使用 dynamic 呢?当这个变量没法用 Dart 的类型来表示时,比如 Native Flutter 交互、从 Native 传来的数据,所以你会看到PlatformChannel 里有很多地方使用到了 dynamic

Object index = 100; index = ’string‘; // 因为 ‘String’ 也是Object

  1. - 变量:final const:如果你不想更改变量的值,那么你可以用 final const 使用时有以下几点:使用 final const的时候可以把 var 省略,final const 变量只能赋值一次,而且只能在声明的时候就赋值。const 是隐式的 final<br />在使用 const 的时候,如果变量时类里的变量,必须加 static,是全局变量时不需要加,那么 final const 有什么区别呢?const 是编译时常量,在编译的时候就初始化了,但是 final 变量是当类创建的时候才初始化。

import ‘package: flutter/material.dart’; const demoConst = ’demo‘; .// 这里不用加 static void main() => runApp(MyApp()); class MyApp extends StatelessWidget { static content = ‘Dart 语法’; // 这里必须加 static … }

  1. - Dart 支持的数据类型
  2. | 类型 | 含义 | 使用 |
  3. | :---: | :---: | :---: |
  4. | int | 整数,范围为 -2^63 2^63 - 1 | int x = 1;没有小数点就是int |
  5. | double | 浮点数,64位(双精度)浮点数 | double y = 1.1;有小数点就是浮点数 |
  6. | num | num是数字类型,既可表示整数也可表示小数,具体看赋值字符串 | num x = 1num x是整数<br /> |
  7. | string | Dart字符串采用UTF-16编码,可以用单引号或双引号创建 | var s1 = 'string' |
  8. | bool | 布尔值 | var isTrue = true |
  9. | List | List <E>,E表示List里的数据类型,用中括号来赋值 | List<int> list = [123]; |
  10. | Set | Set<E>,E表示Set里的数据类型,用大括号来赋值 | Set<String> halogens = {'fluorine''chlorine''bromine'
  11. }; |
  12. | Map | Map<K,V> KKey的数据类型,VValue的数据类型 | Map<StringString> gifts = {<br />'first''partridge''second''turtledoves''fifth''golden rings'}; |
  13. | Runes | 表示采用UTF-32的字符串,用于显示Unicode,因为Dart字符串是UTF-16,因此在Dart中表示32位的Unicode值需要Runes这个特殊语法 | Runes input = new<br />Runes'\\u{ 1f600}');<br />printnew String.fromCharCodes(input));<br />打印出来是笑脸emoji |
  14. <a name="d4hS2"></a>
  15. ## 函数
  16. Dart 中函数也是对象,函数的类型是 Function
  17. <a name="HROst"></a>
  18. ### 写一个函数
  19. 函数按照如下的格式来写:

返回类型 函数名(函数参数){

}

  1. 这里写一个名字为 say 的函数:

bool say(String msg,String from,int clock){ print (msg + ‘from’ + from + ‘at’ + clock?.toString()); return true; }

  1. - **函数的类型** **Function**,printsay is Function);打印结果为true,判断函数类型时,直接用的是函数的名字,也就是说函数的名字就像变量名一样可以直接拿来使用,当直接用函数名来使用的时候,就是一个对象,其类型是Function,要调用这个函数的话,就需要传入参数来使用,下面是使用函数的方法:say'Hello Flutter''XiaoDe'10);
  2. - **函数的参数:必选参数和可选参数 **函数的参数分为两类,1、必选参数、2、可选参数。必选参数是必填的,可选参数是选填的,如何知道参数是必选的还是可选的呢?首先必选参数在前面,和普通参数定义一样,后面跟可选参数,可选参数需要用 { } 或者 】包起来,用不同的括号,可选参数的意义和用法也不一样。
  3. - **必选参数:**必选参数就是使用平常的方法定义的函数参数,如下面的函数:say 函数有三个参数,msgfromclock、这三个参数都是必选参数。必选参数必须在可选参数的前面

bool say(String msg,String from,int clock){ print(msg + ‘from’ + from + ‘at’ + clock?.toString()); return true; }

  1. - **可选参数:**可选参数也分为两类:**可选命名参数:**使用 { } 包起来的参数是可选命名参数。**可选位置参数:**使用 [ ] 包起来的参数是可选位置参数。
  2. - **可选命名参数:{ } **用 { } 包起来的参数是可选命名参数,前面讲数据类型的时候,使用 { } 来赋值的数据类型是 Map,所以可选的命名参数的类型也是 Map,因此调用函数时,可选参数的赋值必须是 paramNamevalue 这种 keyvalue 格式的,下面是可选命名参数的例子:这里参数 from 就是可选命名参数,要调用say 函数,方法如下:同时还可以给命名参数加 @required,意思是这个也是必填参数。例子如下:

bool say(String msg,{String from,int clock}){ print(msg + “from” + from + “at” + clock.toString()); return true; }

要调用say函数,方法如下: say (‘Hello Flutter’); // 因为 from 和 clock 是可选参数,所以可以不填 say(’Hello Flutter’,from:’XiaoMing’); // 对用命名参数格式 paramName:value 为 from 赋值。 say (‘Hello Flutter’,clock: 11);// say (‘Hello Flutter’,from: ‘XiaoMing’,clock: 11); //

给命名参数加 @required,意思是这个也是必填参数 bool say(String msg , {@required String from, int clock}) { print (msg + ‘from’ + from + ‘at’ + clock.toString()); return true; }

要调用say函数方法,方法如下: say (‘Hello Flutter’); // 错误调用方式,因为from是必选参数,不填的话会报错。 say (‘Hello Flutter’,from: ‘XiaoMing’); // 正确调用方式 say (‘Hello Flutter’,from: ‘XiaoMing’,clock: 11); // 这个调用方式也是正确的 ```

  • 可选位置参数【】,用【】包起来的参数是可选