Dart入门

简介: Dart入门

Dart数据类型


Number

num age = 12;
int a = 15;
double b = 16;


String

String name = '张三';
String name2 = '''
      张三张三张三张三张三
      张三张三张三张三张三
      张三张三张三张三张三
      张三张三张三张三张三
    ''';


Boolean

bool isShow = false;


List

List<int> list = [1, 2, 3];
var list2 = [1, 2, 3];


Map

Map<String, String> map = <String, String>{
    '小明': '26',
    '小红': '23',
  };
var map2 = <String, String>{
    '小明': '26',
    '小红': '23',
  };
var map3 = {
    '小明': '26',
    '小红': '23',
  };


Dart函数


main函数

void main(List<String> arguments) {
}


可选命名参数函数 {}

void running({String name,int distance}){
  print('${name} run ${distance}');
}
void main(List<String> arguments) {
  running(name: '夏明',distance: 200);
}


可选位置参数函数 []

void running([String name, int distance]) {
  print('${name} run ${distance}');
}
void main(List<String> arguments) {
  running('夏明', 200);
}

函数默认值 =

void running([String name='小红', int distance = 300]) {
  print('${name} run ${distance}');
}
void main(List<String> arguments) {
  running('小明');
}


函数做参数的函数 (fun){}

void running(Function callback, [String name = '小红', int distance = 300]) {
  callback('${name} run ${distance}');
}
void callback(String message) {
  print(message);
}
void main(List<String> arguments) {
  running(callback, '小明');
}


匿名函数 (){}

void running(Function callback, [String name = '小红', int distance = 300]) {
  callback('${name} run ${distance}');
}
void main(List<String> arguments) {
  //参数1为匿名函数
  running((message) {
    print(message);
  }, '小明');
  //简写,参数1为匿名函数
  running((message) => print(message), '小明');
}

Dart面向对象 特征:封装 继承 多态 抽象


class Person {
}

静态变量/静态方法 static
class Person {
  //定义静态变量
  static const String TYPE = "人类";
  //定义静态方法
  static String getType() {
    return "人类";
  }
}
void main(List<String> arguments) {
  //调用静态变量
  Person.getType();
  //调用静态方法
  Person.TYPE;
}

枚举类型 enum
///定义枚举
enum PersonType{
  xiaoWang,
  xiaoZhang
}
void main(List<String> arguments) {
  //获取定义枚举中所有项
  print(PersonType.values);
  //获取定义枚举中的指定项
  print(PersonType.xiaoWang);
}

成员变量/成员方法/对象类型
class Person {
  String name;
  void run() {
    print('${name} person run');
  }
}
void main(List<String> arguments) {
  //普通操作
  Person person = Person();
  person.name = '张三';
  person.run();
  //级联操作
  Person person2 = Person()
    ..name='zhangsan'
    ..run();
  //输出类型
  print(person2.runtimeType.toString());
}

声明构造方法 可省略{}和{}中的this.xxx=xxx;
class Person {
  String name;
  int age;
  //全写版本
  Person(name, age){
    this.name = name;
    this.age = age;
  }
  //简写版本
  Person(this.name, this.age);
}

命名构造方法(无重载概念) 可使用:类名.别名(){}定义
class Person {
  String name;
  int age;
  //命名构造方法1
  Person.name(this.name);
  //命名构造方法2
  Person.age(this.age);
}

非默认构造方法 父类无默认构造方法的情况下,子类要显示调用 子类名.别名() : super.别名(){}
class Person {
  String name;
  int age;
  Person(this.name, this.age);
}
class XiaoMing extends Person{
  //显示调用(super)
  XiaoMing(String name, int age) : super(name, age);
}

初始化列表(构造函数执行前执行) 类名.别名(): 赋值, 赋值...{print('命名构造函数执行')}
class Person {
  String name;
  int age;
  Person()
      : this.name = '张三',
        this.age = 26 {
    print('构造函数执行...');
  }
}
void main(List<String> arguments) {
  //实例化未进行赋值
  Person person = Person();
  print("person name : ${person.name}, age : ${person.age}");
}

