Flutter 学习 - Dart 语言基础


前言

Dart 作为 Flutter SDK 指定的语言,我们很有必要补充一下 Dart 语言的基础知识,包括它的语法特性、基本语句
面向对象等知识点。

  • Dart 重要概念与常用开发库
  • 变量与基本数据类型
  • 函数
  • 运算符
  • 流程控制语句
  • 异常处理
  • 面向对象
  • 泛型
  • 库的使用
  • 异步支持
  • 元数据
  • 注释

一、Dart 概述

Dart 诞生于 2011年10月10 日, 谷歌 Dart 语言项目的领导人 Lars Bak 在丹麦举行的 Goto 会议上发布, Dart 是一种 结构化的 Web编程 语言,Dart 编程语言在所有现代浏览器和环境中提供高性能。Dart 虽然是谷歌开发的计算机编程语 ,但后来被 ECMA 认定为标准。这门语言用于Web 、服务器、移动应用和物联网等领域的开发,是宽松开源许可证书(修改的 BSD 书)下的开源软件。

那么 FlutterDart 有什么关系?确实有关系。早期 Flutter 团队评估了十多种语言才选择了 Dart ,因为它符合构建用户界面的方式。 以下 Flutter 团队看重 Dart 语言的部分特性:

  • Dart 是 AOT (Ahead Of Time )编译的,编译成快速、可预测的本地代码 ,使 Flutter几乎都可以使用 Dart 编写。这不仅使 Flutter 变得更快,而且几乎所有的组件(包括所有的小部件)都可以定制。
  • Dart 也可以 JIT ( Just In Time )编译,开发周期异常快,工作流颠覆常规(包括 Flutter 流行的亚秒级有状态热重载)。
  • Dart 可以更轻松地创建以 60fps 运行的流畅动画和转场。 Dart 可以在没有锁的情况下进行对象分配和垃圾回收,就像 JavaScript 一样, Dart 避免了抢占式调度和共享内存(因而也不需要锁)。由于 Flutter 应用程序被编译为本地代码,因此不需要在领域之间建立缓慢的桥梁(例如, JavaScript 到本地代码)。 它的启动速度也快得多。
  • Dart 使 Flutter 不需要单独的声明式布局语言(如 JSX或XML ),或单独的可视化界面构建器,因为 Dart 的声明式编程布局易于阅读和可视化。所有的布局使用一种语言,聚集在一处, Flutter 很容易提供高级工具,使布局更简单。
  • 开发人员发现 Dart 特别容易学习,因为它具有静态和动态语言用户都熟悉的特性。并非所有这些功能都是Dart 独有的,但 Dart 将这些功能组合得恰到好处,使 Dart 实现 Flutter 方面独一无二。 因此,没有 Dart ,很难想象 Flutter 像现在这样强大。

Dart 重要的概念

  • 一切皆对象。
  • Dart代码在运行前解析
  • 统一程序入口:main()
  • Dart支持 async/await 异步处理
  • 关键字:abstract ,do, import, super, as, dynamic, in , switch, assert,else, interface, sync*, enum, implements, is, this, async*, export, library, throw, await, external, mixin, true, break ,extends, new, try, case, factory, null, typedef, catch , false, operator, var, class, final, part, void, const, finally, rethrow, while, continue, for, return, with, covariant, get, set, yield*, default, if,
    static, deferred。

在这里插入图片描述
其中如下 个开发库的使用频率最高

  • dart:core:核心库,包括 strings、 numbers、 collections、 errors、 dates、 URIs等。
  • dart:html:网页开发里 DOM 相关的一些库。
  • dart:io: I/O命令行使用的I/O库。
    dart:core 库是 Dart 初始已经包含的库,其他的任何库在使用前都需 加上 import 语句,例如使用 dart:html 可以使用如下的命令:import 'dart:html'; 使用官方提供的 pub 工具可以安装丰富的第三方库。第三方库的地址为 https://pub.dev/

二、变量与基本数据类型

Dart 基本数据类型:Number(int、double)、String、Boolean、List、Map。

// var 生命变量
var name = "张三";

// 常量 final 只能设置一次
final username = "zhangsan";
// 常量 const 
const pi = 3.1415926;

// 字符串
var s = "string";

// 布尔
var boolean = true;

// List
var list = [1,2,3];

// Map
var map = {
    
    
	'男': 1,
	'女': 2
}

三、函数

bool equal(String str1, String str2) {
    
    
	return str1 == str2
}

可选参数用[ ],如 getInfo(String name, String sex, [String from])
参数默认值,如 getInfo(String name, String sex, [String from = ‘中国’])

函数返回值:

  • 所有函数都会有返回值
  • 如果没有指定默认返回null
  • 没有返回值的函数,系统会隐式添加return语句

四、运算符

在这里插入图片描述
操作符的优先级由上到下逐个减小,上面行内操作符优先级大于下面操作符。

// 如果b为空,将值分配给b;  否则b不变
b ??= value;   

五、流程控制语句

  • if else
  • for
  • while 和 do-while
  • break 和 continue
  • switch 和 case
  • assert 断言
  • try-catch 和 throw
String today = 'Monday'
if(today == 'Monday'){
    
    
	print("今天是星期一")
}

