喜迎
春节

Dart概念


Dart诞生于2011年10月10日,是一种“结构化的Web编程”语言,应用于Web、服务器、移动应用等领域的开发。

1 概述

  • Dart程序有统一的程序入口,即main()函数入口,与Java、C或C++语言相似。
  • 一切皆对象,所有对象都是类的实例,所有对象都继承自内置的Object类,类似于Java语言。
  • Dart语言是弱数据类型,指定类型非必须,指定数据类型和编译时的常量,可提高运行速度。
  • Dart没有public、protected和private的概念,私有特性通过变量或函数,加上下划线来表示。
  • Dart工具可以检查出warning警告信息和errors错误信息。
    • 警告信息,表明代码可能不工作,但是不会妨碍程序运行。
    • 错误信息,可能是编译时的错误,也可能是运行时的错误。
    • 编译时的错误将阻止程序运行,运行时的错误会以exception异常方式呈现。

1-1 入口方法

// 入口方法
// main() {
//   print('入口方法');
// }

// 表示main方法没有返回值
void main() {
  // 打印信息
  print('入口方法');
}

1-2 注释方法

//  注释方法一
/*  注释方法二  */
/// 注释方法三
main() {
  print('注释方法');
}

2 关键字

  • 限制类保留字:awaityield
  • 上下文关键字:asynchideonshowsync
  • 保留字
    • supervoidrethrowwhilethistryreturndo
    • consttruefinallyfinalnullvarassertis
    • breakcasedefaultclasswithnewthrowcontinue
    • catchelseextendsfalseenumforswitchifin
  • 内置标识符
    • abstractdynamiccovariantFunctionexportset
    • operatortypedefinterfaceexternalimportgetpart
    • deferredlibraryimplementsfactorystaticasmixin

3 Dart库

  • 自定义的库:import 'lib/xxx.dart';
  • 系统内置库:import 'dart:convert';
    • dart:io:文件读写I/O相关操作的库。
    • dart:svg:事件和动画的矢量图支持。
    • dart:core:内建类型、对象及核心功能。
    • dart:html:网页开发使用到的库,使用频率高。
    • dart:math:数字常量及函数,提供随机数算法。
    • dart:async:异步编程支持,提供Future和Stream类。
    • dart:convert:不同类型之间的字符编码、解码支持。
    • dart:collection:对dart:core内置库提供更多的集合支持。
  • Pub包管理系统中的第三方库:https://pub.dev/
import 'dart:math';

main() {
  print('最小值:' + min(25, 27).toString());
  print('最大值:' + max(25, 27).toString());
}

3-1 实现请求数据

import 'dart:io';
import 'dart:convert';

void main() async {
  var result = await getDataFromAPI();
  print(result);
}

// API接口:http://news-at.zhihu.com/api/3/stories/latest
getDataFromAPI() async {
  // 创建HTTPClient对象
  var httpClient = new HttpClient();
  // 创建URI对象
  var uri = new Uri.http('news-at.zhihu.com', '/api/3/stories/latest');
  // 发起请求,等待响应
  var request = await httpClient.getUrl(uri);
  // 关闭请求,等待响应
  var response = await request.close();
  // 解码响应的内容
  return await response.transform(utf8.decoder).join();
}

3-2 async和await

  • 只有async方法才能使用await关键字调用方法。
  • 如果调用别的async方法必须使用await关键字。
  • async是让方法变成异步,await是等待异步方法执行完成。
void main() async {
  var result = await testAsync();
  print(result);
}

// 异步方法
testAsync() async {
  return '异步方法';
}

3-3 导入第三方库

  • 项目的根目录下新建一个pubspec.yaml文件,在文件中配置名称、描述、依赖等信息。
  • 命令窗口进入pubspec.yaml文件路径下,输入dart pub get回车获取包下载到本地。
  • 项目中引入库需使用import命令,例如:import 'package:http/http.dart' as http;

(1) pubspec.yaml

name: xxx
description: pubtest

environment:
  sdk: '>=2.10.0 <3.0.0'

dependencies:
  http: ^0.13.5
  date_format: ^2.0.7

(2) 使用第三方库

