为了学 Flutter 入门了一下 Dart,长得还挺像 ES6 的(既然如此那你为什么没有函数式编程.jpg
五种基本类型
int
double
String
bool
dynamic 动态类型
int, double
main(){
int amount1 = 100;
var amount2 = 200;
print('Amount1: $amount1 | Amount2: $amount2 \n');
double dAmount1 = 100.11;
var dAmount2 = 200.22;
bool isTrue = true;
var isFalse = false;
dynamic weakVariable = 100;
weakVariable = 'newValue';
}
String
String name1 = 'name1';
var name2 = "name2"; // 单双引号都可以
var s = r'In a raw string, not even \n gets special treatment.'; // Raw String,这里的 \n 也会被打印出来
// 换行字符串
var s1 = '''
you can create
multi-line strings like this one.
''';
var s2 = """This is also a
multi-line string.""";
字符串和数字的转化
// Stirng -> int
var one = int.parse('1');
assert(one == 1);
// String -> double
var onePointOne = double.parse('1.1');
assert(onePointOne == 1.1);
// int -> String
String oneAsString = 1.toString();
assert(oneAsString == '1');
// double -> String
String piAsString = 3.14159.toStringAsFixed(2);
assert(piAsString == '3.14');
常量 const
const aConstNum = 0;
运算符
(?.), (??), (??=)
main(){
var n;
int number;
number = n?.num ?? 0;
}
main(){
int number;
print(number ??= 100); // 100
print(number); // 同样输出 100。100 被永久分配给 number
}
Type Test
main(){
var x = 100;
if(x is int){
print('integer');
}
}
条件语句
main(){
int number = 90;
if(number % 2 == 0){
print("Even");
}
else if (number % 3 == 0){
print('Odd');
}
else {
print('Confused');
}
}
main(){
int number = 0;
switch(number){
case 0:
print('Even');
break;
case 1:
print('Odd');
break;
default:
print('Confused');
}
}
循环
standard for loop
for(var i = 0; i < 10; i++){
print(i);
}
for-in loop
var numbers = [1, 2, 3];
for(var n in numbers) {
print(n);
}
forEach loop
var numbers = [1, 2, 3];
numbers.forEach((n) => print(n));
while loop
int num = 5;
while(num > 0){
print(num);
num -= 1;
}
// 或者
do {
print(num);
num -= 1;
} while(num > 0);
break and continue
for(var i = 0; i < 10; i++){
if(i > 5) break;
print(1);
}
for(var i = 0; i < 10; i++){
if(i % 2 == 0) continue;
print(1);
}
collection
list 数组
// 其中 <String> 可选,能限制数组的类型;const 也是可选的,防止数组的元素被变更
List <String> names = const ['lzz', 'nz'];
print(names[0], names.length);
复制数组
// 直接 names2 = names,获得的只是引用
List <String> names = ['Jack', 'Jill'];
var names2 = [...names];
Set
var halogens = {'name1', 'name2', 'name1'};
for(var x in halogens){
print(x); // name1 只打印一次
}
创建空集合
var halogens = <String>{};
Set <String> names = {};
Map
var map = {
'one': 'one',
'two': 'two'
};
print(map['one']);
var map = Map();
map['first'] = 'one';
Function
dynamic square(var num) {
return num * num;
}
// 或者箭头函数
dynamic square(var num) => num * num;
命名参数
main(){
print(sum(num2: 4, num1: 2));
}
dynamic sum({var num1, var num2}) => num1 + num2;
或者像这样混用也可以:
main(){
print(sum(4, num2: 2));
}
dynamic sum(var num1, {var num2}) => num1 + num2;
dart 也支持默认参数
main(){
print(sum(4));
}
dynamic sum(var num1, {var num2=0}) => num1 + num2;
还支持将某参数设置为可选
main(){
// 没有传第二个参数的情况下也不会报错
print(sum(4));
}
dynamic sum(var num1, [var num2=0]) => num1 + (num2 ?? 0);
Class
class Person {
final name; // 只能在构造函数里被赋值一次
int age;
static const int number = 10; // 静态常量。只能通过类访问(Person.age),而不能通过实例(person1.age)
// 或者:Person(this.name, [this.age = 18]);
Person(String name, [int age = 18]) {
this.name = name;
this.age = age;
}
// 在默认构造函数之外,如何创造其他构造函数(name constructor)
Person.guest() {
// 在 Dart 中,this 关键字用于明确区分类的 实例变量 和构造函数或方法中的 局部变量/参数,但当没有歧义时,可以省略 this。
name = 'Guest';
age = 18;
}
// 实例方法
void showOutput() {
print(name);
print(age);
}
}
void main() {
Person person1 = Person();
person1.name = 'name';
person1.age = 18;
person1.showOutput();
// 或者
Person person2 = Person('name2');
var person3 = Person.guest();
person3.showOutput();
}
继承
class Vehicle {
String model;
int year;
Vehicle(this.model, this.year) {
print(this.model);
print(this.year);
}
void showOutput() {
print(model);
print(year);
}
}
class Car extends Vehicle {
double price;
Car(String model, int year, this.price) : super(model, year);
void showOutput() {
super.showOutput();
print(this.price);
}
}
方法覆盖:@override
class Vehicle {
String model;
int year;
Vehicle(this.model, this.year) {
print(this.model);
print(this.year);
}
void showOutput() {
print(model);
print(year);
}
}
class Car extends Vehicle {
double price;
Car(String model, int year, this.price) : super(model, year);
@override
void showOutput() {
print(this.price);
}
}
getter 和 setter
class Rectangle {
num left, top, width, height;
Rectangle(this.left, this.top, this.width, this.height);
num get right => left + width;
// 这并不是真的在给 right 赋值,而是:left 应该自动变成 value - width,才能使 right = value 成立
set right(num value) => left = value - width;
}
Exception Handling
int mustGreaterThanZero(int val) {
if(val < 0){
throw Exception('Value must be greater than zero');
}
return val;
}
void letVerifyTheValue(var val) {
var valueVerification;
try {
valueVerification = mustGreaterThanZero(val);
}
catch(e) {
print(e);
}
finally {
}
}
// 如果程序有特定类型的错误
try {
} on OutOfLlamasException {
} on Exception catch (e) {
} catch (e) {
}