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