Dart 基础语法笔记

Dart 基础语法笔记

Hello Dart

/**
 * 1.main函数是dart入口
 * 2.dart当中打印信息使用print函数
 */

main(List<String> args) {
  // List<String> args -> 列表<String> - 泛型
  print("Hello World");
}

变量声明

main(List<String> args) {
  // 1.明确的声明
  String name = "why";

  // 2.类型推导(var/final/const)
  // 类型推导的方式虽然没有明确的指定变量的类型, 但是变量是有自己的明确的类型
  // 2.1.var声明变量
  var age = 20;
  // age = "abc";  //报错
  age = 30;

  // 2.2.final声明常量
  final height = 1.88;
  // height = 2.00;  //报错

  // 2.3.const声明常量
  const address = "广州市";
  // address = "北京市";  //报错

  // 2.4.final和const的区别
  // const必须赋值 常量值(编译期间需要有一个确定的值)
  // final可以通过计算/函数获取一个值(运行期间来确定一个值)
  // const date1 = DateTime.now(); 写法错误
  final date2 = DateTime.now();

  // final用于的更多一点
  // p1和p2是不是同一个对象
  // final p1 = Person("why");
  // final p2 = Person("why");
  // print(identical(p1, p2));

  // 在Dart2.0之后, const可以省略
  const p1 = const Person("why");
  const p2 = const Person("why");
  const p3 = const Person("lilei");

  print(identical(p1, p2)); //true
  print(identical(p2, p3)); //false
}

class Person {
  final String name;
  const Person(this.name);
}

字符串类型

main(List<String> args) {
  // 1.定义字符串
  var str1 = 'abc';
  var str2 = "abc";
  var str3 = """
  abc
  cba
  nba
  """;

  // 2.字符串和表达式进行拼接
  var name = "why";
  var age = 19;
  var height = 1.88;

  // 强调: ${变量}, 那么{}可以省略
  var message1 = "my name is $name, age is $age, height is $height";
  var message2 = "name is $name, type is ${name.runtimeType}";
  print(message1);
  print(message2);
}

集合类型

main(List<String> args) {
  // 1.列表List: [];
  var names = ["abc", "cba", "nba", "cba"];
  names.add("mba");

  // 2.集合Set: {}; 
  var movies = {"星际穿越", "大话西游", "盗梦空间"};
  names = Set<String>.from(names).toList();
  print(names);

  // 3.映射Map
  var info = {
    "name": "why",
    "age": 18
  };
}

函数的基本使用

main(List<String> args) {
    print(sum(20, 30));
}

// 返回值的类型是可以省略(开发中不推荐)
int sum(int num1, int num2) {
  return num1 + num2;
}

函数的可选参数

main(List<String> args) {
  sayHello1("why");

  sayHello2("why", 18, 1.88);

  sayHello3("why", height: 1.88);
}

// 必选参数: 必须传
void sayHello1(String name) {
  print(name);
}

// dart中没有函数的重载
// 可选参数: 位置可选参数 - 命名可选参数
// 注意: 只有可选参数才可以有默认值
// 位置可选参数: [int age, double height]
// 实参和形参在进行匹配时, 是根据位置的匹配
void sayHello2(String name, [int age = 10, double height = 2]) {

}

// 命名可选参数
void sayHello3(String name, {int age = 10, double height = 3.14}) {

}

函数是一等公民

main(List<String> args) {
  // 1.直接找到另外一个定义的函数传进去
  // test(bar);

  // 2.匿名函数 (参数列表) {函数体};
  test(() {
    print("匿名函数被调用");
    return 10;
  });

  // 3.箭头函数: 条件, 函数体只有一行代码
  test(() => print("箭头函数被执行")); 
}

// 函数可以作为另外一个函数的参数
void test(Function foo) {
  var result = foo();
}


void bar() {
  print("bar函数被调用");
}
main(List<String> args) {

  test((num1, num2) {
    return num1 + num2;
  });

  var demo1 = demo();
  print(demo1(20, 30));
}

typedef Calculate = int Function(int num1, int num2);

void test(Calculate calc) {
  calc(20, 30);
}

Calculate demo() {
  return (num1, num2) {
    return num1 * num2;
  };
}

赋值运算符

