完成以下问题, 表示你完成了一门编程语言的学习。
以下涉及了项目中常用的主题,可根据具体场景选择完成。

1.入门

1.1 官网地址,特性和应用场景有哪些

官网
Dart 是一个为全平台构建快速应用的客户端优化的编程语言。
特性:

  1. 针对UI开发
  2. 热重载
  3. 全平台,可编译成二进制文件和JavaScript代码
  4. 空安全

场景:

  1. 服务于Flutter框架
  2. 全平台开发(Android、iOS、web、Windows和MacOS)

    1.2 安装与运行

    在安装 Flutter 的时候会同时安装。

    1.3 镜像(选答)

    参考 Flutter

    1.4 编辑器(选答)

    参考 Flutter

    1.5 包管理工具

    参考 Flutter

    2.基本语法

    2.1 概览

  • 所有变量引用的都是 对象,每个对象都是一个 的实例。数字、函数以及 null 都是对象。除去 null 以外(如果你开启了 空安全), 所有的类都继承于 [Object][] 类。
  • 大多数方法都是有名字的,你可以创建一个没有名字的方法,称之为 匿名函数Lambda 表达式Closure 闭包。 ```dart // 注释 /// 文档注释用三个斜线

// 变量,一般指定类型 var name = ‘Bob’; String name = ‘Bob’; // 问号表示可为空 int? lineCount; // assert() 的调用将会在生产环境的代码中被忽略掉。 assert(lineCount == null);

// late 可后面再初始化 // 一般用于实例化对象 // 如果没有初始化就使用会在运行时报错,所以 late String description;

void main() { description = ‘Feijoada!’; print(description); }

// 常量 // 可以使用 final 和 const 关键字 final bar = ‘bar’; // 赋值一次就不能再改的变量 const baz = ‘baz’; // 常量

// if else、switch 用法都和Java一样

// for // 同理:支持 for i、for in 和可迭代类型的方法 foreach() var callbacks = []; for (var i = 0; i < 2; i++) { callbacks.add(() => print(i)); } for (int i in callbacks) { print(i); } // 提示不推荐使用 forEach 迭代 callbacks.forEach((c) => c());

// 断言 // 在开发过程中,可以在条件表达式为 false 时使用

// Make sure the variable has a non-null value. assert(text != null); // Make sure the value is less than 100. assert(number < 100); // Make sure this is an https URL. assert(urlString.startsWith(‘https’));

// 异常 // 第一个参数为抛出的异常对象,第二个参数为栈信息 try { // ··· } on Exception catch (e) { print(‘Exception details:\n $e’); } catch (e, s) { print(‘Exception details:\n $e’); print(‘Stack trace:\n $s’); }

// 方法 // Dart 有两种传参方法:位置参数和命名参数。 // 位置和命名又分为必传与可选 // 可以用 = 为函数的命名参数和位置参数定义默认值,默认值必须为编译时常量 int sumUp(int a, int b, int c) { return a + b + c; } // 中括号表示可选位置参数,这里接收一至五个整数 int sumUpToFive(int a, [int b = 2, int c = 3, int d = 4, int e = 5]) { // ··· } // 大括号表示可选命名参数 // 如果命名参数用 required 修饰,表示一定要传 void printName(String firstName, String lastName, {String? suffix}) { print(‘$firstName $lastName ${suffix ?? ‘’}’); } // ··· printName(‘Avinash’, ‘Gupta’); printName(‘Poshmeister’, ‘Moneybuckets’, suffix: ‘IV’);

// 避空运算符 // 判空赋值 int? a; // = null a ??= 3;// if (a == null) a=3 print(a); // <— Prints 3. // 判空表达式 print(1 ?? 3); // <— Prints 1. print(null ?? 12); // <— Prints 12. // 判空对象 String? upperCaseIt(String? str) { // Try conditionally accessing the toUpperCase method here. // 等效于 (str == null) ? null : str.toUpperCase() return str?.toUpperCase(); }

// 箭头语法 // 箭头语法是一种定义函数的方法,该函数将在其右侧执行表达式并返回其值 bool hasEmpty = aListOfStrings.any((s) { return s.isEmpty; }); // 等效于 bool hasEmpty = aListOfStrings.any((s) => s.isEmpty);

// 要对同一对象执行一系列操作,请使用级联 // 感觉还是普通的好一点 querySelector(‘#confirm’) ?..text = ‘Confirm’ ..classes.add(‘important’) ..onClick.listen((e) => window.alert(‘Confirmed!’));

  1. <a name="q9TLo"></a>
  2. ### 2.2 面相对象
  3. ```dart
  4. // 类
  5. class MyClass {
  6. // 下划线开头表示私有属性
  7. int _aProperty = 0;
  8. // 公开的属性
  9. String name;
  10. // 加了 final 就一定要在构造函数初始化
  11. final int age;
  12. // 也可以使用命名参数
  13. final int sum;
  14. // 也可以在构造函数中初始化
  15. int x;
  16. int y;
  17. // 构造函数
  18. MyClass(this.name, this.age, {this.sum=0})
  19. : x = 1, // 经常在这里放置断言 assert(x>1)
  20. y = 1 {
  21. print('x=$x, y=$y');
  22. }
  23. // 命名构造函数
  24. // 可以给某些参数一些初始值
  25. MyClass.origin(this.sum, this.name)
  26. : x = 2,
  27. y = 2,
  28. age = 18;
  29. // get 方法
  30. int get aProperty => _aProperty;
  31. // set 方法
  32. set aProperty(int value) {
  33. if (value >= 0) {
  34. _aProperty = value;
  35. }
  36. }
  37. }
  38. main() {
  39. MyClass myClass0 = MyClass('James', 10);
  40. myClass0.aProperty = 10;
  41. MyClass myClass1 = MyClass('James', 10, sum: 1);
  42. MyClass myClass2 = MyClass.origin(1, 'name');
  43. }

