首先贴下文档地址:
https://book.flutterchina.club/chapter1/dart.html
一:变量声明
1.1Variables
var 可以接收任意类型的变量,但是无法改变变量类型。如:
1
2
3
4
5 1var name = 'Bob';
2
3执行下面这个赋值时会报错
4name=100;
5
2:dynamic和Object
所有能够使用变量引用的都是对象, 每个对象都是一个类的实例。在 Dart 中 甚至连 数字、方法和 null 都是对象。所有的对象都继承于Oject类。
dynamic声明的变量可以赋值任意对象。
1
2
3
4
5 1 dynamic t= "hello world";
2 Object x= 'Hello world';
3 t = 1;
4 x = 1;
5
3:Final and const
final 变量只能赋值一次;const 为编译时变量。
1
2
3
4
5
6
7 1final string name ='';
2const string avatar='';
3
4final 和const 修饰的变量可省略变量类型,即
5final name ='';
6const avatar='';
7
4:Numbers(数值)
num 下有两种数值类型int和double 。
num 类型定义了基本的操作符,例如 +, -, /, 和 *, 还定义了 abs()、 ceil()、和 floor() 等 函数。
int 类型支持位移操作。
1
2
3 1assert((3 << 1) == 6); // 0011 << 1 == 0110
2assert((3 >> 1) == 1); // 0011 >> 1 == 0001
3
assert (断言)如果条件表达式结果不满足需要,则可以使用 assert 语句俩打断代码的执行、
5:string 字符串
Dart 字符串是 UTF-16 编码的字符序列。 可以使用单引号或者双引号来创建字符串:
1
2
3 1var name ='max';
2var avatar="xxx";
3
string 可通过‘+’ 连接,也可以直接去掉。
1
2
3 1var avatar ='http'+'://'+'www.baidu.com';
2var user='my' 'name' 'is';
3
可以在字符串中使用表达式 ${expression}。
1
2
3
4
5 1var name ='max';
2
3assert("my name is $name"=="my name is max");
4== 操作符判断两个对象的内容是否一样。 如果两个字符串包含一样的字符编码序列, 则他们是相等的。
5
6:Lists(列表)
1
2 1var list = [1, 2, 3];
2
在 list 字面量之前添加 const 关键字,可以 定义一个不变的 list 对象(编译时常量):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 1const list = const [1, 2, 3];
2list[1] = 1;
3
4I/flutter ( 1826): The following UnsupportedError was thrown while handling a gesture:
5I/flutter ( 1826): Unsupported operation: Cannot modify an unmodifiable list
6I/flutter ( 1826): When the exception was thrown, this was the stack:
7I/flutter ( 1826): #0 UnmodifiableListBase.[]= (dart:_internal/list.dart:90:5)
8I/flutter ( 1826): #1 _MyHomePageState._incrementCounter.<anonymous closure> (package:flutter_dart_demo/main.dart:60:11)
9I/flutter ( 1826): #2 State.setState (package:flutter/src/widgets/framework.dart:1130:30)
10I/flutter ( 1826): #3 _MyHomePageState._incrementCounter (package:flutter_dart_demo/main.dart:51:5)
11I/flutter ( 1826): #4 _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:507:14)
12I/flutter ( 1826): #5 _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:562:30)
13I/flutter ( 1826): #6 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:102:24)
14I/flutter ( 1826): #7 TapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:242:9)
15I/flutter ( 1826): #8 TapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:204:7)
16I/flutter ( 1826): #9 GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:156:27)
17I/flutter ( 1826): #10 _WidgetsFlutterBinding&BindingBase&GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:184:20)
18I/flutter ( 1826): #11 _WidgetsFlutterBinding&BindingBase&GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:158:22)
19I/flutter ( 1826): #12 _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:138:7)
20I/flutter ( 1826): #13 _WidgetsFlutterBinding&BindingBase&GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:101:7)
21I/flutter ( 1826): #14 _WidgetsFlutterBinding&BindingBase&GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:85:7)
22I/flutter ( 1826): #15 _invoke1 (dart:ui/hooks.dart:168:13)
23I/flutter ( 1826): #16 _dispatchPointerDataPacket (dart:ui/hooks.dart:122:5)
24
25
二:函数
方法可以赋值给变量,也可以当做其他方法的参数。 也可以把 Dart 类的实例当做方法来调用。
2.1函数定义
1
2
3
4 1bool isNoble(int atomicNumber) {
2 return _nobleGases[atomicNumber] != null;
3}
4
当然还可以忽略返回类型,但是不指定返回类型后,dart语言默认为dynamic,就不是bool类型。
1
2
3
4
5 1//不指定返回类型,此时默认为dynamic,不是bool
2isNoble(int atomicNumber) {
3 return _nobleGases[atomicNumber] != null;
4}
5
2.2 缩写语法
对于只包含一个表达式的函数,可以使用简写语法
1
2 1bool isNoble (int atomicNumber )=> _nobleGases [ atomicNumber ] != null ;
2
在箭头 (=>) 和冒号 (;) 之间只能使用一个 表达式 – 不能使用 语句。 例如:你不能使用if statement,但是可以 使用条件表达式
2.3Optional parameters可选参数
可选参数只能在任何必需的参数之后声明。
可选参数可以有一个默认值,当默认值在调用者没有指定值时使用。
可选参数分为可选位置参数和可选命名参数。
2.3.1可选命名参数
在定义方法的时候,使用 {param1, param2, …} 的形式来指定命名参数:
1
2
3
4 1getHttpUrl({String server,int port}) {
2 // ...
3}
4
调用方法的时候,你可以使用这种形式 paramName: value 来指定命名参数。例如:
1
2 1getHttpUrl(server:"example.com",port:8080);
2
2.3.2可选位置参数
把一些方法的参数放到 [] 中就变成可选 位置参数了:
1
2
3
4 1getHttpUrl(string server,string path,[int port=8080]) {
2 // ...
3}
4
调用时有两种方式:
第一种是不带位置参数的:
1
2 1getHttpUrl("example.com","/user");//port 为8080
2
第二种是带位置参数的:
1
2 1getHttpUrl("example.com","/user",8081);
2
2.4方法作为参数
可以把方法当做参数调用另外一个方法。例如:
1
2
3
4
5
6
7
8 1myPrint(element) {
2 print(element);
3}
4
5var list = [1, 2, 3];
6
7list.forEach(myPrint);
8
还可以把方法赋值给变量如:
1
2
3
4
5
6
7 1//定义变量
2var myPrint= (str){
3 print(str);
4};
5
6myPrint("hi world");
7
2.5匿名方法
匿名方法又叫lambda或者closure 闭包。
* *定义:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 1([[Type] param1[, …]]) {
2 codeBlock;
3};
4
5可赋值给变量,通过变量进行调用
6
7可在其他方法中直接调用或传递给其他方法
8如:
9
10var func = (str) {
11 print("Hello-------$str");
12 };
13
14func("zh");
15
16
17var list = ['h', 'l', 'l', 'e', 'o'];
18list.forEach((i) {
19 print(list.indexOf(i).toString() + ': ' + i);
20});
21