Dart语言详解(二)——基本语法

想学Flutter,就请关注这个专栏
Flutter系列(一)——详细介绍
Flutter系列(二)——与React Native进行对比
Flutter系列(三)——环境搭建(Windows)
Flutter系列(四)——HelloWorld
Dart语言详解(一)——详细介绍
Dart语言详解(二)——基本语法

文档归档:
https://github.com/yang0range/flutterfilejava

前言

以前,详细的介绍了一下Dart语言的前世此生,接下来,咱们就该深刻的了解Dart语言,了解Dart语言的基本数据类型,语法等相关的内容git

变量和数据类型

变量

命名

在Dart语言当中,定义变量的方式是github

dataType viriableName = Initial Valute

这里其实和Java是同样的,不只如此连命名的方式也和Java相同,都是采用驼峰命名的方式。闭包

声明

在声明的时候,除了基本数据类型以外,还有三种变量的声明。app

var,dynamic,Objectide

var:若是没有初始值的时候,var能够变成任意类型。 函数

dynamic:动态任意类型,编译阶段不检查类型。 学习

Object: 动态任意类型,在编译阶段检查类型。ui

和var的区别:
var若是有初始值,那么类型会被锁定。编码

变量的默认值

1.没有初始值的变量会自动获取一个默认值null
2.一切皆为对象,对象的默认值是null

final和const

表示不可改变
相同点:

  • 声明的类型能够省略
  • 初始化后不能再赋值
  • 不能和var同时使用

不一样点:

  • 类级别常量,使用static const
  • const可以使用其余const 常量的值来初始化其值
  • 使用const赋值声明,const能够省略
  • 能够更改非final、非const变量的值。即便曾经具备const值
  • const致使的不可变性是能够传递的
  • 相同的const常量不会再内存中重复建立
  • const须要是编译时常量

基本数据类型

Dart总共又8种基本数据类型。
分别是:
image.png

Numbers 数值型

数值型里面有包含了int型和doubule两种类型,这两种和Java相似,其中int是整数型,double是64-bit双精度浮点数,这两种都是Numbers类型的子类。

String

Dart字符串是UTF-16编码的字符序列。

1.可使用单引号或者双引号来建立字符
例如:

void main() {
  print("This is a String");
  print('This is also a stirng');
}

这两个是同样的。

2.字符串拼接
例如:

void main() {
  String s1 = "First string.";
  String s2 = "Second string";
  print(s1 + s2);
}

3.字符插值
${exprsssion},若是表达式是一个标识符,能够省略{},若是表达式的结果为一个对象,Dart会调用对象的toString()函数来获取一个字符串。
例如:

void main() {
  String s1 = "First string.";
  print("String $s1");
}
void main() {
  print("The sum of 1 and 1 equals ${1 + 1}.");
}

