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 转载请注明出处,谢谢. 快速输入日期(含格式) [插入]--[日期] 快速输入日期和时间(快捷键) 快速 ...
随机推荐
- 2017年第八届 蓝桥杯C组 C/C++决赛题解
蓝桥杯历年国赛真题汇总:Here 1.哥德巴赫分解 哥德巴赫猜想认为:不小于4的偶数都可以表示为两个素数的和. 你不需要去证明这个定理,但可以通过计算机对有限数量的偶数进行分解,验证是否可行. 实际上 ...
- SpringBoot Serverless 实战 | 监控调试
SpringBoot 是基于 Java Spring 框架的套件,它预装了 Spring 的一系列组件,让开发者只需要很少的配置就可以创建独立运行的应用程序.在云原生的世界,有大量的平台可以运行 Sp ...
- 每天学五分钟 Liunx 000 | 计算机与 Liunx
计算机 计算机是具有数据处理与逻辑运算的机器. 它有输入单元,输出单元,CPU 内部的控制单元,逻辑处理单元以及内存组成. 输入单元如鼠标键盘等输入设备: 输出单元如打印机,显示屏,等输出 ...
- 【FreeRTOS】堆内存管理
动态内存分配及其与FreeRTOS的相关性 为了使FreeRTOS更易用,内核对象(如任务.队列.信号量.事件组)不在编译期静态分配,而是在运行时动态分配,FreeRTOS在内核对象创建时分配RAM, ...
- 【C/C++】宏参数多对一和宏部分替换
宏参数多对一:使用分号分隔多参数 宏部分替换:替换需要转换的再与后续宏接续 #include <stdio.h> #define _MESS_FAILED() printf("% ...
- 如何查找SpringBoot应用中的请求路径(不使用idea)
背景 昨天有个同事向我咨询某个接口的物理表是哪个,由于公司业务较多.这块业务的确不是我负责的,也没有使用idea不能全局搜索(eclipse搜不到jar内的字符串),也就回复了不清楚. 除了自己写代码 ...
- [转帖]git常用命令
https://www.cnblogs.com/xingmuxin/p/11416870.html GitHub可以托管各种git库,并提供一个web界面,但与其它像 SourceForge或Goog ...
- [转帖]我们为什么放弃 MongoDB 和 MySQL,选择 TiDB
https://zhuanlan.zhihu.com/p/164706527 写在前面的话 技术选型是由技术方向和业务场景 trade-off 决定的,脱离业务场景来说技术选型是没有任何意义的,所以本 ...
- [转帖]在麒麟linux上安装Postgresql12.5
https://jimolonely.github.io/tech/linux/install-postgresql-kylin/ 本文主要实践在麒麟V10版本上通过源码编译安装PostgreSQL1 ...
- [转帖]《Linux性能优化实战》笔记(20)—— 使用 tcpdump 和 Wireshark 分析网络流量
tcpdump 和 Wireshark 是最常用的网络抓包和分析工具,更是分析网络性能必不可少的利器. tcpdump 仅支持命令行格式使用,常用在服务器中抓取和分析网络包.Wireshark 除了可 ...