Dart语法概要

// 定义个方法。
printNumber(num aNumber) {print('The number is $aNumber.'); // 在控制台打印内容。
}// 这是程序执行的入口。
main() {var number = 42; // 定义并初始化一个变量。printNumber(number);
}
  1. 所有的函数都返回一个值。如果没有指定返回值,则默认把语句return null;作为函数的最后一个语句执行。
  2. main(),Dart程序执行的入口方法,每个程序都需要一个这样的方法。
  • main()方法前面的void可有可没有。
  • main()方法有一个可选的List的参数,在Android studio 运行时需配置,如图:


  1. var一种不指定类型声明变量的方式。
  • Dart中一切皆对象,所以没有初始化的默认值都是null,null是Null类的唯一实例。
  • 我们也可以申请一个具体类型,有助于编译工具帮我们补全代码,查找bug。例如:String name = ‘Bob’;
  • 在代码风格中,使用var而不是具体的类型来定义局部变量。推荐的做法是在编写严格API时尽量使用类型声明(规定使用),编写独立应用时尽量使用var声明(快速开发)。
  • 想要知道具体类型,使用runtimeType
  1. 42,是一个字面量。字面量是编译时常量。
  2. num是一个类型(类型接口)。
  3. print()打印语句,a+b或者{a+b}或者a+b或者a," ",’ '都行
  4. 注释和java中一样的

断言介绍

int lineCount;
assert(lineCount == null);//断言
//如果条件不为 true 则会抛出一个AssertionError异常。

内置类型

Numbers(数值)

  1. int 和 double 都是 num 的子类
  2. num 类型定义了基本的操作符,例如 +, -, /, 和 *, 还定义了 abs()、 ceil()、和 floor() 等函数
int i = 1;
double d = 1.2;
num j = 1;
num k = 1.2;

String

String str1 = 'abc';//单引号字符串
String str2 = "abc";//双引号字符串
//三个 ' 或 " (不能混合使用)来定义多行的String类型,注意str3和str4的显示区别
String str3 = '''abcdef''';
String str4 = "abc""def";
String str5 = "abc"+"def";//str4和str5是一样的
print("str1 = $str1");//abc
print("str2 = $str2");//abc
print("str3 = $str3");//abc \n def
print("str4 = $str4");//abcdef
print("str5 = $str5");//abcdef//通过提供一个r前缀可以创建一个 “原始 raw” 字符串,原始字符串中没转义字符
var s = r"In a raw string, even \n isn't special."
print("s = $s");//In a raw string, even \n isn't special.

字符串和数值之间的转换

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

Booleans(布尔值)

只有true被认为是true,其他的都是false

if(1){}//错误
//下面的ok
if(1 != 0){}
if(true){}
if(false){}

Lists(列表),runtimeType

在 Dart 中数组就是 List 对象

[1,2,3][1];//2
[1,2,3].length;//3
[].length;//0
[].isEmpty;//true
['a'].isEmpty;//falsevar list1 = [1, 2, 3];
var list2 = ['a', 'b', 'c'];
var list3 = [1, 'a', 3];
print('list1 = $list1');//list1 = [1, 2, 3]
print('list2 = $list2');//list2 = [a, b, c]
print('list3 = $list3');//list3 = [1, a, 3]
print('${list3[0].runtimeType},${list3[1].runtimeType}');//int,String
var list4;
print('list4 = ${list4.runtimeType}');//返回Null
//runtimeType,返回(运行时类型)对象的类型

Maps

var colors1 = {
// Keys      Values'first' : 'red',12: 'green','third' : 'blue'
};
print('colors1 = $colors1');//colors1 = {first: red, 7: green, third: blue}
print(colors1[7]);//greenvar colors2 = new Map();
colors2['first'] = 'red';
colors2['second'] = 'green';
colors2['third'] = 'blue';
//通过map中的key获取value,如果所查找的key不存在,则返回 null:
assert(colors2['first'] == 'red');
//获取长度
assert(colors2.length == 3);

Runes

Dart字符串是一系列UTF-16代码单元,因此在字符串中表示32位Unicode值需要特殊语法。
Dart中使用String的runes来获取UTF-32字符集的字符。String的codeUnits和codeUnitAt属性可以获取UTF-16字符集的字符。

var clapping = '\u{1f44f}';
print(clapping);
print(clapping.codeUnits);
print(clapping.codeUnitAt(1));
print(clapping.runes.toList());Runes input = new Runes('\u2665  \u{1f605}  \u{1f60e}  \u{1f47b}  \u{1f596}  \u{1f44d}');
print(new String.fromCharCodes(input));