4.多行显示
使用双引号建立多行字符
还可使用(')和(")
例如:

var s = 'Firtst'
  'Second'
  "Third";
   print(s);

使用三引表示多行字符
例如

var multilineString = """This is a
   multiline string
   consistiong of
   multiple lines""";
  print(multilineString);

5.使用r前缀建立“原始raw”字符串

String s4 ="adbchi\ndfafa";
  print(s4);

  String s5 =r"adbchi\ndfafa";
  print(s5);

输出的结果

I/flutter (17682): adbchi
I/flutter (17682): dfafa
I/flutter (17682): adbchi\ndfafa
Bool

Dart的bool和Java相似只有两种类型,一种是true一种是false,可是,不一样的是bool对象未初始化的默认值是null。

List
  • 由于在Dart当中,由一切皆为对象的概念,Dart就能够直接打印list包含list的元素,这点和Java由明显的不一样,java中直接打印list结果是地址值。

例如

var list = [0, 1, 2, 3, 4, 5, 6];
  print(list);

打印出结果

I/flutter (24300): [0, 1, 2, 3, 4, 5, 6]
  • Dart中List的下标索引和java同样都是从0开始。
  • Dart中List也支持泛型,这点和java同样,同时还能够进行泛型的判断。

    var list1 = List<String>();
     print(list1 is List<String>);
     输出:
     true
- 有增删改查的操做,支持倒叙,自带顺序,洗牌,可使用+将两个List合并。  
例如

var list = [0, 1, 2, 3, 4, 5, 6];
print(list);
var list2 = [7,8,9,10,11];

print(list+list2);
输出:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

##### Set
Dart里面的Set和Java相似,也是不能存放重复的元素。
- 两种初始化方式  
  Set有两种初始化方式

var setName = <dataType>{}
Set<dataType> setName ={}

-   大部分操做是和Java相似的  
**不一样的地方:**
-   difference:返回set1集合里面有可是set2里面没有的元素集合

Set<String> set1 = {"1","2","3","4","5"};
Set<String> set2 = {"1","2","3"};
print(set1.difference(set2));
输出:
{4, 5}

-  intersection:返回set1和set2的交集

Set<String> set1 = {"1","2","3","4","5"};
Set<String> set2 = {"1","2","3"};
print(set1.intersection(set2));
输出:
{1, 2, 3}

-  union:返回set1和set2的并集

Set<String> set1 = {"1","2","3","4","5"};
Set<String> set2 = {"1","2","3"};
print(set1.union(set2));
输出:
{1, 2, 3, 4, 5}

-  retainAll:set1只保留某些元素(要保留的元素要在原set中存在)  
##### Map
和Java相似

##### Runes
Runes再Dart当中是字符的UTF-32的编码

Main(){
Runes runes = new Runes('u{1f605} u6211‘);
var str1 = String.fromCharCodes(runes);
print(str1);
}

##### Symbol
Symbol标识符,主要是反射的做用,如今再mirrors模块已经被移除了。

### 函数
#### 定义
整体来讲,和java相似。  
其余几个特单:
- 可在函数内定义
- 定义函数时能够省略类型
- 支持缩写语法=>

int add(int a, int b) => a + b;

#### 可选参数
- 能够选择命名参数
- 能够选择位置参数
- 能够添加默认参数

printer(num n,{String s1, String s2}) { 
  print(n); 
  print(s1); 
  print(s2);
}

main() {
  printer(75, s1: 'hello');
}

printer(num n,{String s1, String s2}) { 
  print(n); 
  print(s1); 
  print(s2);
}

main() {
  printer(75);
}

printer(num n,{String s1, String s2}) { 
  print(n); 
  print(s1); 
  print(s2);
}

main() {
  printer(75, s1: 'hello', s2: 'there');
}

String mysteryMessage(String who, [String what, String where]){
  var message = '$who';
  if(what != null && where == null){
    message = '$message said $what';
  } else if (where != null){
    message = '$message said $what at $where';
  }
  return message;
}

main() {
  var result = mysteryMessage('Billy', 'howdy', 'the ranch');
  print(result);
}

#### 匿名函数
- 能够赋值给变量,经过变量调用
- 能够在其余函数当中直接调用或者传递给其余函数

//匿名函数
//赋值给变量
//无参匿名函数
var anonFunc1 = () => print('无参匿名函数');
anonFunc1();

//有参匿名函数
var anonFunc = (name) => 'I am $name';
print(anonFunc('damon'));

//经过()调用,不推荐
// (()=>print('不推荐'))();

//匿名函数传参
List test(List list, String func(str)) {

for (var i = 0; i < list.length; i++) {
  list[i] = func(list[i]);
}
return list;

}

var list = ['d', 'a', 'm', 'o', 'n'];
print(test(list, (str) => str 2)); //String int, Dart和Python能够这样用

//List.forEach()就用的匿名函数
List list1 = [11, 12, 13];
list1.forEach((item) => print('$item'));

//返回Function对象(闭包)
Function makeAddFunc(int x) {

x++;
return (int y) => x + y;

}

var addFunc = makeAddFunc(2);
print(addFunc(3));

// 函数别名
MyFunc myFunc;
//能够指向任何同签名的函数
myFunc = subtsract;
myFunc(4, 2);
myFunc = divide;
myFunc(4, 2);
//typedef 做为参数传递给函数
calculator(4, 2, subtsract);
}

//函数别名
typedef MyFunc(int a, int b);
//根据MyFunc相同的函数签名定义两个函数
subtsract(int a, int b) {
print('subtsract: ${a - b}');
}

divide(int a, int b) {
print('divide: ${a / b}');
}
//typedef 也能够做为参数传递给函数
calculator(int a, int b, MyFunc func) {
func(a, b);
}

### 逻辑运算
#### 操做符
操做符大部分也和Java相同。
![image.png](https://upload-images.jianshu.io/upload_images/3258163-b89121a9a690e641.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

标红的是不一样的,下面着重介绍一下。
##### ?.
  条件成员访问 和 . 相似,可是左边的操做对象不能为 null,例如 foo?.bar 若是 foo 为 null 则返回 null,不然返回 bar 成员。

String a;
print(a?.length);
输出null

String a="aaa";
print(a?.length);
输出 3

#####  ~/ 
取商操做符   
被除数 ÷ 除数 = 商 ... 余数,A ~/ B = C,这个C就是商。至关于Java里的 /

#####   :as、is、is!
类型断定操做  
类型断定操做符:as、is、is!在运行时断定对象类型

//as 类型转换
num iNum = 1;
num dNum = 1.0;
int i = iNum as int;
double d = dNum as double;
print([i, d]);

// String s = iNum as String;

//is 若是对象是指定的类型返回 True
print(iNum is int);
Child child;
Child child1 = new Child();
print(child is Parent); //child is Null
print(child1 is Parent);

//is! 若是对象是指定的类型返回 False
print(iNum is! int);

##### ..
级联操做符  
连续调用多个函数以及访问成员变量。  
两个点的级联语法不是一个操做符。 只是一个 Dart 特殊语法。

StringBuffer sb = new StringBuffer();
sb

..write('dongnao')
..write('flutter')
..write('\n')
..writeln('damon');
#### 流程控制语句
- if else
- for,forEach,for-in
- while,do-while
- break,continue
- switch case
- assert   
大部分使用方法都是和Java相同的。  
不一样的有
##### for-in

var colorList = ['black','red','yellow'];
for(var i in colorList){

print(i);

}
输出:
I/flutter (31601): black
I/flutter (31601): red
I/flutter (31601): yellow

##### assert  
断言,它能够为代码执行设置条件,用于bool条件为false时中断正常的运行。  
assert(condition,optional,message)

var variable;
print(variable);
assert(variable!=null);
variable = 6;
print(variable);
输出:
[ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: 'package:flutter_app/main.dart': Failed assertion: line 50 pos 10: 'variable!=null': is not true.

## 最后
这一篇文章,咱们详细的介绍了一下Dart语言的基本语法,了解Java的同窗,对这些应该不陌生。接下来一篇文章,会对Dart语言继续进行详细介绍,让你们对Dart有一个高阶,全面的认识。

​**Flutter**已是**Top20**的软件库,经过接下来的一系列的文章,但愿我和你们一块儿来学习**Flutter**,一块儿进步,一块儿有所收获,掌握将来技术主流的主动权!

有什么好的建议,意见,想法欢迎给我留言!

### 欢迎关注公共号
#### 关注公众号会有更多收获!
![image.png](https://upload-images.jianshu.io/upload_images/3258163-82c59daaf3da2cb6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

![](https://upload-images.jianshu.io/upload_images/3258163-635809c97c6586e8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
相关文章
相关标签/搜索