Dart基础
Posted 黄毛火烧雪下
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dart基础相关的知识,希望对你有一定的参考价值。
Dart 强大的脚本语言,Dart是一门使用类和单继承的面向对象的语言,所有的对象都是类的实例,并且所有的类都是object的子类。Dart 中的抽象类主要用来定义标准,子类可以继承抽象类,也可以实现抽象类接口。把接口定义成抽象类。
一个类是属性和方法组
1.Dart 配置,运行Hellow word
mac 安装,直接命令行
https://dart.dev/get-dart
windows
下载dart sdk 软件包
https://gekorm.com/dart-windows/
安装过程 比较慢
dart --version
开发工具:IDEA
![在这里插入图片描述](https://img-blog.csdnimg.cn
void main()
print("hellow word"); hellow word
2.入口方法 打印 注释 变量 常量命名 规则
无返回值的方法
void main()
print("hellow word");
定义变量
- 方法1 var 自动推断类型
var str='hellow word';
print(str);
- 方法2
String str= 'hellow word';
print(str);
final 和const
const 值不变 一开始就得赋值
final 可以开始不赋值,只能赋一次,运行时的常量 ,final是惰性初始化,即在运行第一次才使用
3.数据类型详解 int double String bool List Maps
1.三个引号,双引号和单引号都可以
var str = "hellow";
var str1 = 'hellow';
var str3 = '''
hellow
word
''';
var str4 = """
hellow
word
""";
print(str3);
字符串拼接 + 和 $
print("$str $str1");
2.double 既可以是整型也可以是浮点型
3.list
//1
var list=["aaa","bbbb",20,true];
//2指定对应类型
var list=<String>["aaa","bbbb"];
//3[]创建的,容量可变
var list=[];
print(list);
list.add(20);
print(list);
//4.最新版本 去掉了 new List()
//创建固定长度的集合
var list = List.filled(5, "");
print(list); [, , , , ]
list[1] = "40";
print(list);[, 40, , , ]
//指定类型
var list = List<String>.filled(5, "");
3.Maps
//1定义maps
var person =
"name":"张三",
"age":20,
"work":["程序员","外卖员"]
;
print(person); name: 张三, age: 20, work: [程序员, 外卖员]
//2定义maps
var p=new Map();
p["name"]="张三";
p["age"]=20;
p["work"]=["程序员","外卖员"];
print(p);
print(p["age"]);
is 判断类型
var str = "1234";
if (str is int)
print(false);
4.运算符 条件判断 类型转化
1.a = a + 10; 同 a+=10;
2.三目运算符
var flag = true;
String str = flag ? "我是ture" : "我是false";
print(str);
2.??
var a;
var b= a?? 10;
print(b); 10
3.类型转换
String 转 double
String prince="12.1";
var num=double.parse(prince);
print(num); 12.1
String prince="";
try
var num=double.parse(prince);
print(num);
catch(err)
print(err);
isEmpty 判断是否为空
String prince="";
print(prince.isEmpty); true
print(prince==null); false
String prince;
print(prince==null); true
5.循环语句 for while do…while break continue 多维列表循环
1. 自增写在前后的区别(赋值)
在赋值运算里,如果++ – 卸载前面 ,这时候 ,先运算 再赋值 ;如果 ++ --卸载后面,先赋值 再运算
var a = 10;
var b = a++;
var c = ++a;
print(a); 12
print(b); 10
print(c); 12
a++ 和 ++a 单独写没区别,都是自增1
2.for循环
//数组里面有对象
List list = [
"title": "新闻111",
"title": "新闻222"
];
list.forEach((element)
print(element['title']);
);
//二维数组
List list1 = [
"cate": '国内',
"news": [
"title": "国内新闻111",
"title": "国内新闻222"
]
,
"cate": '国际',
"news": [
"title": "国际新闻333",
"title": "国际新闻444"
]
];
for (var i = 0; i < list1.length; i++)
print(list1[i]["cate"]);
var news = list1[i]["news"];
for (var j = 0; j < news.length; j++)
print(" "+news[j]["title"]);
输出结果
新闻111
新闻222
国内
国内新闻111
国内新闻222
国际
国际新闻333
国际新闻444
3.while (防止死循环需要加i++) do…while
唯一区别:第一次循环不满足条件的时候
int i=1;
int sum=0;
while(i<=10)
sum+=i;
print(sum);
i++;
int i=1;
int sum=0;
do
sum+=i;
i++;
while(i<=10);
print(sum);
4.break 跳出一层当前循环 ,continue 跳过当前循环 继续循环;
用在switch case;for while 中
6.List Set Map 详解 forEach map where any every
1.List常用属性和方法:
- length 长度
- reversed 反转
- isEmpty 是否为空
- isNotEmpty 是否不为空
- add 增加
- addAll 拼接数组
- indexOf 查找 传入具体值
- remove 删除 传入具体值
- removeAt 删除 传入索引值
- fillRange 修改
- insert(index,value)
- toList
- join list转成字符串
- split 字符串转成list
- forEach
- map
- where
- any
- every
2.Set 去重
var s=new Set();
s.add("apple");
List list=["aa","bb","aa"];
print(list.toSet()); ["aa","aa"]
3.Map 映射无序键值对 常用属性和方法
- keys 获取所有key值
- values 获取所有value 值
- isEmpty
- isNotEmpty
- remove(key)
- addAll(…)
- containsValues 查找映射内的值 返回true false
- forEach
- map
- where
- any
- every
var m = new Map();
m.addAll("name": "张三",);
m.addAll("age": "10");
print(m.values.toList());
print(m.containsValue("10"));
m.forEach((key,value)
print("$key $value");
);
3.Map
var ll=["aa","bb","cc"];
var nn=ll.map((e) => "jia$e");
print(ll);
print(nn.toList());
[aa, bb, cc]
[jiaaa, jiabb, jiacc]
4.Where
var ll=["aa","bb","cc"];
var nn=ll.where((element) => element=="aa");
print(ll);
print(nn.toList());
[aa, bb, cc]
[aa]
5.Any 只要集合中有一个满足条件 返回true
var ll = ["aa", "bb", "cc"];
var nn = ll.any((element) => element == "aa");
print(ll);
print(nn);
var f=ll.any((element)
return element == "aa";
);
print(f);
[aa, bb, cc]
true
true
6.Every 集合中每一个满足条件 才返回true
7.函数的定义 可选参数 默认参数 箭头函数 匿名函数 闭包
返回类型可以不写,但是建议写
1.自定义方式放在main 以外,和顺序无关,全局作用域;如果放在main方法里面,和顺序有关,局部作用域;
print(getSum(100));
//定义一个所有数的和
int getSum(int n)
var sum=0;
for (var i = 1; i <= n; i++)
sum += i;
return sum;
2.可选参数 中括号[int? age,String? sex]
String getUserInfo(String name, [int? age])
if (age != null)
return "$name $age";
else
return "$name 年龄保密";
print(getUserInfo("张三")); 张三 年龄保密
3.默认参数 [int? age=18]
String getUserInfo(String name, [int? age=18])
if (age != null)
return "$name $age";
else
return "$name 年龄保密";
4.命名参数 花括号 int? age=18
print(getUserInfo("张三",age: 20));
5.把方法当作参数
6.箭头函数 => 里面无分号 ,里面只能写一行
List list = ["aa", "bb", "cc"];
list.forEach((element)
print(element);
);
list.forEach((element) =>
//只能写一句话
print(element)
);
List list = [1, 2, 3];
var newList1 = list.map((value) => value > 2 ? value * 2 : value);
print(newList1.toList()); [1, 2, 6]
7.匿名函数 (没有名字的方法)
var printNum=()
print(123);
;
printNum();
var printNum=(int n)
print(123+n);
;
printNum(1);
8.自执行方法 (())();
((int n)
print("我是自执行方法$n");
)(13);
我是自执行方法13
9.方法的递归
var sum = 1;
fn(int n)
sum *= n;
if (n == 1)
return;
fn(n - 1);
;
fn(5);
print(sum);120
var sum = 0;
fn(int n)
sum += n;
if (n == 0)
return;
fn(n - 1);
fn(10);
print(sum);
55
10.全局变量和局部变量和闭包
全局变量常驻内存,污染全局;局部变量,不会常驻内存,会被垃圾回收机制回收,不污染全局;闭包,常驻内存,不污染全局;
闭包写法:函数嵌套函数,并return里面的函数,这样形成闭包。
fn()
var a = 123;
return ()
a++;
print(a);
;
var b=fn();
b();
b();
b();
124
125
126
8.对象 类 类的创建 构造函数 命名构造函数 类模块化 私有属性 私有方法 get set
面向对象:封装 继承 多态,Dart虽有的东西都是对象,所有的对象都继承自Object
dart是一门使用类和单继承的面向对象的语言,所有的对象都是类的实例,并且所有的类都是object的子类
一个类是属性和方法组成的
类模块化:单独一个类
使用_下划线把一个属性或方法定义成私有,必须是单独的一个文件,间接的调用私有属性或方法;
1.单独类
import 'libs/Person.dart';
void main()
var p1 = new Person("张三", 25);
//Person p1 = new Person();
p1.age = 20;
p1.getInfo();
//调用命名构造函数
var p2 = new Person.now();
//_sex为私有
p2.getSex();
class Person
String name = "张三";
//私有,其它类直接访问不到
String _sex = "男";
String getSex()
return _sex;
int age = 10;
// Person()
// print("我是构造函数 实例化的时候触发");
//
//默认构造函数
// Person(String name,int age)
// this.name=name;
// this.age=age;
//
//默认构造函数的简写
Person(this.name, this.age);
Person.now()
print("我是命名构造函数");
void setInfo(int age)
this.age = age;
void getInfo()
// print("$name$age");
print("$this.name----$this.age");
2.get set方法
class Rect
num height;
num width;
//初始化之前的动态赋值
//Rect():height=1,width=2
Rect(this.height, this.width);
get area
return this.height * this.width;
set areaHeight(value)
this.height=value;
Rect rect = new Rect(10, 4);
rect.areaHeight=6;
print("面积:$rect.area");
9.类 静态成员 操作符 类的继承
1.静态, 直接调用
静态方法不能访问非静态成员,非静态方法可以访问静态成员
2.Dart中的对象操作符 … 级联操作
- … 级联操作 (记住)
void main()
Person p = new Person();
p..name = "xx"
..age = 30
..show();
class Person
String name = "张三";
int age = 10;
void show()
print(name);
print(this.age);
- ? 条件运算符 (不用)
- as 类型转换
- is 类型判断
3.继承 extends super this
void main()
Person p = new Person("lx",20);
p.show();
Web web=new Web("zs", 10,"女");
web.show();
class Person
String name;
int age;
Person(this.name, this.age);
Person.xxx(this.name, this.age);
void show()
print(name);
print(this.age);
class Web extends Person
String sex="男";
// Web(super.name, super.age);
// Web(String name, int age):super(name,age);
Web(String name, int age,String sex):super(name,age)
this.sex=sex;
// Web(String name, int age,String sex):super.xxx(name,age)
// this.sex=sex;
//
@override
show()
print(sex);
work()
super.show();
10.抽象类 abstract、 多态 接口
Dart 中的抽象类:主要用来定义标准,子类可以继承抽象类,也可以实现抽象类接口。把接口定义成抽抽象类。抽象类不能被实例化
要求所有子类都要有某个方法
多态 父类定义方法不去实现,让子类去实现方法,每个子类有不同的表现。
Dart 接口没有interface关键字,而是普通类和抽象类都可以定义接口
void main()
Dog dog=new Dog();
dog.eat();
dog.run();
dog.printInfo();
abstract class Animal
String name="";
eat();
run();
printInfo()
print("我是一个抽象类普通方法");
class Pig implements Animal
@override
eat() 以上是关于Dart基础的主要内容,如果未能解决你的问题,请参考以下文章