Dart是谷歌开发的计算机编程语言,后来被Ecma (ECMA-408)认定为标准 [1] 。它被用于web、服务器、移动应用 [2] 和物联网等领域的开发。它是宽松开源许可证(修改的BSD证书)下的开源软件。
Dart是面向对象的、类定义的、单继承的语言。它的语法类似C语言,可以转译为JavaScript,支持接口(interfaces)、混入(mixins)、抽象类(abstract classes)、具体化泛型(reified generics)、可选类型(optional typing)和sound type system
1.注释
//单行文本 (灰色)
///单行文本 (彩色)
/**
* 多行文本
*/
2.导包
- 2.1 在 import口语句后面需要接上库文件的路径 import 'dart:io’,对 Dart 语言提供的库文件使用 dart:xx 格式如下:
import 'dart:core';
- 2.2 导入第三方库使用package:xx,格式如下
import 'package:flutter/material.dart';
- 2.2.1 当引用的库拥有相互冲突的名字,可 以 为其中一个或 几个 指定不一样的前缀 。 这与命 名 空 间的概念比较接近,示例代码如下:
// 导入lib1
import 'package:libl/ libl.dart’;
// 导入lib2
import ’package:lib2/lib2.dart’ as lib2;
// 使用lib1 默认
Element element1 = new Element(); // 使用 libl
// 使用lib2
Element element2 = new lib2.Element();// 使用 lib2 中的 Element
总结:libl/libI.dart及 lib2/lib2.dart里都有 Element类,如果直接引用就不知道具体引用哪 个 Element类,所以代码中把 lib2/lib2.dart指定成 lib2,这样使用 lib2.Element就不会发生冲突。
- 2.2.2 如果只需要使用库的一部分内容,可以有选择地引用,有如下关键字:
-- show关键宇:只引用一点。
-- hide 关键字:除此之外都引用 。示例代码如下 :
// 导入foo
import ’ package:libl/libl.dart ’
// 除了 foo 导入其他所有内容
import 'package:lib2 / lib2.dart ’
show foo;
hide foo;
// 代码中的第一行只引用 libI.dart下的 foo部分,第二行代码引用 lib2.dart下的所有内容 除了 foo。
3.数据类型。在看代码前我们要了解一点
Dart中字符串打印可以用{text}"
//-----------整数-----------
int n01 = 1;
var n02 = 2;
print("整数类型 n01:${n01} n02:${n02}");
//-----------小数-----------
double d01 = 1.0;
var d02 = 1.1;
print("小数类型 d01:${d01} d01:${d02}");
//-----------boolean-----------
bool f01 = false;
var f02 = true;
print("布尔表达 f01:${f01} f02:${f02}");
//-----------字符串-----------
String s1 = "s1";
String s2 = "s2";
String s3 = s1 + " : " + s2; //注意字符串连接只可在方法体内使用,在全局声明必须是静态的,否则会报错
var s4 = "s4";
var s5 = "s5";
var s6 = s4 + s5;
print("字符串 s3:${s3} s6:${s6}");
//if判断
var sex = "boy";
if (sex == "boy") {
print("sex 里面的if 判断:" + sex);
}
4.list、map和set 使用和声明
//-----------list -----------
//list整数
var list01 = [1, 2, 3, 4, 5, 6];
for (int i = 0; i < list01.length; i++) {
print("list and for循环之list01 :${list01[i]} list01长度:${list01.length} ");
}
//list字符串
var list02 = ["第一名", "第二名", "第三名", "第四名", "第五名"];
for (int i = 0; i < list02.length; i++) {
print("list and for循环之list02 : ${list02[i]}");
}
//list 直接声明
var list03 = new List();
list03.add("0");
list03.add("1");
list03.add("2");
print("list03 :${list03[0]} ${list03[1]} ${list03[2]}");
List list04 = new List();
list04.add("3");
list04.add("4");
list04.add("5");
print("list04 : ${list04[0]} ${list04[1]} ${list04[2]}");
//-----------set-----------
var set01 = new Set();
set01.add("set01");
set01.add("set02");
set01.add("set03");
for (int i = 0; i < set01.length; i++) {
print("set 01 data :${set01.elementAt(i)} ");
}
//-----------map-----------
var map01 = {"a": 1, "b": 2, "c": 3, "d": 4, "e": 5};
//转换为set
Set map01Setkey = map01.keys.toSet();
Set map01SetValue = map01.values.toSet(); //value
//for循环获取key 和value
for (int i = 0; i < map01SetValue.length; i++) {
print(
"map 01 整数 key:${map01Setkey.elementAt(i)} value:${map01SetValue.elementAt(i)}");
}
var map02 = {
"a01": "str0",
"a02": "str1",
"a03": "str2",
"a04": "str3",
"a05": "str4"
};
//迭代map
Iterable keys = map02.keys;
//foreach
for (String key in keys) {
print("迭代map : ${map02[key]}");
}
4.Dart函数具有以下特点
.所有的函数都会有返回值 。
.如果没有指定函数返回值, 则默认的返回值是null。
..没有返回值的函数,系统会在最后添加隐式的 return语句。
.main 函数, 的代码表示应用要启动 MyApp 类:和其他语言一样作为程序的人口函数
void showText01() {
print("showText01 无参函数");
}
//带参无返回值函数
void showText02(int a, int b) {
int c = a + b;
print("showText02 无返回值 函数:${c}");
}
//带参返回值函数
bool showText03(int a, int b) {
if (a == b) {
return true;
}
return false;
}
// **** 可选参数 [] 中括号括起来,必须在最后****
void showText04(int a, [String from, String str]) {
print("showText04 ${a} 可选参数长度:${from} ");
}
使用方法跟其它一样,要注意可选参数的使用
showText01();
showText02(1, 2);
print("showText03 返回值函数:${showText03(3, 3)}");
showText04(3, "只填写一个"); //可选参数,也可以不填
5.运算符
.算术运算符
//算术运算
var a = 5;
a++; //6
var b = 5;
b--; //4
var c = a + b; //10
var d = c; //10
var e = 10 * 10; //100
var f = 100 / 10; //10
var g = 10 % 3; //1
print("a++:${a} b--:${b} c=a+b:${c} d=c:${d} e:${e} f:${f} g:${g}");
.关系运算符
//逻辑关系运算
var h = g == 1 ? 5 : 3; //5
print("三元运算 :${h}");
//== >= <= != > <
var equalA = 1;
//等等于==
if (equalA == 1) {
print("等等于 :");
}
if (equalA != 2) {
print("不等于 :");
}
.as类型转换 is对象相当类型时返回true(是否属于) is! 当对象不是相当类型时返回true(不属于)
User userChild = new User();
if (userChild is User) {
print("userChild is 属于 _User");
}
if (userChild is FUser) {
print("userChild is 属于 _FUser 因为是user的父类");
}
if (userChild is! Manager) {
print("userChild is 不属于 Manager");
}
//类型转换
userChild.name = "My is user";
User userText01 = userChild as User; //正确表示
FUser userText02 = userChild as FUser; //正确表达,子类属于父类
User userText03 = userText02 as FUser; //正确表达,父类转子类,因为上面是有
print("userText01 as _User - userText.name:${userText01.name} \n userText03.name:${userText03.name}");
使用到的类:
//用户表父类
class FUser {
String type;
}
//继承类,多继承后面讲
class User extends FUser {
String name;
int age;
}
class Manager {
String text;
}
.赋值运算符,dart有个级联操作符使用非常方便,使用表达..
//赋值操作符
var assign01 = 5;
var assign02 = assign01; //赋值给assign02
String assign03 = "??=赋值操作";
String assign04 = null;
String assign05 = "不为空不赋值";
assign04 ??= assign03; //赋值
assign05 ??= assign03; //不赋值,保持原来的值
print("赋值操作符 - assign02:${assign02} assign03:${assign03} assign04:${assign04} assign05:${assign05}");
//级联操作用两个点(..)表示,可对同一对象执行一系列操作。 类似于 Java语言里点点 点处理或 JavaScript 里的 Promise 的 then 处理
User user01 = new User()
..name = "级联操作"
..age = 82;
print("级联操作user01 name:${user01.name} age:${user01.age}");
级联操作符使用到的类:
class User {
String name;
int age;
}
6.流程控制语句
控制语句包含if else ... switch ...for ...while 等
.条件判断if else ... switch case
//条件判断 if else ... switch case
var condition01 = 5;
if (condition01 == 5) {
print("condition01 = 5 否和条件执行 if");
}
switch (condition01) {
case 3: //不否和
print("condition01 = 3 不否和条件不执行");
break;
case 4:
print("condition01 = 4 不否和条件不执行");
break;
case 5:
print("condition01 = 5 否和条件执行 switch");
break;
}
.循环 for .. while .. do while .. foreach
for (int i = 5; i < 5; i++) {
print("for循环执行次数:${i}");
}
int while01 = 5;
while (while01 > 0) {
while01--;
print("while 循环次数:${while01}");
}
while01 = 5;
do {
while01++;
print("do while循环即使不否和条件也会执行一次 : ${while01}");
} while (while01 <= 5);
//continue 和 break 高级用法
for (int i = 0; i < 5; i++) {
if (i == 1) {
print("循环中continue 是结束本次循环,开始下一次循环,也就是continue后的代码在本次循环中后面的代码不执行");
continue;
}
if (i == 3) {
print("循环中break 是结束循环,即使否和条件也不在执行");
break;
}
print("循环中continue 和 break 高级用法:${i}");
}
7.异常处理
//--------------异常处理-----------
try {
assert( 1 == 5); //不否和会终止抛异常
// throw new NullThrownError();//创造一个异常
} on Exception catch (e) {
//在这里可以捕捉异常
print("捕捉到了异常");
} finally {
print("无论有没有异常都会执行");
}
8.类、构造函数
Dart构造函数,有多种样式,例如声明带参数,声明直接赋值,命名构造函数,
函数列表等。Dart的get和set都是隐士的。用对象.变量可以直接赋值和取值
class StructureTest {
String only;
String method;
// final String max;
// final String min;
//第一种 声明带参数
// StructureTest(String only,String method){
// this.only = only;
// this.method = method;
// }
//第二种 直接赋值
StructureTest(this.only, this.method);
//第三种 命名构造函数
StructureTest.fromMap(Map map) {
only = map["only"];
method = map["method"];
}
//第四种 构造函数列表
// StructureTest(max,min) : max = max,min = min;
}
使用:
var structureTest = new StructureTest("only ", "method ");
print("构造函数:${structureTest.only} ${structureTest.method}");
var structureMap = new Map();
structureMap["only"] = "mapOnly";
structureMap["method"] = "mapMethod";
var structureTest2 = StructureTest.fromMap(structureMap);
print("构造函数 命名构造函数: ${structureTest2.only} ${structureTest2.method}");
StructureList structureList = new StructureList("list name", "list age");
print("构造函数 函数列表: ${structureList.name} ${structureList.age}");
9.抽象类abstract关键字修饰
声明一个抽象类
abstract class MyAbs {
void add();
void less();
}
继承抽象类
//继承抽象类
class MyAbsChild extends MyAbs {
@override
void add() {
// TODO: implement add
print("实现了抽象类add方法");
}
@override
void less() {
// TODO: implement less
print("实现了抽象类less方法");
}
}
那如果是多个类继承怎么办呢?Dart提供了with关键字
声明多个类:
class MyAbsTest01 {
void test01() {
print("my abs test01 method");
}
}
class MyAbsTest02 {
void test02() {
print("my abs test02 method");
}
}
class MyAbsTest03 {
void test03() {
print("my abs test03 method");
}
}
多个类继承
//实现多继承 with
class MyAbsWith extends MyAbsTest01 with MyAbsTest02, MyAbsTest03 {
void inputTest() {
test01();
test02();
test03();
}
}
使用:
MyAbsWith myAbsWith = new MyAbsWith();
myAbsWith.inputTest();
10.枚举 enum修饰
enum MyColor {
red, blue
}
使用:
var eValues = MyColor.values; //获取所有颜色
MyColor eColor = MyColor.blue;
switch (eColor) {
case MyColor.red:
print("枚举执行的 red");
break;
case MyColor.blue:
print("枚举执行的 blue");
break;
}
11.泛型
//泛型可以包含所有数据类型,int 、string、bool、类对象等
class MyT {
void generic(T t) {
print("执行了泛型:${t}");
}
}
使用:
MyT myT = new MyT();
myT.generic("泛型 string类型");
MyT myT02 = new MyT();
myT02.generic(999999);
12.异步处理
用 async修饰的为异步方法。await使用一定要在async修饰的方法内使用。
//异步 async关键字
int asyncAwait(){
return 8;
}
void asyncHandler() async{
// await关键字必须在async函数内部使用
int str = await asyncAwait();
print("执行 asyncHandler:${str}");
}