章节 | 介绍 |
---|---|
上: | 主要针对变量、内置类型、操做符、分支与循环讲解 |
中: | 主要讲解方法、类 |
下: | 主要讲解余下的和一些开发技巧补充 |
同时按照国际惯例使用Dart完成一个:"Hello,World!" 并输入运行结果:java
import 'dart:core';
void main() {
print('Hello,World');
}
复制代码
Dart中定义变量有两种方式:程序员
一切变量皆是对象,每一个对象都是类的实例。int、double、函数、 null 等都是对象,全部对象都继承自 Object 类。下面咱们看看如何声明变量:编程
变量是一个引用,未初始化的变量值是Null以下。swift
import 'dart:core';
void main() {
String name;
print('$name'); //输出为null
}
复制代码
上面咱们提到了显示指定变量类型以下:数组
import 'dart:core';
void main() {
String name ="黄药师";
int age =10;
print('$name''----$age'); //输出:黄药师----10
}
复制代码
动态语言的经常使用方式,不指定类型,由vm自动推断。安全
import 'dart:core';
void main() {
String name ="黄药师";
name ='周伯通';
print('$name'); //输出:周伯通
}
复制代码
Dart 语言是强类型语言,没法将一个已声明具体变量类型的变量赋值为另外一个无继承关系的变量markdown
import 'dart:core';
void main() {
String name ="黄药师";
name =10;
print('$name');
}
复制代码
这种赋值的时候就会报错:编程语言
import 'dart:core';
void main() {
int age =10;
age =10.0; //这种在赋值的时候就已经报错
print('$age');
}
复制代码
可是这个地方有个须要注意的地方就是int 和double 类都是num的子类以下面写法是合法。ide
import 'dart:core';
void main() {
num age =10;
age =10.0; //这种在赋值合法
print('$age');
}
复制代码
var:在声明变量在赋值的那一刻,就已经决定了它是什么类型。函数
上面这句话是什么意思尼?其实很简单:
import 'dart:core';
void main() {
//age 已经肯定为num类型并为其赋值18岁,若是你赋值字符串,那么就会报错
var age =18;
age ='18';
print('$age');
}
复制代码
import 'dart:core';
void main() {
//age 已经肯定为num类型并可是没有为其赋值,若是你赋值字符串那么是正确
var age;
age =18;
age ='18';
print('$age');
}
复制代码
一切变量皆是对象,每一个对象都是类的实例。int、double、函数、 null 等都是对象,全部对象都继承自 Object 类
import 'dart:core';
void main() {
Object age ='18';
age =18;
print('$age');
}
复制代码
dynamic相似java中的Object ,因此声明的变量行为与Object同样,使用也是同样,可是咱们须要知道的是:dynamic不是在编译时肯定类型的,而是在运行时:这句话有点懵,究竟是什么意思呢?
import 'dart:core';
void main() {
dynamic name ='黄药师';
print(name.runtimeType); //输入:String
name =18;
print(name.runtimeType); //输入:int
}
复制代码
在声明变量的时候,也能够选择加上具体 类型:String name = “黄药师”
没有初始化的变量自动获取一个默认值为 null(类型为数字的 变量如何没有初始化其值也是 null)。
final 和const 从本质上看不出区别:若是你但愿一个变量在赋值后其引用不能再改变,能够经过final或const这两个关键字来实现。
import 'package:flutter/cupertino.dart';
class TestDart extends StatefulWidget{
final String name;
TestDart(this.name);
@override
State<StatefulWidget> createState() {
// TODO: implement createState
return null;
}
}
class TestDartState extends State<TestDart>{
final String URL_NAME ="https://wwww.baidu.com";
@override
Widget build(BuildContext context) {
// TODO: implement build
return null;
}
}
复制代码
针对final 和const 理解的有点模糊的能够参考这篇文章: 能够参考这里Flutter 知识梳理(Dart)-Dart中static final const 区别
Dart中的操做符与面向对象语言中(如:java)操做符绝大多数是相同。该有的都有,不应有的Dart也有 。
操做符 | 说明 |
---|---|
+ | 加 |
_ | 减 |
* | 乘 |
/ | 除 |
% | 取模运算 元 |
~/ | 整除 |
=> | 箭头函数 |
import 'dart:core';
void main() {
var i = 6;
var r = 2;
//加法:
print('${i + r}'); //输出:8
//减法
print('${i - r}'); //输出:4
//乘法
print('${i * r}'); //输出:12
//除法
print('${i / r}'); //输出:3.0
//取模运算
print('${i % r}'); //输出:0
//整除
print('${i ~/ r}'); //输出:3
}
复制代码
as类型转换is若是对象是指定的类型返回 Trueis!若是对象是指定的类型返回 False
import 'dart:core';
void main() {
var name = "黄药师";
if (name is String) {
//判断条件为 true
print("name is String");
}
var age = 1;
if (age is! String) {
//判断条件为 true
print("age is String");
}
//说明:因为age 是int 类型 不是一个String类型,因此活报以下错误
//'int' is not a subtype of type 'String' in type cast
String newResult = age as String;
}
复制代码
操做符 | 说明 |
---|---|
= | 赋值操做符 |
+= | 加和赋值操做符 |
-= | 减和赋值操做符 |
*= | 乘和赋值操做符 |
%= | 取模和赋值操做符 |
/= | 除和赋值操做符 |
??= | 值为null的变量值 |
import 'dart:core';
void main() {
var age =20;
//加和赋值操做符
print('${age+=10}');
//减和赋值操做符
print('${age-=10}');
//乘和赋值操做符
print('${age*=10}');
//除和赋值操做符
double newAge =20.0;
print('${newAge /= 10.0}');
//取模和赋值操做符
double price =230.0;
print('${price %= 10.0}');
String name;
name ??= "黄药师";
// 若是 name 是 null,则把等于号右边的值 赋值给 name;
// 若是不是 null,则 name 的值保持不变
print("$name"); //输出:黄药师
}
复制代码
import 'dart:core';
void main() {
var age = 10;
print(printAge1(age));
print(printAge2(age));
print(printAge3(age));
}
//if-else
printAge1(age) {
if (age == 10) {
return age;
}
return age;
//输出:10
}
//第一种替换if-else 使用三目运算符
printAge2(int age) {
return age == 10 ? age : 0; //输出:10
}
//第二种用"??"替换if-else
printAge3(int age) {
return age == 10 ?? 0; //输出:true
}
复制代码
级联操做符 (..) 能够在同一个对象上 连续调用多个函数以及访问成员变量。 使用级联操做符能够避免建立 临时变量, 而且写出来的代码看起来 更加流畅:
import 'dart:core';
void main() {
var list = List();
print("${list..add("黄药师")..add("郭靖")}"); //输出:黄药师,郭靖
}
复制代码
Dart提供了 ?.操做符。左边的操做对象 若是 为 null 则返回 null
import 'dart:core';
void main() {
String name;
//没有添加"?"空指针
print(name.length); // The getter 'length' was called on null.
//添加"?"
print(name?.length); //输出null
}
复制代码
dart的num类型有量两种分别是int 和double两种,这两种都是num的子类。
void main() {
var age = 18;
print(age.runtimeType); //输出 int
var price = 8.0;
print(price.runtimeType); //输出:double
num year = 2020;
print(year.runtimeType); //输出:int
year = 2020.0;
print(year.runtimeType); //输出:double
int days = 10;
print(days.runtimeType); //输出:int
double limit = 8.90;
print(limit.runtimeType); //输出:double
}
复制代码
同时num也支持一些数据类型的转换:
void main() {
var age = '18';
print(age.runtimeType); //输出:String 类型
int parseAge = int.parse(age);
print(parseAge.runtimeType); //输出:int 类型
}
复制代码
Dart字符串是UTF-16编码的字符序列,可使用单引号或者双引号来建立字符串,单引号和双引号能够嵌套使用,不然须要使用\进行转义。字符串中也能够引用变量与表达式,同时能够实现字符串拼接功能
import 'dart:core';
void main() {
var name = '黄药师';
print(name.runtimeType); //输出:String 类型
var newName1 = "my name is $name";
print(newName1); //输出:my name is 黄药师
//和上面反之,须要添加上{}
var nameName2 = "my name is ${User().name}";
print(nameName2); //输出:my name is 黄药师
}
class User {
var age =10;
var name ="黄药师";
}
复制代码
提供一个 r 前缀能够建立一个 “原始 raw” 字符串,说白了就是不须要转义(若是添加上转义字符那么将会失效)以下:
import 'dart:core';
void main() {
//r:不须要转义
print(r"换行符: \n"); //输出:换行符:\n
print("换行符: \\n"); //输出:换行符:\n
}
复制代码
Dart有个类型名字为bool 类型,而在Dart中只有两个对象是布尔类型:分别是true和false。在Dart中还强类型检查,只有当为true的时候才会真。
import 'dart:core';
void main() {
bool isLoading;
print('$isLoading'); //输出:null;
isLoading =true;
print('$isLoading'); //输出:true;
}
复制代码
几乎全部的编程语言中数组是必不可少的,而在Dart中 list 也是必不可少的。
下面咱们来看一下List一些基本用法:
import 'dart:core';
void main() {
var names = List();
print(names.length); //输出:0;
var names1 = List(2);
print(names1.length); //输出:2;
//若是想要为 List 添加不一样数据类型的变量,则须要直接只买数据类型为Object
var names2 = List<Object>();
names2.add('黄药师');
print(names2.runtimeType); //输出:List<Object> 类型
//直接复制,能够添加不一样类型
var names3 = ['黄药师',12,11.0];
print(names3.length); //输出:3
//在list 字面上以前添加const 关键字,能够定义一个不变的list对象(编译是常量)
var names4 = const[1,2,3];
print(names4.length); //输出:3
///若是为names4集合添加一个值以下操做,这种操做是错误,list不可变
///报错:Cannot add to an unmodifiable list
names4.add(4);
}
复制代码
import 'dart:core';
import 'package:myfirstflutter/test/user.dart';
void main() {
var names1 = [1, 2, 3];
print(names1.length); //输出:0;
//排序
List<User> myList = [User('黄药师', 23), User('欧阳锋', 61), User('杨过', 48)];
myList.sort((a, b) => (b.age).compareTo(a.age));
//集合循环
myList.forEach((v) {
print('${v.name}${v.age}'); //输出:欧阳锋61,杨过48,黄药师23
});
//查找符合条件
var result = myList.where((v) => v.age == 23);
result.forEach((v){
//isEmpty属性,返回列表是否为空
print('${v.name}${v.age}');
});
//isEmpty属性,返回列表是否为空
print(myList.isEmpty);
//isNotEmpty属性,返回列表是否有元素
print(myList.isNotEmpty);
//获取List中的第一个元素
print("获取List中第一个元素${names1.first}");
}
复制代码
import 'dart:core';
void main() {
var names1 = ['杨过', '小龙女', '黄蓉'];
//添加数据
names1.add('丘处机');
print(names1.length); //输出:4;
var names2 = List(2);
///当执行add 时候会报错:Cannot add to a fixed-length list
///(固定长度的list是不能经过add添加数据)
///names2.add(1);
//固定长度的list使用一下方式能够设置数据
names2[0] = '黄药师';
names2[1] = '欧阳锋';
names2.forEach((v) {
print('$v'); //输出:黄药师 欧阳锋
});
var names3 = ['杨过', '小龙女', '黄蓉'];
var names4 = ['1', '2', '3'];
//添加所有元素
names3.addAll(names4);
names3.forEach((v) {
print('$v'); //输出:杨过 小龙女 黄蓉 1 2 3
});
}
复制代码
import 'dart:core';
void main() {
var names1 = ['杨过', '小龙女', '黄蓉', '丘处机', '黄药师'];
//删除指定元素
names1.remove('杨过');
print(names1); //输出:小龙女 黄蓉 丘处机 黄药师
//删除最后一个元素
names1.removeLast();
print(names1); //输出:小龙女 黄蓉 丘处机
//删除指定位置元素
names1.removeAt(names1.length - 1);
print(names1); //输出:小龙女 黄蓉
//删除指定位区域元素
names1.removeRange(0, 1);
print(names1); //输出 黄蓉
//下面这个方法是将列表List中的toString只有的字符串的长度等于3的元素所有删除
names1.removeWhere((item) =>item.toString().length==3);
print('删除列表中toString后长度为3的元素:==>$names1');
}
复制代码
以上还少“改”和“查” 其实这些在上面的例子代码中已经存在了一些,这里留个你们一个练习题:能够自行把“改”和“查”本身总结一下
Map和lList同样基本上只要学习开发语言map也是必不可少的一部分,Map是键值对相关的对象。 键和值能够是任何类型的对象。每一个键只出现一次, 而一个值则能够出现屡次。
import 'dart:core';
void main() {
//直接声明,用{}表示。里面写key和value 每组键值对中间用逗号隔开
var names = {'name1': '黄药师', 'name2': '杨过', 'name3': '老顽童'};
print(names); //输出:{name1:黄药师,name2: 杨过, name3:老顽童}
var names1 = Map();
names1['name1'] = '黄蓉';
names1['name2'] = '黄药师';
names1['name3'] = '郭靖';
print(names1); //{'name1': '黄蓉', 'name2': '黄药师', 'name3': '郭靖'};
//限定Map 能够存储的数据类型
var names2 = <String, String>{'name': '黄药师'};
print(names2); //输出:{'name':'黄药师'}
//与list List相似,要建立一个编译时常量的Map须要在Map的字面量前加上const 关键字
var names3 = const {'name': '黄药师', 'age': 60};
print(names3); //输出:{'name':'黄药师','age' : 60}
//循环
names1.forEach((k, v) {
print(v); //输出:黄蓉,黄药师。郭靖
});
//查询删除
var names4 = {'name1': '黄药师', 'name2': '杨过', 'name3': '老顽童'};
names4.removeWhere((k, v) => k == 'name1');
names4.forEach((k, v) {
print(v); //输出:杨过,老顽童
});
//根据指定key 进行删除
names4.remove('name1');
//找找是否包含指定key
names4.containsKey('name2');
//找找是否包含指定value
names4.containsValue('老顽童');
//添加一个Map对象
names4.addAll({'name': '丘处机'});
}
复制代码
Map和List同样,一样有增删改查功能
分支 Dart分支目前有if-else 和switch两种
import 'dart:core';
void main() {
var age = 18;
if (age < 0) {
print('age < 0');
} else if (age == 0) {
print('age = 0');
} else {
print('age > 0');
}
}
复制代码
import 'dart:core';
void main() {
// 在switch的case中可使用整数、字符串、枚举类型和编译时常量
String name = '黄药师';
switch (name) {
case '郭靖':
break;
case '老顽童':
break;
default:
print('Default');
}
}
复制代码
Dart中循环支持 for、while 以及 do-while 三种。
import 'dart:core';
void main() {
// for循环
for (int i = 0; i < 9; i++) {
print(i);
}
// while循环
while (true) {
//do something
}
//do-while循环
do {
//do something
} while (true);
}
复制代码
可是在Dart 还有一些特有的系统循环函数
import 'dart:core';
void main() {
var names = ["张无忌", "小龙女", "赵敏"];
// for...in...循环,是加强for
for (var it in names) {
print(it); // 输出:"张无忌","小龙女","赵敏"
}
//forEach循环。其参数为一个Function对象,这里传入一个匿名函数
names.forEach((v) {
print(v); // 输出:"张无忌","小龙女","赵敏"
});
names.forEach((v) => print(v)); //输出:"张无忌","小龙女","赵敏"
}
复制代码
咱们在来看一下在Dart中怎么去对一组Map数据进行循环
import 'dart:core';
void main() {
var myMap = {'name': '黄药师', 'age': '50', 'skills': '弹指神通'};
//forEach遍历Map
myMap.forEach(
(k, v) => print("$k : $v")); //输出:name : 黄药师 age : 50 skills : 弹指神通
//根据键获取值来遍历。经过keys返回Map中全部键的集合
for (var k in myMap.keys) {
print("$k : ${myMap[k]}");//输出:name : 黄药师 age : 50 skills : 弹指神通
}
}
复制代码
看是否是超级好上手,好操做~其实Dart的整个学习起来仍是蛮简单的,对于有基础的老司机更简单一些。分分钟敲起来~
这篇文章就简单的介绍到这里如何短期快速入门Dart,避免入坑。因为是想让你们快速入门Flutter,因此针对上面的这些章节咱们讲解的只是一些在开发Flutter 过程当中经常使用的一些方法和函数。若是要想对Dart有更深的了解和学习,后期能够关注我哦,若有问题能够直接在下方留言。
感受不错能够点赞加关注,我会持续输出优质的文章。
最后附上:知乎: 如何快速掌握Dart这门语言并进阶Flutter变成大神
下一篇: 40分钟快速入门Dart基础(中)