重定向构造方法 命名构造函数调用同名构造函数 类名.别名(参数1):this.类名(参数1,默认1,默认2)
class Person {
  String name;
  int age;
  Person(this.name, this.age);
  Person.name(name) : this(name, 23);
}

常量构造方法 定义: 1. cosnt 类名(参数) 2. static final 类名 instance = const 类名(值);
//类内信息均设置为不可变
class Person {
  final String name;
  final int age;
  static final Person instance = const Person('张三', 23);
  const Person(this.name, this.age);
}
void main(List<String> arguments) {
  Person person = Person.instance;
  person.name;
  person.age;
}

工厂构造方法 factory 类名(){return }
//避免相同name的对象生成
class Logger {
  String name;
  static final Map<String, Logger> _person = <String, Logger>{};
  factory Logger(name) {
    return _person.putIfAbsent(name, () => Logger._internal(name));
  }
  Logger._internal(this.name);
  void log() {
    print("log ${name}");
  }
}

继承 extends
class Person {
  String name;
  int age;
  Person(this.name, this.age);
}
class XiaoMing extends Person{
  //显示调用(super)
  XiaoMing(String name, int age) : super(name, age);
}

重写 @override
class Person {
  String name;
  int age;
  Person(this.name, this.age);
  void run() {
    print("${name} person run");
  }
}
class XiaoMing extends Person {
  //显示调用(super)
  XiaoMing(String name, int age) : super(name, age);
  //重写父类run方法
  @override
  void run() {
    //如需要可调用父类run函数
    super.run();
    //做小明Run的事
  }
}

重写操作符(为两个对象增加比较方法) bool operator 操作符(){return}
class Person {
  String name;
  int age;
  @override
  bool operator ==(Object other) =>
      //类型一致且年龄一致,这里的'=='被赋值成同龄人
      other is Person && age == other.age;
}

重写noSuchMethod 直观提示
class Person {
  String name;
  int age;
  Person(this.name, this.age);
  void run() {
    print("${name} person run");
  }
  @override
  dynamic noSuchMethod(Invocation invocation) {
    print('正在执行Person中的${invocation.memberName}无效');
  }
}
void main(List<String> arguments) {
  //接收时类型未知(动态类型),指明类型调用不存在的方法语法检测不通过
  dynamic person = Person('张三', 23);
  person.runrun();
}

多态:必要条件->继承->重写->父类引用指向子类对象
class Person {
  String name;
  int age;
  Person(this.name, this.age);
  void run() {
    print("${name} person run");
  }
}
class XiaoMing extends Person{
  XiaoMing(String name, int age) : super(name, age);
  @override
  void run() {
    print("${name} 百米 run");
  }
}
void main(List<String> arguments) {
  Person xiaoming = XiaoMing('小明', 23);
  xiaoming.run();
}

抽象类 asbtract 定义规范又继承的子类来全部实现
//抽象类不能被实例化
abstract class Movement{
  void running();
  void swimming();
  void tugOfWar();
}
//所有抽象类的方法均要重写
class Person extends Movement{
  String name;
  int age;
  Person(this.name, this.age);
  @override
  void running() {
    // TODO: implement running
  }
  @override
  void swimming() {
    // TODO: implement swimming
  }
  @override
  void tugOfWar() {
    // TODO: implement tugOfWar
  }
}

接口 implements关键词实现 全部实现
abstract class Movement {
  void running();
  void swimming(){
    print('abstract swimming');
  }
}
class Person {
  String name;
  int age;
  Person(this.name, this.age);
}
class XiaoMing extends Person implements Movement {
  XiaoMing(String name, int age) : super(name, age);
  @override
  void running() {
    // TODO: implement running
  }
  @override
  void swimming() {
    // TODO: implement swimming
  }
}
class XiaoMing  implements Movement,Person{
  //实现接口中的全部方法
  @override
  void running() {
    // TODO: implement running
  }
  @override
  void swimming() {
    // TODO: implement swimming
  }
  @override
  void tugOfWar() {
    // TODO: implement tugOfWar
  }
  @override
  int age;
  @override
  String name;
}

