flutter-dart语言基础
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
链接地址
Dart语言基础-2
Dart学习-操作符
Dart数据类型
在Dart里是强类型的,也有自动推断类型的机制
定义变量使用:var, const, dynamic, Object, 类型等方式
//基本类型
import 'dart:math';
var name = 'Voyager I';
var antennaDiameter = 3.7;
const image = {
'tags': ['Jupiter', 'Saturn', 'Uranus', 'Neptune'],
'url': '//path/to/saturn.jpg'
};
//函数类型
String sayHello(var name) {
return 'Hello $name!';
}
//箭头函数
var add = (a, b) => a + b;
// 类似 Promise
Future sum(num a, num b) async {
return await add(a, b);
}
// main
void main() async {
print(sayHello(name)); //Hello Voyager I!
print(max(1, 2)); //2
sum(1, 2).then((res) => print(res)); // 3 (类似 Promise)
}
Object name1 = "小明";
dynamic name2 = "老王";
基本数据类型
- number
- string
- boolean
- list
- map
- rune
- symbol
int x = 1;
double y = 1.1;
num z = 1.2;
String x2 = 'abc';
enum Color { red, green, blue }
const msPerSecond = 1000;
bool flag = false;
var list = [1, 2, 3];
List arr = [1, 2, 3];
List<String> names = ['a', 'b', 'c']; //泛型
var constantList = const [1, 2, 3];
Map nobleGases = const {
2: 'helium',
10: 'neon',
18: 'argon',
};
var gifts = {
'first': 'partridge',
'second': 'turtledoves',
'fifth': 'golden rings'
};
void test() {
print(gifts['firsts']);
}
函数
int add(int a, int b) {
return a + b;
}
//类型可省略
add2(a, b) {
return a + b;
}
//箭头函数
var add3 = (a, b) => a + b;
int add6(int a, int b) => a + b;
// 可选参数,使用[]限定
int add4(int a, int b, [int c = 1, int d = 2]) => a + b + c + d;
//显示指定的参数名称,默认参数
int add7({int a = 1, int b = 2}) {
return a + b;
}
void test1() {
add7(a: 1, b: 2);
}
//回掉函数
var list = ['apples', 'bananas', 'oranges'];
test() {
list.forEach((item) {
print('%{list.indexOf(item)}:$item');
});
list.forEach((item) => print(item));
}
//闭包
Function makeAdder(int addBy) {
return (int i) => addBy + i;
}
操作符
例外有三个特色的操作:is、as、is?。
is 用于判断类型,as 用于续言、is? 与 is 相反。
var gifts = {
'first': 'partridge',
'second': 'turtledoves',
'fifth': 'golden rings'
};
getGifts() {
return gifts;
}
test() {
//不使用级联符号
var g = getGifts();
g.first = 1;
g.seoncd = 2;
g.fifth = 3;
// 使用级联符号
getGifts()
..first = 1
..second = 2
..fifth = 3;
}
算术运算符
操作符 | 含义 |
+ | 加 |
- | 减 |
-expr | 相反 |
* | 乘 |
/ | 除 |
~/ | 返回一个整数值的除法 |
% | 取余,除法剩下的余数 |
if(amp is Person) {
emp.firstName = ‘永动机’;
}
赋值操作符
// 赋值给a
a = value;
// 如果b为空,则将值分配给b;否则,b保持不变
b ??= value;
条件表达式
var visibility = isPublic ? ‘public’ : ‘private’;
// 稍微长一点的版本使用 ?:操作符
String playerName(String name) => name != null ? name : ‘Guest’;
如果布尔表达式为空,考虑使用??
String playerName(String name) => name ?? ‘Guest’;
//非常长的if-else语句的版本
String playerName(String name) {
if(name != null) {
return name;
} else {
return ‘Guest’;
}
}
级联符号
querySelector(’#confirm’) // 获取一个对象
…text = ‘Confirm’; //使用它的成员
…classes.add(‘important’)
…onClick.listen((e)=>window.alert(‘Confirmed!’);
其它操作符
操作符 | 名称 | 含义 |
() | 函数应用 | 表示函数调用 |
[] | 列表访问 | 指列表中指定索引处的值 |
. | 成员访问 | foo.bar |
?. | 条件成员访问 | 跟.差不多, 但是最左边的操作数可以为空;例子:foo?.bar从表达式foo中选择属性bar, 除非foo为空(在这种情况下,foo?.bar值为空) |
控制流程
isRaining() {
return false;
}
isShowing() {
return true;
}
test() {
if (isRaining()) {
// ...
} else if (isShowing()) {
// ...
} else {
// ...
}
var message = new StringBuffer('Dart is fun');
for (var i = 0; i < 5; i++) {
message.write('!');
}
var collection = [0, 1, 2];
for (var x in collection) {
print(x); //0 1 2
}
}
类结构
Dart 的类支持继承、静态方法、接口、构造函数、重载操作符、抽象类、接口类、 mixins等。
Dart 的类不支持什么 public、private 这些。_method 下划线代表私有方法。
class X {
num x, y;
X(x, y) {
this.x = x;
this.y = y;
}
void say() {
print(this.x + this.y);
}
}
class Point extends X {
num x;
num y;
final int k = 1; //无法被实例修改值
static const int initialCapacity = 16; //静态常量
// 静态方法
static add() {
//...
}
//构造函数,用:super(arg) 调用父类的构造函数
// 等效=>Point(this.x, this.y):super(x, y);
Point(x, y) : super(x, y) {
super.say(); //调用父类的方法
this.x = x;
this.y = y;
}
Point.origin() : super(null, null);
//命名构造函数
get xx => this.x;
set xx(v) => this.x = xx;
@override
void say() {
// TODO: implement say
super.say();
}
}
重载函数
class Vector {
final int x, y;
const Vector(this.x, this.y);
Vector operator +(Vector v) {
return new Vector(x + v.x, y + v.y);
}
Vector operator -(Vector v) {
return new Vector(x - v.x, y - v.y);
}
}
实现接口类
class Person {}
class Impostor implements Person {
get _name => '';
String greet(String who) => 'Hi $who. Do you knnow who I am?';
}
使用with关键字
class Performer {
String perform;
}
class Musical {
String music;
}
class Musician extends Performer with Musical {
test() {
print(this.perform);
print(this.music);
}
}
泛型
var names = <String>['Seth', 'Kathy', 'Lars'];
var pages = <String, String>{
'index.html': 'Homepage',
'robots.txt': 'Hints for web robots',
'humans.txt': 'We are people, not machins'
};
var names2 = new List<String>();
test() {
names2.addAll(['Seth', 'Kathy', 'Lars']);
//names2.add(42); ---> error
print(names2 is List<String>);
}
//泛型函数
T first<T>(List<T> ts) {
T tmp = ts[0];
return tmp;
}
//泛型类
abstract class Cache<T> {
T getByKey(String key);
void setByKey(String key, T value);
}
导入模块
import 'dart:math';
import 'dart:math' as math;
import 'dart:math' show min;
import 'dart:math' deferred as math2;
import 'mymath.dart' as math3;
test() {
max(1, 2);
math.max(1, 2);
min(1, 2);
}
Future greet() async {
await math2.max(1, 2);
}
test2() {
math3.max(1, 2);
}
异步编程
在 ES6 与异步相关的就是 Promise、async、await。而在 Dart 则是 Future、async、await。
Dart库充满了返回 Future 或 Stream 对象的函数。这些功能是异步的:它们在设置可能耗时的操作(例如 I/O)之后返回,而不等待该操作完成。 在 async 和 await 关键字支持异步编程,让你写异步代码看起来类似于同步代码。
使用 async/await 之前需要引入 dart:async 模块。
JSON操作
// 把对象转为json字符串
var jsonStr = json.encode([
1,
2,
{"a": num}
]);
// 把json字符串转为对象
var decoded = json.decode('["foo", {"bar":499}]');
正则表达式
RegExp exp = new RegExp(r"(\w+)");
// 返回正则表达式匹配项的可迭代对象
exp.allMatches("abc def ghi");
// 搜索并返回第一个匹配项,没有则返回null
exp.firstMatch("");
// 正则表达式是否找到匹配项
exp.hasMatch("as");
// 从第几个字符开始匹配正则表达式
exp.matchAsPrefix("ab cd", 3);
// 返回正则表达式的第一个匹配字符串
exp.stringMatch("abc de");
// 返回正则表达式的字符串表示
exp.toString();
Stream
- Stream.fromFuture :从Future创建新的订阅流,当future完成时将出发一个data或者error,然后使用down事件关闭这个流
- Stream.fromFutures:从一组Future创建一个单订阅流,每个future都有自己的data或者error事件,当整个futures完成后,流将会关闭。如果Futures为空,流将会立刻关闭。
- Stream.fromIterables:创建一个集合中获取其数据的单订阅流
监听Stream的方法
- onData(必填) 收到数据时触发
- onError 收到error的触发
- onDone 结束时触发
- unsubscribeOnError 遇到第一个error时是否取消订阅,默认为false
StreamController
//任意类型的流
StreamController controller = StreamController();
controller.sink.add(123);
controller.sink.add("xyz");
controller.sink.add(Anything);
//创建一条处理int类型的流
StreamController<int> numController = StreamController();
numController.sink.add(123);
StreamController controller = StreamController();
//监听这个流的出口,当有data流出时,打印这个data
StreamSubscription subscription = controller.stream.listen((data)=>print("$data");
controller.sink.add(123);
StreamController<int> controller = StreamController<int>();
final transformer = StreamTransformer<int, String>.fromHandlers(
handleData:(value, sink){
if(value == 100){
sink.add("you are write");
} else {
sink.addError("not yet, try again!");
}
}
);
controller.stream
.transform(transformer)
.listen((data)=>print(data), onError:(err)=>print(err));
Stream的种类
流的两种:
- “Single-subscription” streams 单订阅流
StreamController controller = StreamController();
controller.tream.listen((data)=>print(data));
controller.tream.listen((data)=>print(data));
controller.sink.add(123);
- “broadcast” streams 多订阅流
StreamController controller = StreamController();
//将单订阅流转化为广播流
Stream stream = controller.stream.asBroadcastStream();
stream.listen((data)=>print(data));
stream.listen((data)=>print(data));
controller.sink.add(123);
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |