Dart常用核心知识
void main(List<String> args) {
print("Hello Dart"); // 显示声明
String name = 'jack';
// 类型推断:类型推断的,也是有类型的。不同类型之间不能赋值。 // 类型推断变量
var age = 20;
age = 30;
// age = 30.3; // 编译期常量
const school = '北京大学';
// 运行时常量
final local = DateTime.now(); const p1 = const Person('Tom');
const p2 = const Person('Tom');
const p3 = const Person('LiLei'); print(identical(p1, p2));
print(identical(p1, p3)); } class Person {
final String name;
// 构造函数传参直接赋值到name属性上。
const Person(this.name);
}
void main(List<String> args) {
// 定义字符串三种方式:单引号,双引号,三引号
var str1 = 'abc';
var str2 = "def";
var str3 = """
ghi
jkl
mn
""";
print(str3); // 字符串拼接: 拼接规则和shell很相似
var name = 'jack';
var age = 30;
var height = 190.3; var msg1 = "name is $name, age is ${age}, height is ${height}, height Type is ${height.runtimeType}";
print(msg1); }
void main(List<String> args) {
// dart中没有关键字定义接口,默认情况下,所有的class都是隐式接口
// dart在集合中广泛使用泛型来表示集合中存放的是什么类型。 // 1.列表List
var names = ['abc', 'cba', 'nba', 'cba', 'abc'];
names.add('hhh');
print(names);
print(names.runtimeType); // 2.集合Set
var movies = {'星际穿越', '大话西游', '盗梦空间'};
names = Set<String>.from(names).toList();
print(names);
print(movies); // 3.映射Map
// 映射的Key应该是可以求出hash值的。
var info = {
'name': 'jack',
'age': 30
};
Map;
print(info);
print(info.runtimeType); }
// 多条语句
testFunc(() {
print('匿名函数被调用');
});
typedef Calculate = int Function(int num1, int num2);
void testFoo2(Calculate cal) {
cal(10, 10);
}
void main(List<String> args) {
print(sayHi(10, 20)); // 顺序可选参数,传参的顺序必须和定义顺序相同
sayHello1('jack', 30);
// 命名可选参数,传参需要带定义的名称
sayHello2('jack', age: 30);
testFunc(foo);
} // 1.函数的定义
// 返回值类型int 可以省略,但是推荐保留
int sayHi(int height, int age) {
return age + height;
} // 2.函数的可选参数
/*
dart中没有函数的重载
可选参数:位置可选参数 - 命名可选参数
可选参数可以默认值,必传参数不需要默认值
*/
// 位置可选参数
void sayHello1(String name, [int age, double height]) { } // 命名可选参数
void sayHello2(String name, {int age, double height}) { }
// 命名可选参数带默认值
void sayHello3(String name, {int age, double height = 12}) { } // 3.函数是一等公民
/*
一等公民是很灵活的,可以作为参数和返回值。
OC中使用Block实现这一特性
*/ void testFunc(Function foo) {
foo();
}
void foo() {
print('foo 函数被调用');
} // 4.匿名函数
void testFunc2() {
// 多条语句
testFunc(() {
print('匿名函数被调用');
}); // 单条语句
testFunc(() => print('箭头匿名函数,只能有一条语句') ); // 匿名函数传参
/*
匿名传参,参数需要定义为完整的函数签名:void testFoo(int foo(int num1, int num2)) {}
*/
testFoo((num1, num2) => num1 + num2);
testFoo2((num1, num2) => num1 + num2); // 匿名返回值
var foo3 = testFoo3();
foo3(3, 3);
} void testFoo(int foo(int num1, int num2)) {
print(foo(10, 20));
}
typedef Calculate = int Function(int num1, int num2);
void testFoo2(Calculate cal) {
cal(10, 10);
} Calculate testFoo3() {
return (int num1, int num2) => num1 * num2;
}
5.赋值运算符
void main(List<String> args) { // ??=: 如果前面的pro为null就执行后面的=赋值操作,如果pro有值就不执行后面的操作。
// 可能有赋值操作
var name = 'jim';
var pro = null;
pro ??= name;
print(pro); // ??: 是?:三目运算符号的简写, 如果前面的变量有值则取前面的值,如果前面的值为空就取后面的值。
// 一定有赋值操作
var school = '小学';
school = pro ?? '没人上学';
print(school); // 级联运算符:可以连续调用..方法
var p = Person()
..name = 'jim'
..eat()
..run();
p.eat(); } class Person {
var name;
void eat() { } void run() { }
}
// 类默认是继承自Object的,应用创建的对象是可以使用Object中的方法的。
class Person {
String name;
int age;
}
Student(this.name, this.age);
c.命名构造函数,因为Dart中不支持函数重载,所以出现了命名构造函数来作为构造函数
Student.withNameAgeHeight(this.name, this.age, this.height); Student.withMap(Map<String, dynamic> map) {
this.name = map['name'];
this.age = map['age'];
this.height = map['height'];
};
dynamic、var、Object的区别?
// 3.类的初始化列表
class Teacher {
final String name;
final int age; // Teacher(this.name, {int age = 10, String color}): this.color = color ?? '' {
// }
Teacher():this.name = 'jc', this.age = 10 {
}
}
class Doctor {
int age;
String name; // 构造函数重定向
Doctor(String name): this._internal(name, 10);
// 命名构造函数
Doctor._internal(String name, int age);
}
// 5.常量构造函数,相同的属性只有一个内存对象。
class Apple {
final String name;
final int age; const Apple(this.name, this.age);
}
// 6.工厂构造函数:最大的特点可以手动返回一个对象。 class Orange {
String name;
String color;
static final Map<String, Orange> _nameCache = {};
static final Map<String, Orange> _colorCache = {}; factory Orange.withName(String name) {
if (_nameCache.containsKey(name)) {
return _nameCache[name];
} else {
final p = Orange(name, 'red');
_nameCache[name] = p;
return p;
}
}
Orange(this.name, this.color);
}
// 7.Setter, Getter进行属性监听
// 使用方式是: var e = Elephone(); e.setName('jim'); e.getName
class Elephone {
String name;
// 在Dart中没有private public等修饰符,当对属性_开头时,表示这个属性是私有属性,只能在当前文件模块内访问。
String _age; // setter
set setName(String name) {
this.name = name;
}
// getter
String get getName {
return name;
} }
// 8.继承:父类的构造函数要在子类的初始化列表中进行调用。
class Animal{
String name;
Animal(this.name); void eat() {
print('eatting');
}
} class Dog extends Animal {
int age;
// 父类有构造函数时,需要在参数列表中进行调用,初始化。
Dog(this.age, String name): super(name);
}
// 9.抽象类
abstract class Shape {
int getArea();
String getInfo() {
return '形状';
} void testMap() {
final m = Map();
print(m.runtimeType);
}
} class Rectangle extends Shape {
@override
int getArea() {
return 20;
}
}
// 10.dart隐式接口:dart中定义的class同时也可以当接口使用。
class Runner {
void run() {
print('running');
}
} class Fly {
void fly() {
print('fly');
}
} class SuperMan extends Animal implements Runner, Fly {
SuperMan(String name):super(name); // 1.接口实现
@override
void run() {
// TODO: implement run
} @override
void fly() {
// TODO: implement fly
} // 2.方法重写
@override
void eat() {
// TODO: implement eat
super.eat();
}
}
// 11.混入mixin
mixin Play {
void play() {
print('play');
}
} mixin Jump {
void jump() {
print('jump');
}
} class Robbit extends Animal with Play, Jump {
Robbit(String name):super(name); @override
void eat() {
// TODO: implement eat
super.eat();
}
}
12.static 类属性,类方法
*/ class SuperWoman {
// 成员变量,成员方法
var name;
void fly() { } // 静态/类变量,静态/类方法
static var flyYear;
static void run() { }
}
void main(List<String> args) {
// 虽然dart支持函数式开发,但是大部分使用的是面向对象开发。 var p0 = Person('jim', 22);
print(p0.toString()); var s0 = Student.withMap({
'name': 'jack',
'age': 18,
'height': 33.3
});
print(s0); } // 1.类的基本定义
// 类默认是继承自Object的,应用创建的对象是可以使用Object中的方法的。
class Person {
String name;
int age; // Person(String name, int age) {
// this.name = name;
// this.age = age;
// } // 语法糖
Person(this.name, this.age); } // 2.类的构造函数
class Student {
String name;
int age;
double height; // a.普通的构造方法
Student(this.name, this.age);
// b.命名构造函数:因为Dart中不支持函数重载,所以出现了命名构造函数来作为构造函数 Student.withNameAgeHeight(this.name, this.age, this.height); /*
dynamic和Object的区别
dynamic是类型声明,var是类型推断,它是一个具体类型的声明,如String。
dynamic是运行时报错
Object是编译时报错
Object可以父类指向子类对象。 Object obj = 'hello';
print(obj.toString(1)); */
Student.withMap(Map<String, dynamic> map) {
this.name = map['name'];
this.age = map['age'];
this.height = map['height'];
} // c.重新类的描述方法
@override
String toString() {
// TODO: implement toString
return "$age, $name, $height";
}
} // 3.类的初始化列表
class Teacher {
final String name;
final int age; /*
构造函数的结构体执行时,是在构造函数执行后,所以对于final属性,它必须在构造函数执行时进行执行
所以此时的执行时间就是在结构体执行时,故:它的执行是在():后面的初始化列表里执行。 初始化列表:里面执行不仅包含编辑期静态返回值,还可以包含动态调用返回值。如:Color.blue
可选命名表达式: 只能有赋值表达式,如:int age = temp ?? 20
*/
// Teacher(this.name, {int age = 10, String color}): this.color = color ?? '' { // } Teacher():this.name = 'jc', this.age = 10 { }
} // 4.构造函数重定向
class Doctor {
int age;
String name; // 构造函数重定向
Doctor(String name): this._internal(name, 10);
// 命名构造函数
Doctor._internal(String name, int age);
} // 5.常量构造函数,相同的属性只有一个内存对象。
class Apple {
final String name;
final int age; const Apple(this.name, this.age);
} // 6.工厂构造函数:最大的特点可以手动返回一个对象。
/*
普通构造函数不需要写return 会自动返回实例对象。
工厂构造函数需要写return 手动返回实例对象。
static:全局静态方法,类方法。
*/ class Orange {
String name;
String color;
static final Map<String, Orange> _nameCache = {};
static final Map<String, Orange> _colorCache = {}; factory Orange.withName(String name) {
if (_nameCache.containsKey(name)) {
return _nameCache[name];
} else {
final p = Orange(name, 'red');
_nameCache[name] = p;
return p;
}
} Orange(this.name, this.color); } // 7.Setter, Getter进行属性监听
// 使用方式是: var e = Elephone(); e.setName('jim'); e.getName
class Elephone {
String name;
// 在Dart中没有private public等修饰符,当对属性_开头时,表示这个属性是私有属性,只能在当前文件模块内访问。
String _age; // setter
set setName(String name) {
this.name = name;
}
// getter
String get getName {
return name;
} } // 8.继承:父类的构造函数要在子类的初始化列表中进行调用。
class Animal{
String name;
Animal(this.name); void eat() {
print('eatting');
}
} class Dog extends Animal {
int age;
// 父类有构造函数时,需要在参数列表中进行调用,初始化。
Dog(this.age, String name): super(name);
} // 9.抽象类
// a.子类继承抽象父类,父类的接口方法必须实现,没有option可选项。
// b.抽象类不能实例化
/*
c.系统抽象类Map实例化分析
Map是一个抽象类,而可以调用Map()产生实例对象的原因是因为
调用的Map()是Map抽象类的工厂方法external factory Map(); external 是一个方法存在声明,表示此方法已经存在,但不在这里实现。这样实现和声明分离
的好处是,可以在实现的地方使用runtimeType集中处理不同平台逻辑,而通过方法接口声明在不同的平台
调用。
实现的地方使用@patch修饰。
*/
abstract class Shape {
int getArea();
String getInfo() {
return '形状';
} void testMap() { final m = Map();
print(m.runtimeType);
}
} class Rectangle extends Shape {
@override
int getArea() {
return 20;
}
} // 10.dart隐式接口:dart中定义的class同时也可以当接口使用。
/*
dart中没有interface/ protocal这样专门定义接口的关键字
dart中定义的class 同时也具有接口的功能,把class当接口使用时,class中定义的方法必须要全部实现。
dart是单继承
*/ class Runner {
void run() {
print('running');
}
} class Fly {
void fly() {
print('fly');
}
} class SuperMan extends Animal implements Runner, Fly {
SuperMan(String name):super(name); // 1.接口实现
@override
void run() {
// TODO: implement run
} @override
void fly() {
// TODO: implement fly
} // 2.方法重写
@override
void eat() {
// TODO: implement eat
super.eat();
}
} // 11.混入mixin
/*
混入mixin间接实现多继承,可以同时引入多个mixin类中的方法
dart是单继承, 如果要想同时引入多个mixin类中的方法,则可以定义多个mixin类来引入
定义用mixin
使用用with
*/
mixin Play {
void play() {
print('play');
}
} mixin Jump {
void jump() {
print('jump');
}
} class Robbit extends Animal with Play, Jump {
Robbit(String name):super(name); @override
void eat() {
// TODO: implement eat
super.eat();
}
} /*
12.static 类属性,类方法
*/ class SuperWoman {
// 成员变量,成员方法
var name;
void fly() { } // 静态/类变量,静态/类方法
static var flyYear;
static void run() { }
}
7.枚举
void main(List<String> args) {
var color = Colors.red; switch (color) {
case Colors.blue:
print('蓝色');
break;
case Colors.red:
print('红色');
break;
case Colors.yellow:
print('黄色');
break;
default:
}; print(Colors.values);
} enum Colors {
red,
blue,
yellow
}
import 'dart:async';
import 'dart:io';
import 'dart:库的名称';
自定义库:导入方式
import '08_dart_自定义库_utils/math_utils.dart'
如果自定义库和当前模块或系统库方法名重复,可以是as重命名来区分
import '08_dart_自定义库_utils/math_utils.dart' as MathUtils;
第三方库:导入方式
import 'package:http/http.dart' as http;
注意
import '08_dart_自定义库_utils/math_utils.dart' as MathUtils;
import '08_dart_自定义库_utils/math_utils.dart' show sum;
import '08_dart_自定义库_utils/math_utils.dart' hide sub ;
3.export统一导出一类库文件,当一个目下有多个工具库时,可以统一放到一个文件中,集中导入防止每个都导入一次
export 'io_utils.dart';
export 'math_utils.dart';
4.库文件中的私有方法是_开头的方法。
name: zhoufei
description: a dart lib
dependencies:
http: ^0.12.0
import 'dart:math';
import 'dart:convert' as convert; import '08_dart_自定义库_utils/math_utils.dart' as MathUtils;
// import '08_dart_自定义库_utils/math_utils.dart' show sum;
// import '08_dart_自定义库_utils/math_utils.dart' hide sub ; import 'package:http/http.dart' as http; void main(List<String> args) async {
final num1 = 10;
final num2 = 20;
print(min(num1, num2)); MathUtils.sub(num1, num2); var url =
Uri.https('www.googleapis.com', '/books/v1/volumes', {'q': '{http}'}); // Await the http get response, then decode the json-formatted response.
var response = await http.get(url);
if (response.statusCode == 200) {
var jsonResponse =
convert.jsonDecode(response.body) as Map<String, dynamic>;
var itemCount = jsonResponse['totalItems'];
print('Number of books about http: $itemCount.');
} else {
print('Request failed with status: ${response.statusCode}.');
} } /*
dart中,一个文件就是一个模块或一个库
注意:
1.as关键字可以给库起别名
2.默认情况下,导入一个库时会导入库中的所有内容,此时可以使用修饰词声明部分导入
show: 声明要导入的部分
hide: 声明要隐藏的部分
import '08_dart_自定义库_utils/math_utils.dart' as MathUtils;
import '08_dart_自定义库_utils/math_utils.dart' show sum;
import '08_dart_自定义库_utils/math_utils.dart' hide sub ;
3.export统一导出一类库文件,当一个目下有多个工具库时,可以统一放到一个文件中,集中导入防止每个都导入一次
export 'io_utils.dart';
export 'math_utils.dart';
4.库文件中的私有方法是_开头的方法。
5.flutter项目第三方库管理文件pubspec.yaml, 然后执行pub get进行更新。
name: zhoufei
description: a dart lib
dependencies:
http: ^0.12.0 系统库
dart中的Core核心库无需导入,默认导入。如使用的Map
如果使用其他专门功能,就导入专门的库,如:
import 'dart:async';
import 'dart:io';
import 'dart:库的名称'; 自定义库
导入方式
import '08_dart_自定义库_utils/math_utils.dart'
如果自定义库和当前模块或系统库方法名重复,可以是as重命名来区分
import '08_dart_自定义库_utils/math_utils.dart' as MathUtils; 第三方库
导入方式
import 'package:http/http.dart' as http; */
Dart常用核心知识的更多相关文章
- 《Maven实战》关联实际工作的核心知识
通读了<Maven实战>这本书,由于在实际的工作中,对其有一定的操作上的经验.因此,再回头去通读这本书,就能够更加精准的把握里面的核心知识了. 以下我主要从两点去介绍之—— 1> m ...
- Linux(1)- 服务器核心知识、Linux入门、VMware与centeos安装、远程连接linux、linux基本命令使用
一.服务器核心知识 1.电脑和电脑的硬件组成 现在的人们几乎无时无刻不在使用着电脑!不管是桌上型电脑(桌机).笔记型电脑(笔电).平板电脑,还是智慧型手机等等,这些东西都算是电脑.虽然接触这么多,但是 ...
- HTML中DOM核心知识有哪些(带实例超详解)
HTML中DOM核心知识有哪些(带实例超详解) 一.总结: 1.先取html元素,然后再对他进行操作,取的话可以getElementById等 2.操作的话,可以是innerHtml,value等等 ...
- Java并发编程核心知识体系精讲
第1章 开宗明义[不看错过一个亿]本章一连串设问:为什么学并发编程?学并发编程痛点?谁适合学习本课?本课程包含内容和亮点?首先4大个理由告诉你为什么要学,其实源于JD岗位要求就不得不服了.其次5个痛点 ...
- [转帖]java注解核心知识总结
java注解核心知识总结 2019-11-01 20:39:50 从事Java 阅读数 2 收藏 文章标签: java注解总结程序员 更多 分类专栏: java 注解 版权声明:本文为博主原创文 ...
- 小D课堂 - 新版本微服务springcloud+Docker教程_5-01分布式核心知识之熔断、降级
笔记: 第五章 互联网架构服务降级熔断 Hystrix 实战 1.分布式核心知识之熔断.降级讲解 简介:系统负载过高,突发流量或者网络等各种异常情况介绍,常用的解决方案 1.熔断: ...
- 阿里内部资料:Android开发核心知识笔记共2100页,58万字,完整版开放下载
作为一个3-5年的Android工程师,我们经常会遇到这些瓶颈: 1.技术视野窄长期在小型软件公司,外包公司工作,技术视野被限制的太厉害 2.薪资提升难初中级Android岗位薪资上升空间有限,基本上 ...
- Docker 核心知识回顾
Docker 核心知识回顾 最近公司为了提高项目治理能力.提升开发效率,将之前的CICD项目扩展成devops进行项目管理.开发人员需要对自己的负责的项目进行流水线的部署,包括写Dockerfile ...
- 网络基础知识、ASP.NET 核心知识(1)*
为什么要写网络? 我原本的计划是这样的,连续两天梳理ASP.NET开发的核心知识.说到这呢,有人问了.“不是说好了做ASP.NET笔记吗?为啥要写网络基础知识?是不是傻?” 原因是这样的.作为网站开发 ...
- Word常用实用知识1
Word常用实用知识1 纯手打,可能有错别字,使用的版本是office Word 2013 转载请注明出处,谢谢. 快速输入日期(含格式) [插入]--[日期] 快速输入日期和时间(快捷键) 快速 ...
随机推荐
- 自用 IntelliJ IDEA Vim 插件配置
Prefrence: https://einverne.github.io/post/2020/12/my-idea-vimrc-config.html https://gist.github.com ...
- Python报错:AttributeError: type object 'str' has no attribute '_name_'(机器学习实战treePlotter代码)解决方案
错误信息: 学习<机器学习实战>这本书时,按照书上的代码运行,产生了错误,但是在代码中没有错误提示,产生错误的代码如下: if type(secondDict[key])._name_ = ...
- 2016年第七届 蓝桥杯B组C/C++ 决赛题解
1.一步之遥 从昏迷中醒来,小明发现自己被关在X星球的废矿车里. 矿车停在平直的废弃的轨道上. 他的面前是两个按钮,分别写着"F"和"B". 小明突然记起来,这 ...
- 使用acme.sh、acme-dns自动申请ssl证书
使用acme.acme-dns实现自动申请ssl证书并实现自动替换 有些dns没有dnsapi,所以用这种方式申请只需要添加一条dns解析即可完成 以下为linux系统操作 安装acme.sh 官方源 ...
- Kubernetes APIServer 最佳实践
1. kubernetes 整体架构 kubernetes 由 master 节点和工作节点组成.其中,master 节点的组件有 APIServer,scheduler 和 controller-m ...
- 深入理解Kafka核心设计及原理(一):初识Kafka
转载请注明出处: 1.1 kafka简介 Kafka 起初是由 Linkedin 公司采用 Scala 语言开发的一个多分区.多副本且基于 ZooKeeper协调的分布式消息系统,现己被捐献给 Apa ...
- 03-Shell环境变量深入
1. 自定义系统环境变量 1.1 全局配置文件/etc/profile应用场景 当前用户进入Shell环境初始化的时候会加载全局配置文件/etc/profile里面的环境变量, 供给所有Shell程序 ...
- 百度网盘(百度云)SVIP超级会员共享账号每日更新(2024.01.03)
一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...
- [转帖]rsync原理
简介: Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件.Rsync使用所谓的"Rsync算法"来使本地和远 ...
- [转帖]一次ORA-3136的处理
https://oracleblog.org/working-case/deal-with-ora3136/ 最近收到一个告警,用户说数据库无法连接,但是从监控上看,oracle的后台进程已经侦听进程 ...