这篇文章给大家聊聊关于深入Flutter核心:Dart语言基础入门教程(第一部分),以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。
在开发Dart之前,需要安装Dart SDK。官网有介绍安装方法:https://dart.dev/get-dart。如果您想直接开发Flutter,则无需下载此SDK,直接安装Flutter即可。 Dart 包含在Flutter 开发套件中。
二、语法基础
1. 入口方法
Dart语言文件格式为.dart,以main方法作为程序的入口点。我们使用VSCode 创建demo1.dart 文件。代码如下:
主要的(){
print("你好飞镖!"); //输出结果:hello dart!
}Dart 语言有很多缩写。上面的main方法是缩写。完整的写法如下:
无效主(列表参数){
print("你好飞镖!");
}参数以泛型形式书写,List是列表,在其他语言中是数组。 main方法可以接收从命令行输入的参数,可以在程序中通过args参数获取。下面的代码:
无效主(列表参数){
print("你好飞镖!");
打印(参数);
通过命令行运行dart 文件。首先cd到目标文件夹并运行以下命令:dart demo1.dart arg1,arg2。输出结果如下:
你好达特!
[arg1,arg2]一般情况下,使用省略的方法即可。
Dart中的print方法不支持多参数打印,其函数原型如下:
无效打印(对象对象);只支持单参数打印,但是可以使用字符串插值的方式打印多个参数,使用$美元符号,例如打印两个变量a和b,如下:
打印(‘$a$b’);上面是利用字符串插值进行多参数打印,但本质上还是单参数,只是利用了字符串的插值特性来输出多个参数。当然,你仍然可以使用多次打印来打印多个参数。
2. 数据类型
Dart中的所有类型都是对象,基本数据类型也是对象,每种类型都有自己的方法和属性。 Dart 支持自动类型推断,因此在定义数据类型时,可以通过两种方式定义,直接使用特定数据类型定义或使用var 关键字。当使用var定义时,编译器会根据具体的赋值数据类型推断所定义的变量或常量的数据类型。
您可以使用runtimeType来查看对象的运行时类型。
因为Dart中所有类型都是对象,所以定义一个数据类型后,如果不初始化,它的默认值为null。
在Dart 中,变量区分大小写。
**2.1.1 数字类型(Numbers)**
Dart 中有两种数字类型,整数(int)和小数(double)。它们继承自num 类。使用直接数据类型定义如下:
主要的(){
整数a=10;
双b=20.1;
打印(一); //输出10
打印(b); //输出20.1
print(a+b);////输出30.1
} 也可以定义如下:
主要的(){
变量a=10;
var b=20.1;
打印(一);
打印(b);
打印(a+b);
打印(a.runtimeType); //输出整数
}输出结果与上面相同。通过下面的方式,编译器会自动推断出具体的数据类型。
在Dart 中,可以使用十进制和十六进制进行整数赋值,但不能使用其他基数。
2.1.2 字符串类型 (Strings)使用关键字String来声明字符串类型。该字符串用单引号或双引号括起来。 Dart中的字符串是UTF-16编码的,如下:
主要的(){
String str1="你好飞镖!";
var str2="你好世界!";
打印("$str1 $str2"); //输出你好飞镖!你好世界!
定义变量时也可以直接赋值多个字符串,如下:
主要的(){
String str="你好,飞镖! " "这是"
"一个字符串";
打印(字符串); //输出你好飞镖!这是一个字符串
}正如您在上面的代码中看到的,我们定义了一个变量,但分配了三个字符串。编译器会将三个字符串合并为一个字符串进行处理。但是虽然我们把字符串写成两行,但是输出时却没有分行,即定义和输出格式不同。如果需要定义并输出相同的,可以使用以下方法:
主要的(){
//1.使用转义符n进行换行操作
String str="你好,飞镖! n这是一个字符串";
打印(字符串);
//2.使用``` 或""" 将字符串包装成多行字符串。使用该方法时需要注意字符串的对齐方式。字符前面的空格会被包含在内,左边界是编译装备装备
var str1="""你好,达特!
这是一个字符串""";
打印(str1);
}输出结果如下:
你好达特!
这是一个字符串
你好达特!
这是一个字符串,可以使用加号和插值来拼接,如下:
主要的(){
字符串a="你好";
String b="飞镖!";
打印(a + b); //输出你好飞镖!
打印("$a$b"); //输出你好飞镖!
使用字符串插值进行拼接时,如果$后面是标识符,则可以直接使用。如果是表达式,需要用{}包含表达式,如下:
主要的(){
字符串a="你好";
String b="飞镖!";
打印(a + b);
print("${a.runtimeType} ${b.runtimeType}"); //这里需要用{}将表达式括起来,作为标识符
}在Dart中,字符串也是一种集合类型。您可以按如下方式获取字符串中的单个字符:
主要的(){
String str="你好飞镖!";
打印(str[0]); //输出h
打印(str[4]); //输出o
}下标从0开始。
您还可以通过运算符复制字符串,如下所示:
主要的(){
String str="你好飞镖!";
打印(字符串*2); //输出hello dart!hello dart!
}使用以下方法原样输出字符串,包括里面的转义字符:
主要的(){
var str=r"这是一个n字符串!";
打印(字符串); //输出这是一个n字符串!
}2.1.3 布尔类型 (Booleans)在Dart 中,布尔类型只有两个字面值:true 和false。
主要的(){
布尔a=真;
var b=false;
打印(‘$a$b’); //输出真假
打印(b.runtimeType); //输出布尔值
如上所述,Dart 中的所有类型都是对象。如果定义bool类型时没有初始化,则其默认值为null,在进行条件判断时会报异常,如下:
主要的(){
布尔c;
如果(c){
打印(c);
}
上面的代码编译不会报错,但是运行时会报如下异常:
未处理的异常:
断言失败: 布尔表达式不能为空。因此,在使用bool类型进行条件判断时,如果存在为空的可能,首先应该判断是否为null,而Dart中的条件判断必须使用bool类型。其他类型会导致编译错误。
2.1.4 集合类型列表 (Lists)列表用于存储一组数据。在很多其他编程语言中,列表也被称为数组,所以和其他语言一样,下标从0开始,最后一个数据元素的下标是lenght-1。列表的具体数据类型由中的元素类型决定它的用法如下:
主要的(){
var arr=[1, 2, 3];
var arr1=[1, 2, 3, "字符串"];
列表arr2=[1, 2, 3];
列表arr3=[1, 2, 3, "字符串"];
print("$arr ttt ${arr.runtimeType}");
print("$arr1 t ${arr1.runtimeType}");
print("$arr2 ttt ${arr2.runtimeType}");
print("$arr3 t ${arr3.runtimeType}");
}输出结果如下:
[1, 2, 3] List[1, 2, 3, string] List[1, 2, 3] List[1, 2, 3, string] List 直接创建List并按上述方式进行初始化操作,并定义一个空列表。只需使用var arr=[]; 即可。需要注意的是,如果不进行初始化,其数据类型为null。即使是使用List arr;定义的,它的runtimeType类型也是Null。
还可以使用构造函数方法创建数组,如下所示:
主要的(){
var arr=new List(); //创建一个空列表
var arr1=新列表(3); //创建一个长度为3的列表并用null填充
var arr2=new List.filled(3, 1); //创建一个长度为3的列表,并用整数数据1填充它
var arr3=new List.filled(3, "a"); //创建一个长度为3的列表并用字符串a填充它
print("$arr t ${arr.runtimeType}");
print("$arr1 t ${arr1.runtimeType}");
print("$arr2 t ${arr2.runtimeType}");
print("$arr3 t ${arr3.runtimeType}");
}输出如下:
[] List[null, null, null] List[1, 1, 1] List[a, a, a] List是Dart中的,但是省略了new关键字,如下:
主要的(){
var arr=列表(2);
arr[0]=10;
arr[1]="str";
print("$arr t ${arr.runtimeType}"); //输出[10, str] Listprint(arr.length); //输出2
}上面创建的列表可以存储任何类型的数据。如果要存储固定类型的数据,可以使用泛型进行数据类型约束。用法如下:
主要的(){
列表=["str1", "str2"];
打印(arr); //输出[str1,str2]
var arr1=列表();
arr1.add(1);
arr1.add(2);
打印(arr1); //输出[1, 2]
}创建固定数据类型的列表。如果添加其他数据类型,编译器会报错。
集合 (Sets)Set与List类似,但Set是无序列表,因此无法通过下标访问。 Set中不能有重复的数据。如果存在重复数据,则仅保留一份数据副本。依靠这个特性,Set一般用来对列表进行去重。
主要的(){
集合集合={1,2,3,4,2};
打印(设置); //输出{1,2,3,4}
var set1={"str1", "str2", "str1", 1, 2, 3, 2};
打印(设置1); //输出{str1, str2, 1, 2, 3}
var set2=Set();
set2.add(1);
set2.add(2);
set2.add(2);
set2.add("str");
打印(设置2); //输出{1, 2, 字符串}
Setset3=Set();
set3.add(1);
//set3.add("str"); //错误
打印(设置3); //输出{1}
设置set4=Set();
打印(设置4); //输出{}
}数组去重处理,如下:
主要的(){
var arr=[1, 2, 3, 4, 5, 6, 3, 4];
设置set=Set.from(arr);
var arr1=List.from(set);
打印(arr1); //输出[1,2,3,4,5,6]
}字典 (Maps)字典是键值对的集合。通过按键可以完成值的修改、查找、添加或删除。键(key)必须是唯一的。创建一个Map类型,键和值成对出现。一般键都是字符串类型,但是Dart并没有严格限制键的数据类型,所以键可以是任意类型,值也可以是任意类型。如果需要创建固定类型的键值,可以通过泛型来约束。
主要的(){
var 映射1={
"姓名" : "张三",
‘年龄’: 20
};
var 映射2={
1 : 20,
2 : 30.2
};
地图map3={
"姓名" : "丽丝",
1 : [1,2,3]
};
地图map4=new Map();
地图map5=Map.from(map1);
地图地图6={
‘号码’: 1,
‘年龄’: 20
};
地图map7=Map();
map7["名字"]="旺格";
map7["年龄"]=20;
打印(地图1); //输出{name: zhangsan,age: 20}
打印(地图2); //输出{1: 20, 2: 30.2}
打印(地图3); //输出{name: lisi, 1: [1, 2, 3]}
打印(地图4); //输出{}
打印(地图5); //输出{name: zhangsan,age: 20}
打印(地图6); //输出{number: 1,age: 20}
打印(地图7); //输出{name:旺格,age: 20}
}2.1.5 泛型泛型,即通用类型,使Dart中的类型更加动态,提高代码复用性。 Dart中定义泛型的方法,T是标识符或者关键字,一般用T表示。上面的例子也是使用泛型来约束数据类型,比如列表:
主要的(){
var arr=列表();
arr.addAll(["str1", "str2", "str3"]);
打印(arr); //输出[str1,str2,str3]
}2.1.6 符文 (Runes)Runes 是字符串的UTF-32 代码点。要表示字符串中的32 位Unicode 值,可以使用uxxxx 形式。 xxxx 是四位十六进制值。如果多于或少于四位数字,则需要使用{} 换行。
主要的(){
var 值="u{1F362}";
打印(值); //输出
}2.1.7 符号类型 (Symbols)符号表示运算符或标识符。以相同名称创建的符号是相等的。创建符号有两种方法:
主要的(){
var symb=符号("s"); //通过构造方法创建符号
var symb1=#s; //通过#创建符号
打印(symb.runtimeType); //输出符号
打印(symb1.runtimeType); //输出符号
如果(符号==符号1){
打印("相同");
}
}2.1.8 常量上面声明的变量都是变量变量,即变量。有时需要一些数据是不可变的,这称为常量。在Dart 中,可以使用关键字const 或final 来定义常量,如下所示:
主要的(){
常量a=10; //声明具体数据类型和var关键字
最终字符串b="你好飞镖!";
打印(‘$a$b’); //输出你好世界!你好达特!
print("${a.runtimeType} ${b.runtimeType}"); //输出字符串字符串
可见,声明常量时,可以省略其数据类型,编译器会自动推断。使用const或final声明的常量是不能改变的,定义常量时需要在定义的同时进行初始化,否则会报错。如果尝试重新复制常量,也会报错。
在上面的代码中,使用const和final声明的常量的最终数据类型是String。那么它们之间具体有什么区别呢?
const定义的常量在定义时必须赋常量值,不能通过表达式或者函数赋值(常量表达式都可以),而final定义的常量可以通过表达式或者函数赋值,也就是说const常量作为compile -time常量,它们必须在编译阶段就已知,而final常量只能被赋值一次,但可以在运行时设置。如下:
主要的(){
常量a=10;
最终b=20.5;
常量c=a ;
最终d=a;
//const e=a+b; //错误
最终f=a + b;
常量g=a * 10; //正确,因为a是常量,常量表达式的值可以在编译时确定
打印(一); //输出10
打印(b); //输出20.5
打印(c); //输出10
打印(d); //输出10
打印(f); //输出30.5
打印(g); //输出100
}const 还可以用于创建常量值并声明创建常量值的构造函数(将在后面的文章中介绍)。创建常量值如下:
主要的(){
列表a=const [1, 2, 3];
列表b=const [1, 2, 3];
如果(a==b){
打印("相同"); //将输出相同的
}
}如果不使用const修饰,a和b是不同的,如下:
主要的(){
列表a=[1, 2, 3];
列表b=[1, 2, 3];
如果(a==b){
打印("相同");
}否则打印("不同"); //输出不同
并声明可以使用以下方法更改创建的常量的值:
主要的(){
列表a=const [1, 2, 3]; //可以改变
常量b=[1, 2, 3]; //不能改变
a=[4, 5, 6];
打印(一);
}但是const[1,2,3]中的单个数据元素不能被修改,修改会抛出异常。 a变量之所以是变量,是因为它没有被const修饰,所以重新赋值a[4,5,6]后,a对象就等价于下面的定义:
var a=[4, 5, 6];通过以下代码验证:
主要的(){
var a=const [1, 2, 3];
var b=const [4, 5, 6];
a=[4, 5, 6];
如果(a==b){
打印("相同");
}别的{
打印("不同"); //输出不同
}
}下面的代码是修改const[1,2,3]单个元素时抛出异常的示例:
主要的(){
var a=const [1, 2, 3];
a[0]=10; //错误,无法修改
}2.1.9 动态数据类型如果确定数据类型后赋值其他数据类型,则会报错,如下:
主要的(){
变量a=10;
a=20.1; //错误
}上面的代码会报如下错误:
不能将“double”类型的值分配给“int”类型的变量。
尝试更改变量的类型,或将右侧类型强制转换为"int".dart(invalid_assignment) 如果您希望在分配一种数据类型后为变量分配另一种数据类型,您可以使用关键字动态定义,如如下:
主要的(){
动态a=10;
打印(a.runtimeType); //输出整数
a=20.1;
打印(一); //输出20.1
打印(a.runtimeType); //输出双精度
}dynamic的最终数据类型是最后分配的数据的类型。
2.2.0 枚举 (enum)枚举周{
周一,
周二,
周三
}
主要的(){
var week=Week.Tuesday;
if(week==Week.Monday){
打印("星期一");
}else if(week==Week.Tuesday) {
打印("星期二");
}else if(week==Week.Wednesday) {
打印("星期三");
}
打印(周.值); //输出所有枚举值
打印(周.星期一.in
dex); //输出索引值 print(Week.Tuesday.index); print(Week.Wednesday.index); }输出结果: 星期二 [Week.Monday, Week.Tuesday, Week.Wednesday] 0 1 23. 类型转换
main(){ var a = 10; var b = 20.5; var c = a + b.toInt(); //浮点型转整型 var d = a.toDouble() + b; //整型转浮点型 String e = b.toString(); //浮点型转字符串 double f = double.parse(e); //字符串转浮点,使用此方法应确定字符串可转换为浮点型,否则会报异常,如不确定是否可以转换应使用tryParse方法,无法转换会返回null print("$c $d $e $f"); }4.Object与dynamic的区别
因为在 Dart 中,所有内容都是从Object类扩展而来,所以可以使用如下方式定义数据: Object a = 10;与dynamic对比,他们都可以定义一种数据类型以后再次赋值其他数据类型,如下: main(){ Object a = 10; a = "string"; print(a); //输出 string dynamic b = 20; b = "string"; //输出 string print(b); }但是Object定义的对象在调用方法或属性是,可以在编译时就判断是否存在指定的方法或属性,如不存在,编译阶段就会报错。而dynamic动态类型,调用不存在的方法或属性,在编译阶段不会报错,运行时才会抛出异常,如下: main(){ Object a = 10; print(a); dynamic b = 20; print(b); // a.run; 调用不存在的属性run,编译时就会提示错误 b.run; //编译时不会提示错误,运行时才会抛出异常【深入Flutter核心:Dart语言基础入门教程(第一部分)】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
终于轮到学习 Dart 了!我之前一直想试试 Flutter
有19位网友表示赞同!
从基础开始学 Flutter 就太好了,这样能打好根基
有16位网友表示赞同!
Dart 语法看起来挺简洁的,期待深入了解
有14位网友表示赞同!
Flutter 的应用越来越火了,掌握 Dart 会更有优势
有17位网友表示赞同!
这篇文章刚好适合我,我刚接触 Flutter 还不熟悉 Dart
有13位网友表示赞同!
学习编程语言总感觉是一段冒险!希望我能轻松学会 Dart
有8位网友表示赞同!
基础篇最重要啊,只要把底部打牢了后面再学别的就容易多了
有7位网友表示赞同!
要好好跟着这篇文章一步步来,不要跳过任何步骤
有20位网友表示赞同!
学习新技能的兴奋感真好啊!期待成为 Flutter 方面的能手
有10位网友表示赞同!
看看 Dart 有哪些有趣的特性,也许能帮我开发一些创意 App
有16位网友表示赞同!
希望这篇文能讲解得清楚易懂,让我快速上手 Dart
有11位网友表示赞同!
这篇文章写得真好,很适合新手入门学习
有9位网友表示赞同!
分享一下学 Flutter 的经验,大家一起进步!
有17位网友表示赞同!
开始学习 Dart 了,加油!相信自己一定可以!
有8位网友表示赞同!
最近想转行做 Flutter 开发,从这里开始吧
有14位网友表示赞同!
希望我能应用 Dart 语法造就一些实用的 App
有7位网友表示赞同!
准备花时间好好学学 Dart,为了未来的职业发展
有12位网友表示赞同!
Dart 的学习之路充满了挑战,但我充满期待
有7位网友表示赞同!
Flutter 开发前景好,掌握 Dart 语言更上一层楼
有18位网友表示赞同!
这篇文是 Flutter 学习的好起点,感谢分享!
有19位网友表示赞同!