构造方法有

  • 普通构造方法
  • 命名构造方法
  • 工厂构造方法
  • 重定向构造方法
  • const构造方法 ```dart // 命名构造方法 // 允许一个类具有多个构造方法 // 因为Dart里不允许有多个默认构造方法,哪怕有不同的参数,这与Java不同 class Point { double x, y;

    Point(this.x, this.y);

    Point.origin()

    1. : x = 0,
    2. y = 0;

    } final myPoint = Point.origin();

// 工厂构造方法 // 能够返回其子类甚至 null 对象 // 用的不多 class Square extends Shape {}

class Circle extends Shape {}

class Shape { Shape();

factory Shape.fromTypeName(String typeName) { if (typeName == ‘square’) return Square(); if (typeName == ‘circle’) return Circle();

  1. throw ArgumentError('Unrecognized $typeName');

} }

// 重定向构造方法 // 有时一个构造方法仅仅用来重定向到该类的另一个构造方法。重定向方法没有主体,它在冒号(:)之后调用另一个构造方法。 class Automobile { String make; String model; int mpg;

// The main constructor for this class. Automobile(this.make, this.model, this.mpg);

// Delegates to the main constructor. Automobile.hybrid(String make, String model) : this(make, model, 60);

// Delegates to a named constructor Automobile.fancyHybrid() : this.hybrid(‘Futurecar’, ‘Mark 2’); }

// Const 构造方法 // 如果你的类生成的对象永远都不会更改,则可以让这些对象成为编译时常量。为此,请定义 const 构造方法并确保所有实例变量都是 final 的。 // 好像也不常用 class ImmutablePoint { static const ImmutablePoint origin = ImmutablePoint(0, 0);

final int x; final int y;

const ImmutablePoint(this.x, this.y); }

  1. <a name="dRytE"></a>
  2. ## 3.基本数据类型
  3. <a name="Gu9Cr"></a>
  4. ### 3.1 数字
  5. 定义, 加减乘除,取余,取整, 取小数点后两位, 整数与小数转换, 指数, 进制转换
  6. ```dart
  7. // 有三种,num、int、double
  8. // num 可以表示整型或者浮点型数字,有时候会用到
  9. import 'dart:math' as math;
  10. main() {
  11. int a = 2;
  12. int b = 3;
  13. int c = a + b;
  14. print('c=$c');
  15. int d = a - b;
  16. print('d=$d');
  17. int e = a * b;
  18. print('e=$e');
  19. // 求商
  20. double f = a / b;
  21. print('f=$f');
  22. // 求商的整数部分
  23. int g = a ~/ b;
  24. print('g=$g');
  25. // 求余
  26. int i = b % a;
  27. print('i=$i');
  28. // 小数点后两位
  29. String ff = f.toStringAsFixed(2);
  30. print('ff=$ff');
  31. // 整数小数转化
  32. int h = f.toInt();
  33. print('h=$h');
  34. // 指数
  35. num j = math.pow(a, b);
  36. print('j=$j');
  37. // 随机数
  38. math.Random random = math.Random();
  39. int k = random.nextInt(100);
  40. print('k=$k');
  41. }

3.2 字符

定义, 转义, 拼接, 格式化, 截取, 长度, 遍历, 拆分, 替换, 匹配(正则表达式)

3.3 列表

定义
增: 单个, 批量, 任意位置
删: 单个, 批量, 全部
改: 单个, 批量
查: 根据索引找值, 根据值找索引
截取: 根据范围截取
遍历(正反)
排序

3.4 字典(键值对)

定义
增: 单个, 批量
删: 单个, 批量, 全部
改: 单个, 批量
查: 根据键找值, 根据值找键
遍历(键的正反)
排序

3.5 集合

定义, 增删改查
集合(set) 是一个无序不重复元素的集

3.6 栈和队列

3.7 元组(选做)

4.练习

4.1 时间

当前时间戳
格式化输出, 年-月-日 时:分:秒
格式化时间转时间戳
时间戳转格式化时间

4.2 文件

4.2.1 文件

全部读
按行读
创建文件并写入
原文件追加
原文件覆盖写入
删除文件
文件大小
修改文件名

4.2.2 目录

当前目录
列出目录中的文件和目录
获取文件的绝对路径
分离后缀名,文件名和路径
拼接路径与文件
目录或文件是否存在
复制粘贴
删除目录

4.3 加密

MD5, SHA1

4.4 异步

线程与协程

4.5 网络服务

http, websocket, UDP 等等

4.6 命令行

4.7 测试

4.8 图片

缩放, 旋转, 修改格式, 色彩等等

4.10 数据库操作

4.11 数据处理

json,xml

5.练手小项目

根据不同的场景选择,可以在 Github 上克隆项目