Dart语法重新整理

内容纲要

很多年前简单总结了Dart的一些特点,都是基于当时的一些使用情况,从新梳理下。

Dart特点

  • 在Dart中,一切都是对象,所有的对象都是继承Object,也就是所有能够使用变量引用的都是对象,每个对象都是一个了类的实例。在Dart中甚至数字、方法和null都是对象。

  • 没有赋初值的变量都会有默认值null

  • 标识符可以以字母或者_下划线开头,后面可以是其他字符和数字的组合。

  • Dart支持顶级方法,如main方法,同时还支持在类中定义函数(静态函数和实例函数),还可以在方法中定义方法,Dart支持顶层变量,也支持类变量或对象变量。

  • Dart没有public、protected、private关键字。如果某个变量以下划线_开头,代表这个变量是在库中是私有的。

  • Dart中的类和接口都是统一的,类即是接口,你可以继承一个类,也可以实现一个类,自然也包含了良好的面向对象和并发编程的支持。

  • final的值只能被设定一次。const是一个编译时的常量,可以通过const来创建常量值,var n = const[],这里n还是一个变量,只是被赋值了一个常量值,它还是可以符其他值。实例变量可以是final,但不能是const。

  • Dart是强类型语言,但可以用var或者dynamic来声明一个变量,Dart会自动推断其数据类型,dynamic类似C#

  • 使用静态类型可以更清晰表面你的意图,并且可以让静态分析工具来分析你的代码。

  • Dart在运行之前会先解析你的代码。你可以通过使用类型或者编译时常量来帮助Dart去捕获异常以及让代码运行的更高效。

  • Dart工具可以指出两种问题:警告和错误。警告只是说你的代码可能有问题,但是并不会阻止你的代码执行。错误可以是编译时错误也可以是运行时错误。遇到编译时错时,代码将无法执行;运行时错误将会在运行代码的时候导致一个异常。

Dart语法

保留字

const null class new this
as default final continue throw
assert deferred finally operator true
async do for part try
async* dynamic get rethrow typedef
await else if return var
break enum implements set void
case export import static while
catch external in super with
false extends is switch yield
abstract factory library sync* yield*

程序入口

void main(){
    var number = 6.76;//动态类型声明 隐式转换类型
    trace(number);
}
trace(num Number){//指定类型
    print('The number is $Number');//模版字符串
}

语法核心

var lalala;
var wahaha = 1;
print(lalala);//null
print(wahaha);//1

//数值类型
int a = 2;//整型
double aa = 3.1415;//浮点型
print(a);//指定类型
b ??= a;

//根据转换标准
double aaa = 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1;
print(aaa);//0.9999999999999999
print(aaa.toStringAsFixed(0));//1
print(aaa.toStringAsFixed(2));//1.00

//运算符:+、-、*、/、~/、%
//属性:isNaN、isEven、isOdd
//方法:abs()、round()、floor()、ceil()、toInt()、toDouble()等
int num7 = 3;
double num10 = 10.1;
print(num7 / num10);//0.297029702970297
print(num7 ~/ num10);//0


//字符串
String str1 = "'啦啦啦'";//'啦啦啦'
String str2 = '"娃哈哈"';//"娃哈哈"


//常量
const b = "b";声明时赋值一次
final c = "c";//运行时赋值一次
const String d = "词法常量";
final String e;
e = "运行时常量";
print(b);//b
print(c);//c
print(d);//词法常量
print(e);//运行时常量


//bool布尔
bool b = true;
if(b){
    print("true");
}else{
    print("false");
}
print(b ? "三元true" : "三元false");


//数组List
List list = [0,1,2];
//可new
List list1 = new List();
List list2 = const[0,1,2];
//�指定单类型
List list3 = new List<String>();
List list4 = new List(5);
List list5 = new List.from([0,1,2,3]);
List list6 = new List()..length = 10;
//固长
List list7 = new List.unmodifiable([0,1,2]);
//generate生成器
List list8 = new List<int>.generate(5, (int i){
    return i + i;
});
//List方法:add()、insert()、remove()、removeAt()、indexOf()、elementAt()等


//Map
Map mapEnt = Map.identity();
print(mapEnt); 
Map map = {'one':'Hello', 'two':'Indeex', 'three':'lalala'};
print(map);  
Map map1 = new Map();
map1["one"] = 'Hello';
map1["two"] = 'Indeex';
map1["three"] = 'lalala';
print(map1);//{one: Hello, two: Indeex, three: lalala}
map1.forEach((key,value) {
    print("key:${key}, value:${value}");
});
//引用
Map map2 = Map.of(map1);
print(map2);
Map map3 = Map.fromEntries(map1.entries);
print(map3);
//副本
Map map4 = Map.unmodifiable(map3);
print(map4);
List<String> keys = ['one','two'];
List<String> values = ['Android','IOS'];
Map map5 = Map.fromIterables(keys, values);
print(map5);
var mapType = new Map<int,String>();


//Runes字符符号
var clapp = '\u{1f44f}';
print(clapp);//👏
print(clapp.codeUnits);//[55357, 56399]
print(clapp.runes.toList());//128079]
Runes input = new Runes('\u2665  \u{1f605}  \u{1f60e}  \u{1f47b}  \u{1f596}  \u{1f44d}');
print(new String.fromCharCodes(input));//♥  😅  😎  👻  🖖  👍