main(List<String> args) {
  // 1.??=: 
  // 当原来的变量有值时, 那么??=不执行
  // 原来的变量为null, 那么将值赋值给这个变量
  var name = null;
  name ??= "lilei";
  print(name);

  // ??:
  // ??前面的数据有值, 那么就使用??前面的数据
  // ??前面的数据为null, 那么就使用后面的值
  var name1 = null;
  var temp = name1 ?? "lilei";
  print(temp);
}

级联运算符

main(List<String> args) {
  // var p = Person();
  // p.name = "why";
  // p.run();
  // p.eat();

  // 级联运算符
  var p = Person()
            ..name = "why"
            ..eat()
            ..run();
}

class Person {
  String name;

  void run() {
    print("running");
  }

  void eat() {
    print("eating");
  }
}

for循环的使用

main(List<String> args) {
  // 1.基础for循环
  for (var i = 0; i < 10; i++) {
    print(i);
  }

  // 2.遍历数组
  var names = ["why", "cba", "cba"];
  for (var i = 0; i < names.length; i++) {
    print(names[i]);
  }

  for (var name in names) {
    print(name);
  }
}

类的定义

main(List<String> args) {
  var p = Person("why", 18);
}

class Person {
  String name;
  int age;

  // Person(String name, int age) {
  //   this.name = name;
  //   this.age = age;
  // }

  Person(this.name, this.age);
}

类的构造函数

main(List<String> args) {
  // 1.创建Person对象
  var p = Person.withNameAgeHeight("why", 18, 1.88);
  // print(p.toString());

  var p1 = Person.fromMap({
    "name": "lilei",
    "age": 18,
    "height": 1.88
  });
  print(p1);

  // 2.知识点: Object和dynamic的区别
  // 父类应用指向子类对象
  // Object和dynamic
  // Object调用方法时, 编译时会报错
  // dynamic调用方法时, 编译时不报错, 但是运行时会存在安全隐患

  // Object obj = "why";
  // print(obj.substring(1));

  // 明确声明
  // dynamic obj = 123;
  // print(obj.substring(1));
}

class Person {
  String name;
  int age;
  double height;

  Person(this.name, this.age);
  // Person(this.name, this.age, this.height);

  // 命名构造函数
  Person.withNameAgeHeight(this.name, this.age, this.height);
  Person.fromMap(Map<String, dynamic> map) {
    this.name = map["name"];
    this.age = map["age"];
    this.height = map["height"];
  }

  @override
  String toString() {
    return "$name $age $height";
  }
}

类的初始化列表

main(List<String> args) {
  var p = Person("why");
}

class Person {
  final String name;
  final int age;

  Person(this.name, {int age}): this.age = age ?? 10 {
    // this.age = 10;
  }
}

重定向构造函数

main(List<String> args) {
  var p = Person("why");
  print(p.age);
}


class Person {
  String name;
  int age;

  // Person(this.name): age = 0;
  // 构造函数的重定向
  Person(String name): this._internal(name, 0);

  Person._internal(this.name, this.age);
}

常量构造函数

main(List<String> args) {

  const p1 = Person("why");
  const p2 = Person("why");
  print(identical(p1, p2));

}

class Person {
  final String name;
  // final String age;

  const Person(this.name);
  // const Person(this.name, this.age);
}

工厂构造函数

main(List<String> args) {
  final p1 = Person.withName("why");
  final p2 = Person.withName("why");
  print(identical(p1, p2));
}
 
// 普通的构造函数: 会自动返回创建出来的对象, 不能手动的返回
// 工厂构造函数最大的特点: 可以手动的返回一个对象
class Person {
  String name;
  String color;

  static final Map<String, Person> _nameCache = {};
  static final Map<String, Person> _colorCache = {};

  factory Person.withName(String name) {
    if (_nameCache.containsKey(name)) {
      return _nameCache[name];
    } else {
      final p = Person(name, "default");
      _nameCache[name] = p;
      return p;
    }
  }

  factory Person.withColor(String color) {
    if (_colorCache.containsKey(color)) {
      return _colorCache[color];
    } else {
      final p = Person("default", color);
      _colorCache[color] = p;
      return p;
    }
  }

  Person(this.name, this.color);
}

类的setter和getter

main(List<String> args) {
  final p = Person();

  // 直接访问属性
  p.name = "why";
  print(p.name);

  // 通过getter和setter访问
  p.setName = "lilei";
  print(p.getName);
}


class Person {
  String name;

  // setter
  set setName(String name) => this.name = name;
  // getter
  String get getName => name;
}

