Dart 语言优势
- Dart 中的所有东西都是对象,包括数字、函数等、他们都继承自 Object,并且对象的默认值都是 null (包括数字)。
- Dart 即可以支持 JIT(动态编译),也可以支持 AOT (静态编译)、
- Dart 是强类型语言,但是由于 Dart 可以推断类型,所以也可以支持动态类型,例如 var、dynamic
-
Dart 用法
// 导入库
import 'package:flutter/material.dart';
/** 入口函数 */
void main() => runApp(MyApp());
/** 定义一个 MyApp Widget */
class MyApp extends StatelessWidget {
var content = 'Dart 语法'; // 声明并初始化变量
String _name = ”by 小德“;
@override
Widget build(BuildContext context){
print(‘display $content’);
// return a Widget
return MaterialApp(
title: "Flutter Demo",
theme: ThemeData(
primaryColor: Colors.blue,
),
home: Scaffold (
appBar: AppBar(title: Text("Flutter Dart 语法")),
body: Text(content + _name)
),
);
}
}
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;
- var : 使用 var 来声明变量,不需要特别指定变量的数据类型,因为 Dart 会自动推断其数据类型,所以可以使用 var 来定义任何的变量。var 为什么能定义所有的变量。因为 Var 并不是直接存储值,而是存储的值的对象的引用,例如:var content = ' Dart 语法 '这句,是名字为 content 的 var 变量存储了值为 'Dart 语法' 的 String 对象的引用。所以 var 才能定义任何变量。
var content = ’Dart 语法‘; var switchOn = false; var current = 0;
- 明确的数据类型:就是在声明变量的时候,使用明确的数据类型。
String name = “by 小德”; int count = 0;
- dynamic 意思是数据类型是动态可变的,也可以定义任何变量,但是和var不同的是,var一旦赋值后,就不能改变数据类型了,例如以下用法就是错误的。但是 dynamic 就可以,dynamic 可以这么使用:
var content = ’Dart 语法‘; content = 1; // 错误的使用方法,content为String,不能赋值数字类型。
dynamic example = ‘example’; example = 1; // 这个使用方法正确,因为 dynamic 的类型是动态可变的。
- Object :Dart里所有的东西都是对象,是因为 Dart 的所有东西都继承自 Object,因此 Object 可以定义任何变量,而且赋值后,类型也可以更改。注意:请不要滥用 dynamic。一般情况下都可以使用 Object 代替 dynamic。那什么情况下使用 dynamic 呢?当这个变量没法用 Dart 的类型来表示时,比如 Native 和 Flutter 交互、从 Native 传来的数据,所以你会看到PlatformChannel 里有很多地方使用到了 dynamic。
Object index = 100; index = ’string‘; // 因为 ‘String’ 也是Object
- 变量: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 … }
- Dart 支持的数据类型
| 类型 | 含义 | 使用 |
| :---: | :---: | :---: |
| int | 整数,范围为 -2^63 到2^63 - 1 | int x = 1;没有小数点就是int |
| double | 浮点数,64位(双精度)浮点数 | double y = 1.1;有小数点就是浮点数 |
| num | num是数字类型,既可表示整数也可表示小数,具体看赋值字符串 | num x = 1;num x是整数<br /> |
| string | Dart字符串采用UTF-16编码,可以用单引号或双引号创建 | var s1 = 'string'; |
| bool | 布尔值 | var isTrue = true; |
| List | List <E>,E表示List里的数据类型,用中括号来赋值 | List<int> list = [1,2,3]; |
| Set | Set<E>,E表示Set里的数据类型,用大括号来赋值 | Set<String> halogens = {'fluorine','chlorine','bromine',
}; |
| Map | Map<K,V> K是Key的数据类型,V是Value的数据类型 | Map<String,String> gifts = {<br />'first':'partridge','second':'turtledoves','fifth':'golden rings'}; |
| Runes | 表示采用UTF-32的字符串,用于显示Unicode,因为Dart字符串是UTF-16,因此在Dart中表示32位的Unicode值需要Runes这个特殊语法 | Runes input = new<br />Runes('\\u{ 1f600}');<br />print(new String.fromCharCodes(input));<br />打印出来是笑脸emoji |
<a name="d4hS2"></a>
## 函数
在Dart 中函数也是对象,函数的类型是 Function。
<a name="HROst"></a>
### 写一个函数
函数按照如下的格式来写:
返回类型 函数名(函数参数){
}
这里写一个名字为 say 的函数:
bool say(String msg,String from,int clock){ print (msg + ‘from’ + from + ‘at’ + clock?.toString()); return true; }
- **函数的类型** **Function**,print(say is Function);打印结果为true,判断函数类型时,直接用的是函数的名字,也就是说函数的名字就像变量名一样可以直接拿来使用,当直接用函数名来使用的时候,就是一个对象,其类型是Function,要调用这个函数的话,就需要传入参数来使用,下面是使用函数的方法:say('Hello Flutter','XiaoDe',10);
- **函数的参数:必选参数和可选参数 **函数的参数分为两类,1、必选参数、2、可选参数。必选参数是必填的,可选参数是选填的,如何知道参数是必选的还是可选的呢?首先必选参数在前面,和普通参数定义一样,后面跟可选参数,可选参数需要用 { } 或者 【 】包起来,用不同的括号,可选参数的意义和用法也不一样。
- **必选参数:**必选参数就是使用平常的方法定义的函数参数,如下面的函数:say 函数有三个参数,msg、from、clock、这三个参数都是必选参数。必选参数必须在可选参数的前面
bool say(String msg,String from,int clock){ print(msg + ‘from’ + from + ‘at’ + clock?.toString()); return true; }
- **可选参数:**可选参数也分为两类:**可选命名参数:**使用 { } 包起来的参数是可选命名参数。**可选位置参数:**使用 [ ] 包起来的参数是可选位置参数。
- **可选命名参数:{ } **用 { } 包起来的参数是可选命名参数,前面讲数据类型的时候,使用 { } 来赋值的数据类型是 Map,所以可选的命名参数的类型也是 Map,因此调用函数时,可选参数的赋值必须是 paramName:value 这种 key:value 格式的,下面是可选命名参数的例子:这里参数 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); // 这个调用方式也是正确的 ```
- 可选位置参数【】,用【】包起来的参数是可选