//Symbols
var name = 'indeex';
Symbol symbol = #name;
print(symbol);//Symbol("name");
print(#name);//Symbol("name");


//function:词法作用域/静态作用域 闭包同 可选返回值
bool isnull(int num) {
    return list[num] != null;
}

bool isnull(int num) => list[num] != null;

String say(String from, String msg = "Hello", [String device]) {
    var result = '$from says $msg';
    if (device != null) {
        result = '$result with a $device';
    }
    return result;
}

void dosome({List<int> list = const [1, 2, 3], Map<String, String> gifts = const {'first': 'paper', 'second': 'cotton', 'third': 'leather'}}) {
    print('list:  $list');
    print('gifts: $gifts');
}
//级联
querySelector("#element")
..text = "Waooooo!"
..onClick.listen(reverseText);
//匿名函数
var list = ['🍎', '🍊', '🍌', '🍉'];
list.forEach((i) => print(list.indexOf(i).toString() + ': ' + i));


//is as
a is b//true false
c as d

//do while while do
while (true) {
    //dosomething
    if(true) continue;
    if(false) break;
}
do {
    //dosomething
} while (true);


//swhich
switch (var) {
    case 'value':
        //dosomething
        break;
    case 'value1':
        //dosomething
    default:
        //doothersomething
}

//Error 异常
throw '出错啦!';
try {
    //dosomething
} catch(e) {
    print('异常: $e');
} finally {//可以没有次流程
    //doothersomething
}


//class
class Person {
    String name;
    int age;
    Point(this.name, this.age);
}
//工厂构造
class Logger {
    final String name;
    bool mute = false;
    static final Map<String, Logger> _cache = <String, Logger>{};
    factory Logger(String name) {
        if (_cache.containsKey(name)) {
            return _cache[name];
        } else {
            final logger = new Logger._internal(name);
            _cache[name] = logger;
            return logger;
        }
    }
    Logger._internal(this.name);
    void log(String msg) {
        if (!mute) {
            print(msg);
        }
    }
}
var logger = new Logger('UI');
logger.log('点击按钮');

//getter setter
class Rectangle {
    num left;
    num top;
    num width;
    num height;
    Rectangle(this.left, this.top, this.width, this.height);
    num get right => left + width;
    set right(num value) => left = value - width;
    num get bottom => top + height;
    set bottom(num value) => top = value - height;
}

//抽象类
class chouxiang extends AbstractContainer {
    void updateChildren() {
    }
    void doSomething();//会有警告
}

//接口 没有直接接口关键字
class Person {
    final _name;
    Person(this._name);
    String greet(who) => 'Hello, $who. I am $_name.';
}
//接口实现
class Imposter implements Person {
    final _name = "";
    String greet(who) => 'Hi $who. Do you know who I am?';
}
greetBob(Person person) => person.greet('hungking');
main() {
    print(greetBob(new Person('indeex')));
    print(greetBob(new Imposter()));
}
//多个接口
class Point implements Comparable, Location {
    //dosomething
}

//扩展类
class Television {
    void turnOn() {
        _illuminateDisplay();
        _activateIrSensor();
    }
    //...
}
class SmartTelevision extends Television {
    void turnOn() {
        super.turnOn();
        _bootNetworkInterface();
        _initializeMemory();
        _upgradeApps();
    }
    //...
}

//override
class A {
@override
void noSuchMethod(Invocation mirror) {
    //  。。。
    }
}

//枚举类型
enum Color {
    red,
    green,
    blue
}

//静态类
class Point {
    static const red = const Color('red');
    num x;
    num y;
    Point(this.x, this.y);
    static num distanceBetween(Point a, Point b) {
        var dx = a.x - b.x;
        var dy = a.y - b.y;
        return sqrt(dx * dx + dy * dy);
    }
}
main() {
    var a = new Point(2, 2);
    var b = new Point(4, 4);
    var distance = Point.distanceBetween(a, b);
    assert(distance < 2.9 && distance > 2.8);
}

//范型
T first<T>(List<T> ts) {
    T tmp ?= ts[0];
    return tmp;
}


//import
//内置库
import 'dart:html';

import 'package:lib2/lib2.dart' as lib2;
new lib2.Dosomething();

//导入指定
import 'package:lib1/lib1.dart' show foo;
//导入除指定
import 'package:lib2/lib2.dart' hide foo;
//延迟导入 deferred async await
import 'package:deferred/hello.dart' deferred as hello;
greet() async {
    await hello.loadLibrary();
    hello.printGreeting();
}

//元数据Metadata @deprecated、@override,@proxy
class Television {
    @deprecated
    void activate() {
        turnOn();
    }
    void turnOn() {
        print('on!');
    }
}

import 'todo.dart';
@todo('seth', 'make this do something')
void doSomething() {
    print('dosomething');
}

code enjoy! 🐾🐾🐾🐾🐾🐾🐾🐾🐌🐝

作者:indeex

链接:https://indeex.club

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


发表评论

您的电子邮箱地址不会被公开。