混入(mixin) 定义使用mixin 实现使用with
mixin Movement {
  void running() {
    print('mixin running');
  }
}
class Person {
  String name;
  int age;
  Person(this.name, this.age);
}
class XiaoMing extends Person with Movement {
  XiaoMing(String name, int age) : super(name, age);
}
void main(List<String> arguments) {
  XiaoMing xiaoming = XiaoMing('小明', 23);
  //running是XiaoMing混入Movement得到的方法
  xiaoming.running();
}

异常-抛出
void running([String name = '小红', int distance = 300]) {
  print('${name} run ${distance}');
  throw Exception("程序异常退出");
  //简写
  //throw "程序异常退出";
}

异常-捕获-Try-Catch
void main(List<String> arguments) {
  try{
    running('小明');
  }catch(e,t){
    print("error:::${e.toString()}");
    print("track:::${t.toString()}");
  }
}

异常-捕获-Try-On-Catch
void main(List<String> arguments) {
  try {
    test();
    test1();
  } on FormatException catch (e) {
    print("error FormatException:::${e.toString()}");
  } on Exception catch (e) {
    print("error Exception:::${e.toString()}");
  } catch (e, t) {
    print("error:::${e.toString()}");
    print("track:::${t.toString()}");
  }
}

异常-重新抛出异常
void main(List<String> arguments) {
  try {
    running();
  } catch (e, t) {
    //重新抛出异常
    rethrow;
  }finally{
    print("释放资源");
  }
}

异常-自定义异常
//抽象类相当于Java中的接口 需要使用implements实现
class MyException implements Exception{
  final String message;
  //可选参数
  MyException([this.message]);
  //??运算符message为空取后者
  @override
  String toString() => message ?? "MyException";
}

异常-枚举-实例
//如果函数内部处理为异步并且需要接收返回值,使用`Future`关键字
Future httpRequest() async {
  try {
    var url = "https://www.baidu.com";
    http.get(url).then((data) {
      if (data.statusCode == 200) {
        return data;
      } else if (data.statusCode == 404) {
        throw StatusException(status: StatusEnum.STATUS_404);
      } else if (data.statusCode == 500) {
        throw StatusException(status: StatusEnum.STATUS_500);
      } else {
        throw StatusException(status: StatusEnum.DEFAULT);
      }
    });
  } catch (e) {
    return print("error::: ${e}");
  }
}
//定义状态枚举
enum StatusEnum { DEFAULT, STATUS_404, STATUS_500 }
//定义异常
class StatusException implements Exception {
  StatusEnum status;
  StatusException({this.status});
  @override
  String toString() {
    switch (status) {
      case StatusEnum.STATUS_404:
        return "页面未找到";
        break;
      case StatusEnum.STATUS_500:
        return "服务器发生异常";
        break;
      case StatusEnum.DEFAULT:
        return "未知异常";
    }
  }
}

List 不唯一,按序插入,操作索引
List<String> list = ['张三', '李四', '王五'];
//常用属性
list.length;//长度
list.reversed;//反序
list.isEmpty;//空
list.isNotEmpty;//非空
//常用方法
list.add('赵柳');//增加元素
list.addAll(['夏明','小红']);//增加多个元素
list.indexOf('小赵');//返回元素索引,找不到返回-1
list.remove(value);//按值删除
list.removeAt(index)//按索引删除
list.insert(index, element)//按索引插入元素
list.insertAll(index, iterable)//按索引插入多个元素
list.toList()//其他类型转List
list.join('_')//将List按指定元素拼接xx_yy_vv

Set 唯一,无序
Set<String> set = {'张三', '李四', '王五'};
//常用属性
set.length;//长度
set.isEmpty;//空
set.isNotEmpty;//非空
set.first;//首元素
set.last;//尾元素
//常用方法
set.add('赵柳');//增加元素
set.addAll({'夏明','小红'});//增加多个元素
set.toString();//按字符串形式输出
set.join('-');//将Set按指定元素拼接
set.contains('夏利');//包含指定元素
set.containsAll(other);//包含一些元素
set.elementAt(index);//返回指定索引的元素
set.remove(value);//按值删除
set.removeAll(elements)//按索引删除
set.clear();//清空数据