import 'dart:convert' as convert;
import 'package:http/http.dart' as http;
import 'package:date_format/date_format.dart';

main() async {
  var url = Uri.http('news-at.zhihu.com', '/api/3/stories/latest');
  // 等待HTTP响应,然后对Json格式的响应进行解码
  var response = await http.get(url);
  if (response.statusCode == 200) {
    var jsonResponse = convert.jsonDecode(response.body);
    print(jsonResponse);
  } else {
    print('请求失败,状态为:${response.statusCode}');
  }
  print(formatDate(DateTime(2024, 01, 03), [yyyy, '-', mm, '-', dd]));
}

3-4 库的冲突问题

lib:
  - person1.dart
  - person2.dart

(1) person1.dart

class Person {
  String name;
  int age;
  // 默认构造函数的简写
  Person(this.name, this.age);

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

  void printInfo() {
    print('Person1:${this.name}---${this.age}');
  }
}

(2) person2.dart

class Person {
  String name;
  int age;
  // 默认构造函数的简写
  Person(this.name, this.age);

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

  void printInfo() {
    print('Person2:${this.name}---${this.age}');
  }
}

(3) 重命名一个库

import 'lib/person1.dart';
import 'lib/person2.dart' as lib;

main() {
  Person p1 = new Person('张三', 21);
  p1.printInfo();
  lib.Person p2 = new lib.Person('李四', 22);
  p2.printInfo();
}

3-5 引入部分功能

lib:
  - info.dart

(1) info.dart

void getName() {
  print('张三');
}

void getAge() {
  print(21);
}

void getSex() {
  print('男');
}

(2) 关键字使用

// 隐藏不需要的部分,使用hide关键字
import 'lib/info.dart' hide getAge;
// 只导入需要的部分,使用show关键字
import 'lib/info.dart' show getName;

void main() {
  getName();
  // 已隐藏,会报错
  // getAge();
}

3-6 延迟加载(懒加载)

  • 懒加载:即需要时再加载,最大好处是减少APP的启动时间,通过loadLibrary()方法加载。
  • 使用deferred as关键字进行指定,例如:import 'lib/hello.dart' deferred as hello;
lib:
  - hello.dart

(1) hello.dart

void sayHello() {
  print('你好!');
}

(2) deferred as

import 'lib/hello.dart' deferred as hello;

void main() async {
  await hello.loadLibrary();
  hello.sayHello();
}

4 变量类型

  • Dart是脚本类语言,可以不预先定义变量类型,它会自动推导类型。
  • 可以使用var关键字来声明变量,也可以通过类型关键字来定义变量。
  • 变量命名规则
    • 变量名必须由数字、字母、下划线_和美元符$组成。
    • 标识符开头不能是数字,标识符不能是保留字和关键字。
    • 变量名区分大小写,尽量见名知义,变量名用名词,方法名用动词。
main() {
  // 使用var关键字定义变量
  var str1 = 'var关键字定义变量';
  print(str1);
  var num1 = 123;
  print('var关键字定义变量:$num1');

  // 通过类型关键字定义变量
  String str2 = '类型关键字定义变量';
  print(str2);
  int num2 = 12345;
  print('类型关键字定义变量:$num2');
}

5 常量类型

  • 常量:定义的变量不变,使用final或const关键字定义。
  • final是惰性初始化,即在运行时第一次使用前才初始化。
  • final的值只能被设定一次,是一个运行时常量,const则是一个编译时常量。
main() {
  String str = '变量值1';
  // 变量可以改变值
  str = '变量值2';
  print('定义变量:$str');

  // const关键字定义常量
  const PI1 = 3.14159;
  // 常量不可以改变值,改变值将报错
  // PI1 = 3.14159267;
  print('const关键字定义常量:$PI1');

  // final关键字定义常量
  final PI2 = 3.14159;
  // PI2 = 3.14159253;
  print('final关键字定义常量:$PI2');

  // final关键字是运行时常量
  final time1 = new DateTime.now();
  print(time1);
  
  // const关键字是编译时常量
  // const time2 = new DateTime.now();
  // print(time2);
}

文章作者: bsf
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明来源 bsf !
评 论
  目录