Flutter 入门指南之 Dart 语言基础

一、基础篇

1.1 Dart 语言的优势

Dart 语言的优势

1、支持 AOT 编译和 JIT 编译两种方式

2、Dart 为单线程,不允许抢占。

TODO:深入了解 AOT 和 JIT

1.2 Dart 语言的基本语法

变量声明

1、可以通过 var 定义变量,支持闭包

2、Dart 属于强类型语言,自动推导类型,并变量类型不能发生改变。

3、没有初始化的变量都会被赋予默认值 null

4、常量声明:const 、 final,区别为

  • const 编译时常量,必须在声明时初始化,且初始化值必须为确定值,不需要经过计算。
  • final 运行时常量,声明时初始化/构造函数初始化,值可动态计算。

基本类型

number、String、bool、list、map、set

number

  • number 类型只有 Int 和 double。
num x = 1; // x can have both int and double values
x += 2.5;
  • 字符串转数字:int.parse()、double.parse()

  • 数字转字符串:intNum.toString()、doubleNum.toStringAsFixed(n)保留n位小数。

// String -> 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');

Strings

  • 在字符串中使用变量,使用${}/$变量包裹
var s = 'string interpolation';

assert('Dart has $s, which is very handy.' ==
    'Dart has string interpolation, '
        'which is very handy.');
assert('That deserves all caps. '
        '${s.toUpperCase()} is very handy!' ==
    'That deserves all caps. '
        'STRING INTERPOLATION is very handy!');
  • ‘’’…’’’,"""…"""表示多行字符串
var s1 = '''
You can create
multi-line strings like this one.
''';

var s2 = """This is also a
multi-line string.""";
  • r’…’,r"…"表示“raw”字符串 TODO

Bool值

Dart 是强 bool 类型检查,只有bool 类型的值是 true 才被认为是 true

list列表

创建、增、删、查、排序

  • 创建 list 列表

    1、new List

    2、简单 List

    3、集合 if 和集合 for

// 1、new List
var vegetables = new List();
// 2、简单用List来赋值
var fruits = ['apples', 'oranges'];

var constantList = const [1, 2, 3];// 常量列表
// constantList[1] = 1; // This line will cause an error.
// 3、集合if
var nav = [
  'Home',
  'Furniture',
  'Plants',
  if (promoActive) 'Outlet'
];

// 3、集合for
var listOfInts = [1, 2, 3];
var listOfStrings = [
  '#0',
  for (var i in listOfInts) '#$i'
];
assert(listOfStrings[1] == '#1')
  • 添加元素

Dart 2.3 增加了扩展运算符...和可识别空值的展开运算符...?

var list = [1, 2, 3];
var list2 = [0, ...list];
assert(list2.length == 4);

var list;
var list2 = [0, ...?list];
assert(list2.length == 1);

添加元素方法:add()添加一个、addAll()添加多个

// 添加元素
fruits.add('kiwis');

// 添加多个元素
fruits.addAll(['grapes', 'bananas']);
  • 删除元素
// 删除指定位置的元素,返回删除的元素
fruits.removeAt(index);

// 删除指定元素,成功返回true,失败返回false
fruits.remove('apples');

// 删除最后一个元素,返回删除的元素
fruits.removeLast();

// 删除指定范围元素,含头不含尾,成功返回null
fruits.removeRange(start,end);

// 删除指定条件的元素,成功返回null
fruits.removeWhere((item) => item.length >6);

// 删除所有的元素
fruits.clear();
  • 查询元素
// 获取第一个元素
fruits.first;

// 获取元素最后一个元素
fruits.last;

// 查找某个元素的索引号
assert(fruits.indexOf('apples') == 0);
  • 排序
// sort()对元素进行排序,传入一个函数作为参数,return <0表示由小到大, >0表示由大到小
fruits.sort((a, b) => a.compareTo(b));

Set

唯一的无序集合。

  • 创建 Set
// 1、简单赋值
var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};
//注意 var names = {}; 这是创建了一个map,而不是set!
// 2、
var names = <String>{};
Set<String> names = {};
  • 向 Set 增加元素 add 、addAll
  • 判断Set中是否包含某元素:set.contains(item)
//是否包含
_saved.contains(pair);

//移除
_saved.remove(pair);

Map

  • 创建 Map
// Map的声明
var hawaiianBeaches = {
    'oahu' : ['waikiki', 'kailua', 'waimanalo'],
    'big island' : ['wailea bay', 'pololu beach'],
    'kauai' : ['hanalei', 'poipu']
};
var searchTerms = new Map();

// 指定键值对的参数类型
var nobleGases = new Map<int, String>();

// Map的赋值,中括号中是Key,这里可不是数组
nobleGase[54] = 'dart';

//Map中的键值对是唯一的
//同Set不同,第二次输入的Key如果存在,Value会覆盖之前的数据
nobleGases[54] = 'xenon';
assert(nobleGases[54] == 'xenon');

// 检索Map是否含有某Key
assert(nobleGases.containsKey(54));

//删除某个键值对
nobleGases.remove(54);
assert(!nobleGases.containsKey(54));

函数

函数前为返回值类型

bool isNoble ( int atomicNumber ) { return _nobleGases [ atomicNumber ] != null ; } 

isNoble ( atomicNumber ) { return _nobleGases [ atomicNumber ] != null ; } 

bool isNoble ( int atomicNumber ) => _nobleGases [ atomicNumber ] != null ;   

参数

函数参数后面可以跟命名参数、可选位置参数(但不能同时跟俩)。

命名参数

函数参数命名,传参时需要指定将哪个数据传给哪个参数。

// 函数定义
void enableFlags({bool bold,required bool hidden}) {...}
// 函数调用
enableFlags(bold: true, hidden: false);

required 必须传某个参数

可选位置参数

可选位置参数,使用[]将参数包裹,这个位置参数可以不传。

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

参数默认值

void enableFlags({bool bold = false, bool hidden = false}) {...}

条件判断与循环

  • if…else
  • for
  • while do-while
  • break continue
  • switch…case 如果 case 后面有表达式但是没有 break,会抛出异常
  • assert(仅在checked模式有效),如果条件为假,抛出异常

if - else

判断值必须为true或false,不能为别的!

for 循环

var message = StringBuffer('Dart is fun');
for (var i = 0; i < 5; i++) {
  message.write('!');
}
var collection = [1, 2, 3];
collection.forEach(print); // 1 2 3

异步

Future、async/await

Future

类似于Promise,成功执行then,失败执行catchError,无论如何执行whenComplete

void main() {
  Future.delayed(new Duration(seconds: 1), () {
    return "666";
  }).then((data) {
    // 成功后执行
    print(data);
  }).catchError((e) {
    // 失败后执行
    print("error");
  }).whenComplete(() {
    // 无论成功失败都会执行
    print("complete");
  });
}

async/await

在函数()后加 async

void main() async{
  print(await getString());
}

getString() {
  return Future.delayed(new Duration(seconds: 1), () {
    return "666";
  });
}
上一篇:利用epoll写一个"迷你"的网络事件库


下一篇:python的列表、元组和字典