Map Key-Value
Map<String, int> map = <String, int>{
    '张三': 18,
    '李四': 20,
    '王五': 25,
};
//常用属性
map.hashCode;
map.isEmpty;
map.keys;
map.values;
map.length;
//常用方法
map.toString();
map.addAll({'赵柳':30});
map.containsKey('张三');
map.containsValue(3);
map.remove(key);
map.clear();
//迭代
map.forEach((key, value) {
    print(key + ' - ' + value.toString());
});
for(var key in map.keys){
    map.putIfAbsent(key, (){
      return 30;
    });
    print(map[key]);
}

泛型
<T>
复制代码

Future 延迟任务,耗时任务
import 'dart:io';
void main(List<String> arguments) {
  print('start');
  Future.delayed(Duration(seconds: 3),(){
    print('延迟任务');
  });
  //优先级高
  Future((){
    sleep(Duration(seconds: 5));
    print('耗时任务');
  });
  print('end');
}

Future 创建
void main(List<String> arguments) {
  print('start');
  Future(() => print('async task'));
  Future.sync(() => print('sync task'));
  Future.microtask(() => print('microtask task'));
  Future.delayed(Duration(seconds: 1),() => print('delayed task'));
  Future fu = Future.value("Future的值为30");
  Future.wait([fu,fu,fu]);
  print('end');
}

Future then
void main(List<String> arguments) {
  print('start');
  Future fu = Future.value("Future的值为30");
  fu.then((value) => print(value));
  print('end');
}

Stream创建periodic
import 'dart:async';
int callBack(int value){
  return value;
}
createStream() async{
  Stream<int> stream = Stream.periodic(Duration(seconds: 1),callBack);
  await for(var i in stream){
    print(i);
  }
}
void main(List<String> arguments) {
  createStream();
}

Stream创建fromFuture,fromFutures,fromIterable
import 'dart:async';
import 'dart:io';
createStream1() async {
  print('start test');
  Future<String> future = Future(() {
    return '异步任务';
  });
  Stream<String> stream = Stream.fromFuture(future);
  await for (var s in stream) {
    print(s);
  }
  print('end test');
}
createStream2() async {
  print('start test');
  Future<String> future1 = Future(() {
    sleep(Duration(seconds: 3));
    return '异步任务1';
  });
  Future<String> future2 = Future(() {
    return '异步任务2';
  });
  Future<String> future3 = Future(() {
    sleep(Duration(seconds: 5));
    return '异步任务3';
  });
  Stream<String> stream = Stream.fromFutures([future1, future2, future3]);
  await for (var s in stream) {
    print(s);
  }
  print('end test');
}
createStream3() async {
  print('start test');
  Stream<int> stream = Stream.fromIterable([1,2,3,4,5]);
  await for (var i in stream) {
    print(i);
  }
  print('end test');
}
void main(List<String> arguments) async {
  createStream3();
}

Stream操作take
import 'dart:async';
int callBack(int value) {
  return value;
}
createStream() async {
  Duration interval = Duration(seconds: 1);
  Stream<int> stream = Stream.periodic(interval, (data) => data);
  /// 取10次
  /// stream = stream.take(10);
  /// 按条件取内容
  stream = stream.takeWhile((data) {
    return data < 8;
  });
  await for (var i in stream) {
    print(i);
  }
}
void main(List<String> arguments) {
  createStream();
}

Stream操作skip
import 'dart:async';
int callBack(int value) {
  return value;
}
createStream() async {
  Duration interval = Duration(seconds: 1);
  Stream<int> stream = Stream.periodic(interval, (data) => data);
  stream = stream.take(10);
  //跳过
  //stream = stream.skip(2);
  //按条件跳过
  stream = stream.skipWhile((element) => element<5);
  await for (var i in stream) {
    print(i);
  }
}
void main(List<String> arguments) {
  createStream();
}

Stream操作toList
import 'dart:async';
int callBack(int value) {
  return value;
}
createStream() async {
  Duration interval = Duration(seconds: 1);
  Stream<int> stream = Stream.periodic(interval, (data) => data);
  stream = stream.take(10);
  //toList
  List<int> listData = await stream.toList();
  for (int i in listData) {
    print(i);
  }
}
void main(List<String> arguments) {
  createStream();
}