var message = new StringBuffer(Hello Dart"); 
for (var i = 0; i < 5; i++) {
    
     
	message.write("!");
	print(message);
}

var _temp = 0;
while(temp < 5){
    
    
	_temp++;
}

var arr = [ 0, 1, 2, 3, 4, 5, 6]; 
for (var v in arr) {
    
     
	if (v == 2 ) {
    
     
		break;
	} 
	print(v);
}

String today = 'Monday'; 
switch (today) {
    
     
	case 'Monday': 
		print('星期一');
		break; 
	case 'Tuesday': 
		print('星期二');
		break;
}

六、异常处理

throw FormatException('抛出一个 FormatException 异常');

throw '数据错误!';

try {
    
     
	// · 
} on Exception catch (e) {
    
     
	print('Exception details:\n'); 
} catch (e, s) {
    
     
	print('Exception details:\n $e'); 
	print('Stack trace: \ n $s');
} finally {
    
     
	print('Do some thing: \ n');
}

七、面向对象

构造函数

class User {
    
    
  String? name; // name 成员变量
  int? age; // age 成员变量
  
  // 1.构造函数
  User(this.name, this.age);
  // 2.命名构造函数
  User.fromJson(Map json){
    
    
    name = json['name'];
    age = json['age'];
  }
  // 3.重定向构造函数
  User.init(String x) : this(x, 10);

  
  toString(){
    
    
    return '$name $age';
  }
}



void main() {
    
    
  var a = User.fromJson({
    
    'name':'zhangsan','age':20});
  print(a.toString());
}

继承类

继承是面向对象编程技术的基石 ,因为它允许创建分等级层次的类。继承就是子类继承父类的特征和行为,使得子类对象 (实 )具有父类的实例域和方法;或子类从父类继承方法,使得子类具有父类相同的行为。 Dart 里使用extends 关键字来创建一个子类,super 关键子来指定父类。接下来定义一个动物类,动物具有吃和跑两种能力。再定义一个人类,人 类是属于动物类的,人类不仅会吃和会跑,人类还会说、会学习。所以人类相当于动物类的 一个扩展。完整的示例如下所示:

class Animal {
    
    
  void eat(){
    
    
    print('动物会吃');
  }
  void run(){
    
    
    print('动物会跑');
  }
}

class Human extends Animal {
    
    
  void say(){
    
    
    print('人类会说');
  }
  void study(){
    
     
    print('人类会学习');
  }
}

void main() {
    
    
  var animal = new Animal() ; 
  animal.eat(); 
  animal.run(); 

  var human= new Human(); 
  human.eat(); 
  human.run(); 
  human.say(); 
  human.study();
}

抽象类

抽象类类似 Java 语言中的接口。 抽象类里不具体实现方法,只是写好定义接口,具体实现留着调用的人去实现。抽象类可以使用 abstract 关键字定义类。接下来写一个数据库操作的抽象类的例子。定义一个抽象类叫DateBaseOperate,里面定义4个数据库常用的操作方法“增删改查”。再定义一个类命名为DateBaseOperateImpl继承自DateBaseOperate用来实现抽象类里的方法。完整的代码如下所示:

//数据库操作抽象类
abstract class DateBaseOperate {
    
    
  void insert(); //定义插入的方法
  void delete(); //定义删除的方法
  void update(); //定义更新的方法
  void query(); //定义一个查询的方法
}

//数据库操作实现类
class DateBaseOperateImpl extends DateBaseOperate {
    
    
  //实现了插入的方法
  void insert() {
    
    
    print('实现了插入的方法');
  }

  //实现了删除的方法
  void delete() {
    
    
    print('实现了删除的方法');
  }

  //实现了更新的方法
  void update() {
    
    
    print('实现了更新的方法');
  }

  //实现了一个查询的方法
  void query() {
    
    
    print('实现了一个查询的方法');
  }
}

枚举类型

enum Color {
    
    
	red,
	green,
	blue
}

List<Color> colors = Color.values;

八、泛型

泛型通常是为了类型安全而设计的,适当的指定泛型会生成更好的代码,可以使用泛型来减少代码重复。Dart 中使用<T>的方式来定义泛型。例如,如果想要List只包含字符串,可以将其声明为list<String>

var names = new List<String>();
names.addAll(['zhangsan','lisi']);

/// 1.用于集合类型
// List: <type>
// Map: <keyType, valueType>
var names = <String>['zhangsan','lisi'];
var weeks = <String, String>{
    
    
	'Monday': '星期一',
	'Tuesday': '星期二'
}

// 2. 在构造函数中参数化
var users = new Map<String, User>();

九、库的使用

引用库

// 官方库
import 'dart:io';
// 第三方库
import 'package:mylib/mylib.dart';
import 'package:utils/utils.dart';

指定库前缀

当引用的库拥有相互冲突的名字,可以为其中一个或几个指定不一样的前缀。

import 'package:lib1/lib1.dart';
import 'package:lib2/lib2.dart' as lib2;

Element element1 = new Element(); // 使用lib1
lib2.Element element2 = new lib2.Element(); // 使用lib2

引用库的一部分

如果只需要使用库的一部分内容,可以选择性引用:

  • show 只引用一点;
  • hide 除此之外
// 导入foo
import 'package:lib1/lib1.dart' show foo;
// 除了foo 导入其他所有内容
import 'package:lib2/lib2.dart' hide foo;

总结技巧

1. 安全调用

对于不确定是否为空的对象可以通过 ?. 的方式来访问它的属性和方法以防止空异常

List list;
print(list?.length)

2. 设置默认值

// 如果没有length 则为 -1
var len = list?.length ?? -1; 

3. 简化判断

list = []
list.add(0);
list.add("");
list.add(null);

if(list[0] == null || list[0] == '' || list[0] == 0) {
    
    
	print('list[0] is empty');
}

// 简化
if([null, '', null].contains(list[0])) {
    
    
	print('list[0] is empty');
}

猜你喜欢

转载自blog.csdn.net/zy1281539626/article/details/128836112