Functions(方法)

Dart没有final方法,允许重写几乎所有方法(同样,部分内置的操作符例外)

//平时使用方式
String sayHello1(String name){return 'Hello $name!';//return print('Hello $name!');//print();方法返回的是void
}//这样也是可以的,忽略类型定义
sayHello2(name){return 'Hello $name!';
}//对于只有一个表达式的方法,你可以选择使用缩写语法来定义:
sayHello3(name) => 'Hello $name!';
//注意:在箭头 (=>) 和冒号 (;) 之间只能使用一个表达式 –- 不能使用语句。 表达式计算后通常会返回一个单独的值.
//例如下面这些,注释后面的就是表达式:
int i = 10;//i = 10
anArray[0] = 10;//anArray[0] = 100
int result = 1 + 2; // result = 1 + 2
if (value1 == value2)//value1 == value2//方法也可以赋值给一个变量--类似函数指针
var sayHello4 = (name)=>'Hello $name!';

函数闭包

方法也是对象并且具有一种类型:Function。一个闭包是一个方法对象。

Function makeAdder(num addBy) {return (num i) => addBy + i;
}main() {var add2 = makeAdder(2);//add2(num i) => 2 + i;var add4 = makeAdder(4);//add2(num i) => 4 + i;assert(add2(3) == 5);assert(add4(3) == 7);
}

typedef

因为 typedef 是简单的别名,所以它提供了一种方法来检查任何函数的类型。比如:

typedef int Compare(int a, int b);int sort(int a, int b) => a - b;main() {assert(sort is Compare);
}//请注意 目前 typedef 仅限于函数类型,我们期望这一点能有所改变。

方法可作为参数被调用

printNumber(name) {print(name);
}
var list = [1, 2, 3];//可以把方法当做参数调用另外一个方法
list.forEach(printNumber);//匿名方法
list.forEach((i){print(i);
}));

可选参数

分为:可选命名,可选位置

//可选命名,赋默认值的方式两种:等号'='或者冒号':'
FunA(a, {b, c:3, d:4, e})
{print('$a $b $c $d $e');
}
//可选位置,赋默认值只有一种方式:等号'='
FunB(a, [b, c=3, d=4, e])
{print('$a $b $c $d $e');
}
void main()
{FunA(1, b:3, d:5);//1 3 3 5 nullFunB(1, 3, 5);//1 3 5 4 null
}//可选参数为list,map的情况
void FunC({List<int> list = const [1, 2, 3],Map<String, String> colors = const {'first': 'red','second': 'green','third': 'blue'}}) {print('list:  $list');print('colors: $colors');
}

操作符

~/ 除后取整

5 ~/ 2 = 2; 5 / 2 = 2.5

as,is,is!

操作符 解释
as 类型转换
is 如果对象是指定的类型返回 True
is! 如果对象是指定的类型返回 False
//使用 as 操作符把对象转换为特定的类型。一般情况下,你可以把它当做用 is 判定类型然后调用所判定对象的函数的缩写形式//is相当于instanceof
if (emp is Person) { // Type checkemp.firstName = 'Bob';
}(emp as Person).firstName = 'Bob';//注意: 上面这两个代码效果是有区别的。如果 emp 是 null 或者不是 Person 类型, 则第一个示例使用 is 则不会执行条件里面的代码,而第二个情况使用 as 则会抛出一个异常。

??=

b ??= value; // 如果 b 是 null,则赋值给 b;如果不是 null,则 b 的值保持不变

??

String toString() => msg ?? super.toString();
String toString() => msg == null ? super.toString() : msg;

?.

和.类似,但是左边的操作对象不能为 null,例如 foo?.bar 如果 foo 为 null 则返回 null,否则返回 bar 成员

… 级联语法

class Person {String name;String country;void setCountry(String country){this.country = country;}String toString() => 'Name:$name\nCountry:$country';
}
void main() {Person p = new Person();p ..name = 'Wang'..setCountry('China');print(p);
}
//打印结果:
//Name:Wang
//Country:China

注意: 严格来说, 两个点的级联语法不是一个操作符。 只是一个 Dart 特殊语法。

operator

//可以重写的操作符
<    +  |   []
>    /   ^   []=
<=  ~/  &   ~
>=  *   <<    ==
–   %   >>
class myString{String str;myString(this.str);String operator +(myString s){return '${str}${s.str}';}
}void main(){myString hello=new myString('Hello');myString world=new myString('World');print(hello+world);
}