Stream操作where
import 'dart:async';
int callBack(int value) {
  return value;
}
createStream() async {
  Stream<int> stream = Stream.periodic(Duration(seconds: 1), callBack);
  /// where
  stream = stream.where((event) => event > 2);
  stream = stream.where((event) => event < 6);
  await for (var i in stream) {
    print(i);
  }
}
void main(List<String> arguments) {
  createStream();
}

Stream操作length
import 'dart:async';
int callBack(int value) {
  return value;
}
createStream() async {
  Duration interval = Duration(seconds: 1);
  Stream<int> stream = Stream.periodic(interval, (data) => data);
  stream = stream.take(10);
  //length
  var allEvents = await stream.length;
  print(allEvents);
}
void main(List<String> arguments) {
  createStream();
}
Stream操作监听
import 'dart:async';
int callBack(int value) {
  return value;
}
createStream() async {
  Duration interval = Duration(seconds: 1);
  Stream<int> stream = Stream.periodic(interval, (data) => data);
  stream = stream.take(5);
/// listen
//  stream.listen((data) {
//    print(data);
//  }, onError: (error) {
//    print(error);
//  }, onDone: () {
//    print('onDone');
//  }, cancelOnError: false);
/// forEach
//  stream.forEach((element) {
//    print(element);
//  });
}
void main(List<String> arguments) {
  createStream();
}

Stream操作transform
import 'dart:async';
void testTransform() async {
  Stream stream = Stream<int>.fromIterable([111, 222, 333]);
  var st =
      StreamTransformer<int, String>.fromHandlers(handleData: (data, sink) {
    if (data == 333) {
      sink.add("输入正确");
    } else {
      sink.add("输入错误");
    }
  });
  stream.transform(st).listen((event) {
    print(event);
  }, onError: (error) {
    print(error);
  });
}
void main(List<String> arguments) {
  testTransform();
}

StreamController单订阅流
import 'dart:async';
void main(List<String> arguments) {
  StreamController<String> controller = StreamController();
  controller.stream.listen((event) {
    print(event);
  });
  controller.sink.add("aaa");
  controller.add("bbb");
  controller.add("ccc");
  controller.close();
}

StreamController多订阅流

broadcast

import 'dart:async';
void main(List<String> arguments) {
  StreamController<String> controller = StreamController.broadcast();
  controller.stream.listen((event) {
    print("1::: " + event);
  });
  controller.stream.listen((event) {
    print("2::: " + event);
  });
  controller.sink.add("aaa");
  controller.close();
}

asBroadcastStream

import 'dart:async';
void main(List<String> arguments) {
  StreamController<String> controller = StreamController();
  Stream stream = controller.stream.asBroadcastStream();
  stream.listen((event) {
    print("1::: " + event);
  });
  stream.listen((event) {
    print("2::: " + event);
  });
  controller.sink.add("aaa");
  controller.close();
}

Bloc设计模式详解

         

元数据-常见
@deprecated
@override
@required

元数据-自定义

反射:

import 'dart:mirrors';
//类元数据
class Todo {
  final String name;
  final String content;
  const Todo(this.name, this.content);
}
//方法元数据
class Get {
  final String value;
  const Get({this.value});
}
//方法参数元数据
class Query {
  final String value;
  const Query({this.value});
}
@Todo('spoon', 'Test')
class Test {
  @Get(value: 'domSomething')
  void domSomething(@Query(value: 'param') String param) {
    print('do something');
  }
}
void getWorkAnnotation() {
  //标记元数据的类Test
  ClassMirror classMirror = reflectClass(Test);
  // 获取 class 上的元数据
  classMirror.metadata.forEach((metadata) {
    //判断类型
    if (metadata.reflectee is Todo) {
      print(metadata.reflectee.name + ' ==> ' + metadata.reflectee.content);
    }
  });
  //获取 field 和 method 上的元数据
  classMirror.declarations.forEach((Symbol key, DeclarationMirror value) {
    //是否是method
    if (value is MethodMirror) {
      //方法名称判断
      if (value.simpleName == #domSomething) {
        //遍历元数据
        value.metadata.forEach((metadata) {
          if (metadata.reflectee is Get) {
            print(metadata.reflectee.value);
          }
        });
        // 获取方法中参数上的元数据
        value.parameters.forEach((param) {
          //遍历元数据
          param.metadata.forEach((metadata) {
            if (metadata.reflectee is Query) {
              if (metadata.reflectee.value == null) {
                print(
                    'args name ==> ' + MirrorSystem.getName(param.simpleName));
              } else {
                print(metadata.reflectee.value);
              }
            }
          });
        });
      }
    }
  });
}
void main(List<String> arguments) {
  getWorkAnnotation();
}