类的继承

main(List<String> args) {
  
}

class Animal {
  int age;

  Animal(this.age);
}

class Person extends Animal {
  String name;

  Person(this.name, int age): super(age);
}

抽象类的使用

main(List<String> args) {
  final s = Shape();

  final map = Map();
  print(map.runtimeType);
}


// 注意二: 抽象类不能实例化
abstract class Shape {
  int getArea();
  String getInfo() {
    return "形状";
  }

  factory Shape() {
    return null;
  }
}


// 注意一:继承自抽象类后, 必须实现抽象类的抽象方法
// class Rectangle extends Shape {
//   @override
//   int getArea() {
//     return 100;
//   }
// }

隐式接口

main(List<String> args) {
  
}

// Dart中没有哪一个关键字是来定义接口的
// 没有这些关键字interface/protocol
// 默认情况下所有的类都是隐式接口
// Dart支持单继承
// 当将一个类当做接口使用时, 那么实现这个接口的类, 必须实现这个接口中所有方法

class Runner {
  void running() {

  }
}


class Flyer {
  void flying() {

  }
}

class Animal {
  void eating() {
    print("动物次东西");
  }

  void running() {
    print("running");
  }
}

class SuperMan extends Animal implements Runner, Flyer {
  @override
  void eating() {
    super.eating();
  }

  @override
  void flying() {
  }
}



mixin混入的使用

main(List<String> args) {
  final sm = SuperMan();
  sm.running();
  sm.flying();
}

mixin Runner {
  void running() {
    print("runner running");
  }
}


mixin Flyer {
  void flying() {
    print("flying");
  }
}

class Animal {
  void eating() {
    print("动物吃东西");
  }

  void running() {
    print("animal running");
  }
}

class SuperMan extends Animal with Runner, Flyer {
  @override
  void eating() {
    super.eating();
  }

  void running() {
    print("SuperMan running");
  }
}

类属性和类方法

main(List<String> args) {
  Person.courseTime = "8:00";
  print(Person.courseTime);

  Person.gotoCourse();
}


class Person {
  // 成员变量
  String name;

  // 静态属性(类属性)
  static String courseTime;

  // 对象方法
  void eating() {
    print("eating");
  }

  // 静态方法(类方法)
  static void gotoCourse() {
    print("去上课");
  }
}

枚举的使用

// 枚举: enum
main(List<String> args) {
  final color = Colors.red;

  switch (color) {
    case Colors.red:
      print("红色");
      break;
    case Colors.blue:
      print("蓝色");
      break;
    case Colors.green:
      print("绿色");
      break;
  }

  print(Colors.values);
  print(Colors.red.index);
}

enum Colors {
  red,
  blue,
  green
}

库的使用

使用系统的库.

// import 'dart:io';
// import 'dart:isolate';
// import 'dart:async';
// import 'dart:math';

// 1.系统的库: import 'dart:库的名字';

import 'dart:math';

main(List<String> args) {
  final num1 = 20;
  final num2 = 30;
  print(min(num1, num2));
}

使用自定义库

  • utils.dart 
export 'math_utils.dart';
export 'date_utils.dart';
  • 使用:
/**
 * 1.补充一: as关键字给库起别名
 * 2.补充二: 默认情况下载导入一个库时, 导入这个库中所有的内容
 *    * show: 执行要导入的内容
 *    * hide: 隐藏某个要导入的内容, 导入其它内容
 * 3.公共的dart文件的抽取: export
 * 4.
 */

// import 'utils/math_utils.dart' as mUtils;
// import "utils/math_utils.dart" show sum, mul;
// import "utils/math_utils.dart" hide mul;
// import 'utils/date_utils.dart';
import "utils/utils.dart";

main(List<String> args) {
  // print(sum(20, 30));
  print(sum(20, 30));
  // print(mul(20, 30));
  print(dateFormat());

  min(20, 30);
}

使用第三方库

  • 本地新建文件pubspec.yaml
name: coderwhy
description: a dart library
dependencies: 
  http: ^0.13.4
  • 在控制台执行指令:pub get 进行安装
  • 导入使用:
import 'package:http/http.dart' as http;

main(List<String> args) async {
  var url = 'http://123.207.32.32:8000/home/multidata';
  var response = await http.get(url);
  print('Response status: ${response.statusCode}');
  print('Response body: ${response.body}');
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值