Flutter 核心编程二:Dart基础语法之基本数据类型,数组,方法,Runs,函数闭包,typedef,操作符相关推荐

  1. Flutter的优势以及Dart基础语法

    1.为什么要学习Flutter? 对于移动端开发人员来说,跨平台技术一直是关注的重点,从H5,React Native到Flutter,我们似乎一直在寻找一种能"一套代码,多端运行" ...

  2. 实验二 Java基础语法练习-基本数据类型、运算符与表达式、选择结构

    一. 实验目的及要求 目的: (1) 掌握各种变量的声明方式 (2) 掌握Java的基本数据类型.运算符与表达式的使用方法. (3) 理解Java的程序语法结构,掌握顺序结构.选择结构程序设计方法. ...

  3. C++核心编程(二)

    C++核心编程(二) 0.写在前面 如果你是期末时间紧张冲刺型选手,请移步:C++期末复习超详细总结知识点(期末冲刺) 如果你是时间充足型选手,请按顺序依次学习! 本篇笔记视频讲解地址:https:/ ...

  4. C语言代码示范与讲解+C语言编程规范及基础语法+编程实战

    上一篇文章:C语言程序设计概述+C语言简介+算法概述 C语言代码示范与讲解+C语言编程规范及基础语法+编程实战 一:代码示范集加讲解 1.C语言第一个代码:打印"This is the fi ...

  5. linux网络编程二:基础socket, bind, listen, accept, connect

    linux网络编程二:基础socket, bind, listen, accept, connect 1. 创建socket #include <sys/types.h>     #inc ...

  6. C#基础编程——简介及基础语法

    C#基础编程--简介及基础语法 百科介绍 C#是微软公司发布的一种由C和C++衍生出来的面向对象的编程语言.运行于.NET Framework和.NET Core(完全开源,跨平台)之上的高级程序设计 ...

  7. openresty开发系列13--lua基础语法2常用数据类型介绍

    openresty开发系列13--lua基础语法2常用数据类型介绍 一)boolean(布尔) 布尔类型,可选值 true/false: Lua 中 nil 和 false 为"假" ...

  8. python的基础语法(组合数据类型)

    目录 python的基础语法(组合数据类型) 一,list列表 1 什么是列表? 2 列表怎么声明? 3 列表的操作 二,tuple元组 1. 什么是元组|元组的特点 2. 元组的声明 3. 元组的操 ...

  9. 《黑马程序员》C++核心编程(二)

    0.写在前面 本篇笔记视频讲解地址:https://www.bilibili.com/video/BV1et411b73Z?p=1 笔记配合视频效果更好 外链图片上传失败已经解决,手动校正,如有错误和 ...

最新文章

  1. 史上最萌的统计学入门书,快来看看长啥样
  2. Spring MVC 特性实现文件下载
  3. python123电脑登录不了_Python-用户登陆,密码失败3次,账户将被锁住(login)
  4. 最幸福的事就是吃饺子
  5. Python基础:字典(dict)与集合(set)
  6. 设置指定打印机端口打印
  7. windows美化指南秒变mac风格
  8. OLED12864(SSD1306)驱动代码
  9. 四足鼎立,北京互联网产业地图
  10. Efficient polynomial commitment schemes for multiple points and polynomials学习笔记
  11. Android-Material-Sloth
  12. Matlab闪退打不开解决方法
  13. 2016全球云计算大会:云服务商们都这样看“云”
  14. 电源管理之pmu驱动分析
  15. Cplusplus实现的爱心代码,爱心里面有三个字李欣怡
  16. Android音视频开发(一)——音视频开发流程
  17. Icon图标 [Java]
  18. 学习《论文写作》课程的收获
  19. java 响铃 bel 使用_Java基础01
  20. Mysql存储过程名规则_数据库对象命名规范一(原则、命名、 表、视图、存储过程、函数、触发器命名规范)...

热门文章

  1. 计算机游戏act动作游戏,传统动作类游戏有哪些_好玩的ACT游戏盘点
  2. 通过大数据分析如何提升客户体验
  3. 服务器和交换机物理连接_Brocade博科交换机 SAN存储区域网络
  4. 设计模式是什么鬼(抽象工厂)
  5. Android系统换字体不root,小编吐血整理,超实用免ROOT 安卓手机换字体软件
  6. 阿里大力押注的淘宝心选,还赶不上网易严选们吗?
  7. c语言判断两个单词是否为变位词,C++变位词问题分析
  8. linux mint 安装ubuntu软件中心,Ubuntu和Linux Mint:安装Pinta 1.6工具
  9. 《程序员防近视指南》学习笔记全
  10. 【MMCV 源码解读】一、Config(配置文件相关)