dart语言基础语法

2021-11-14  本文已影响0人  这都是大棚的瓜
1. var 、dynamic、Object、final、const

var 接收任意类型的变量,但是一旦赋值后不能再改变其类型

//var 接收任意类型的变量
  var a="hello";
  a = 3; //一旦赋值后不能再改变其类型 这一行会报错
// 使用var声明变量的同时未进行初始化,此变量的类型会被推断为dynamic动态类型
  var aa;
  aa="111";
  aa=9;//这一行不会报错,此时已经是动态类型dynamic

dynamic 动态类型,赋值后可以再次改变类型

 dynamic b = 3;
 b = "haha";

Object是所有对象的基类

Object c = 10;
c = "hello";

final和const 只能被赋值一次

final str1 = "kobe"; //编译时常量
const str2 = "paul"; //第一次使用时被初始化
2.函数
//函数如果没指定返回类型 则默认是dynamic 函数返回值没有类型推断
method2() {}
//定义一个函数类型CALLBACK,它的返回值类型为bool 没有参数。
typedef bool CALLBACK();
//对于只包含一个表达式的函数 使用简写语法如下
bool isEmpty(String str) => str.length == 0;

//定义一个函数变量
var say = (int a, int b) => a + b;
//函数作为变量使用
  var sum = say(10, 10);
  print("sum: $sum");

//这个函数有个参数callback 它是一个参数。其他地方调用excute,传入的是一个函数
void excute(var callback) {
  callback(10, 20);
}
 //函数作为参数传递
  excute((a, b) => print(a + b));

//可选参数
String getName(String name1, String name2, [String? name3]) {
  var res = name1 + name2;
  if (name3 != null) {
    res = res + name3;
  }
  return res;
}
//调用可选参数
  print(getName("kobe ", "james"));
  print(getName("kobe ", "james ", "paul"));

//命名参数
void setFlag({bool? b1, bool? b2}) {}
//调用命名参数
  setFlag(b1: false, b2: true);
3. 异步支持
//Future.then
void method11() {
  //延时2s后打印hello world
  //第一个参数为Duration对象,Duration构造时里面是指定命名参数;第二个参数为函数对象
  Future.delayed(new Duration(seconds: 2), () {
    return "hello world";
  }).then((value) => {print(value)});
}
//Future.catchError用于捕获异常
void method12() {
  Future.delayed(new Duration(seconds: 2), () {
    throw AssertionError("Error");
  }).then((value) => {print(value)}).catchError((e) {
    print(e);
  });
}
//Future.catchError用于捕获异常
void method12() {
  Future.delayed(new Duration(seconds: 2), () {
    throw AssertionError("Error");
  }).then((value) => {print(value)}).catchError((e) {
    print(e);
  });
}
//then方法还有一个可选参数onError,也可以用它来捕获异常
void method13() {
  Future.delayed(new Duration(seconds: 2), () {
    throw AssertionError("Error");
  }).then((value) => print(value), onError: (e) {
    print(e);
  });
}
//Future.whenComplete 无论成功和失败均会调用
void method14() {
  Future.delayed(new Duration(seconds: 2), () {
    throw AssertionError("Error");
  }).then((value) => print("执行成功:$value")).catchError((e) {
    print("执行失败:$e");
  }).whenComplete(() => print("无论成功还是失败均会调这里"));
}
4.多个异步任务处理
//Future.wait 等待多个异步任务全都执行完后再操作
void method15() {
  Future.wait([
    Future.delayed(new Duration(seconds: 2), () {
      return "hello";
    }),
    Future.delayed(new Duration(seconds: 4), () {
      return " world";
    })
  ]).then((value) => print(value[0] + value[1]), onError: (e) {
    print(e);
  });
}

//定义了三个方法 返回值均为Future对象
Future<String> login(String userName, String pwd) {
  return Future<String>.delayed(new Duration(seconds: 2), () {
    print("login:" + new DateTime.now().millisecondsSinceEpoch.toString());
    return userName + pwd;
  });
}

Future<String> getUserInfo(String id) {
  return Future<String>.delayed(new Duration(seconds: 2), () {
    print(
        "getUserInfo:" + new DateTime.now().millisecondsSinceEpoch.toString());
    return "userinfo userinfo userinfo";
  });
}

Future saveUserInfo(String userInfo) {
  return Future(() {
    print(
        "saveUserInfo:" + new DateTime.now().millisecondsSinceEpoch.toString());
  });
}
//使用回调地狱连续执行上面三个任务 可读性差
task1() {
  login("关羽", "123456")
      .then((id) => getUserInfo(id).then((userInfo) => saveUserInfo(userInfo)));
}
//使用async/await消除回调地狱 async表示这个方法是异步的
// await后面接Future 表示等待该异步任务完成 异步任务完成后才会往下运行
task2() async {
  print("task start:" + new DateTime.now().millisecondsSinceEpoch.toString());
  String id = await login("赵云", "123456");
  String userInfo = await getUserInfo(id);
  await saveUserInfo(userInfo);
  //执行接下来的操作
  print("task end:" + new DateTime.now().millisecondsSinceEpoch.toString());
}

//Stream 用于接收异步事件数据
task3() {
  Stream.fromFutures([
    Future.delayed(new Duration(seconds: 2), () {
      print("event 1 " + new DateTime.now().millisecondsSinceEpoch.toString());
      return "1";
    }),
    Future.delayed(new Duration(seconds: 2), () {
      print("event 2 " + new DateTime.now().millisecondsSinceEpoch.toString());
      throw AssertionError("error");
    }),
    Future.delayed(new Duration(seconds: 2), () {
      print("event 2 " + new DateTime.now().millisecondsSinceEpoch.toString());
      return "3";
    })
  ]).listen((event) {
    //监听每个Future的返回结果
    print(event);
  }, onError: (e) {
    //监听执行Futrue时的错误及异常
    print(e);
  }, onDone: () {
    //所有异步事件执行完毕后的回调
    print("event done");
  });
}
上一篇下一篇

猜你喜欢

热点阅读