库重名
import '' as new-name

库显示隐藏成员
//仅导入xxx
import '' show xxx
//除xxx以外全部导出
import '' hide xxx




相关文章
|
7月前
|
Dart 编译器 API
Dart笔记:Dart 库
Dart笔记:Dart 库
190 0
|
3月前
|
Dart
如何在 Flutter 项目中使用 Dart 语言?
如何在 Flutter 项目中使用 Dart 语言?
137 58
|
7月前
|
Dart API C++
手把手教你写 Dart ffi
本文以step by step的方式说明了Dart ffi的使用,适合新手学习。
|
Dart 前端开发 Java
《深入浅出Dart》Flutter简介
Flutter简介 Flutter是由Google开发和维护的开源框架,自2017年以来,已经迅速获得了开发者社区的广泛认可。其主要目的是开发出高性能、高保真的移动应用程序,用于iOS和Android两个主要平台。 Google创建Flutter的初衷是解决跨平台开发中的一些普遍问题,包括性能瓶颈,不同平台的UI不一致等。Google希望Flutter能够创建美观、流畅且用户体验接近原生应用的应用程序。目前,Flutter已经逐步扩展到其他平台,如Web、桌面应用和嵌入式系统。
107 0
|
存储 Dart JavaScript
《深入浅出Dart》Dart库的使用和创建
Dart库的使用和创建 引言 在Dart中,代码重用和模块化可以通过库(libraries)和包(packages)实现。一个库就是一组代码,被一起打包为了实现一种或多种特定功能。一个包则是一种发布和分享Dart库的方式。在这一章,我们将详细介绍如何使用和创建Dart库和包,以及如何实现一个具有大数相加功能的库。 Dart库的使用
154 0
Flutter 入门指南之 Dart 语言基础介绍
Dart是一种由Google开发的通用编程语言,用于构建跨平台的移动、Web和桌面应用程序。以下是Flutter入门指南中的Dart语言基础知识:
105 0
|
Dart 测试技术 JavaScript
《深入浅出Dart》Dart测试
单元测试和集成测试 Dart的生态系统提供了一个完善的测试框架来进行代码的单元测试和集成测试。以下是一些基本的测试知识。 Dart单元测试 单元测试是在软件开发中进行的最小单元的测试。在Dart中,我们可以使用内置的test包来进行单元测试。 安装测试包 首先,我们需要在pubspec.yaml中添加test的依赖:
164 0
|
Dart 前端开发 JavaScript
《深入浅出Dart》Dart的异步编程
Dart的异步编程 在 Dart 中,我们使用 Future 和 async/await 来进行异步编程。当你调用一个异步函数时,它将立即返回一个 Future 对象。当异步操作完成时,Future 将被“完成”或“解析”。 使用 Future Future 是 Dart 中用于表示异步操作的对象。当你调用一个异步函数时,它会立即返回一个 Future 对象,表示这个异步操作的结果。
171 0
|
Dart JavaScript 前端开发
《深入浅出Dart》Dart模块化
Dart模块化详解 在大型软件项目中,模块化是必不可少的,它可以帮助我们更好地组织和管理代码,提高代码的可读性和可维护性。在Dart中,模块化是通过库(libraries)来实现的。 库的定义与使用
134 0
|
Dart JavaScript 前端开发
关于Dart的一些知识点
关于Dart的一些知识点

相关实验场景

更多
下一篇
DataWorks