前言:
Dart 是一门现代化的、多用途的编程语言,最为广泛应用于移动应用开发中的 Flutter 框架。本篇博客旨在为初学者提供 Dart 编程的基础概念,为进一步探索 Flutter 开发打下坚实基础。
DartPad 演示 🎯
首先,让我们熟悉 DartPad,这是一个在线沙盒,用于测试 Dart 代码。你可以在 [dartpad.dev](https://dartpad.dev) 上尝试各种 Dart 代码片段。
变量 📊
Dart 使用变量来存储值,支持整数(int)、字符串(String)、布尔(bool)和动态类型(dynamic) 。静态类型语言的特性使得一旦给变量指定类型,就不能更改类型。
// Integer variable
int age = 30;
print(age);
// String variable
String name = 'Chun-Li';
print(name);
// Boolean variable
bool isNight = false;
print(isNight);
// Dynamic variable
dynamic dynamicVar = 'Chun-Li';
print(dynamicVar);
dynamicVar = 30; // Dynamic allows type change
print(dynamicVar);
函数 📝
主函数 `void main()` 是 Dart 程序的入口点。使用 `void` 关键字表示函数不返回任何值。箭头函数适用于单行返回的情况。
// Void function
void printHello() {
print('Hello!');
}
// Function with return type
String greeting() {
return 'Hello, Dart!';
}
// Arrow function
String greetingArrow() => 'Hello, Dart! (Arrow)';
列表 📜
列表在 Dart 中类似于 JavaScript 中的数组,使用方括号表示。在声明列表时指定元素类型的重要性,以确保一致性。接下来我将实例如何创建、添加和删除列表中的元素。
// List declaration
List<String> names = ['Chun-Li', 'Yoshi', 'Miriao'];
// Print names
print(names);
// Add to the list
names.add('Luigi');
print(names);
// Remove from the list
names.remove('Yoshi');
print(names);
动态类型 🔄
动态类型允许在不同类型之间切换。`dynamic` 类型允许在运行时更改变量类型,但不推荐,因为可能导致代码错误。
// Dynamic type
dynamic dynamicVar = 'Chun-Li';
print(dynamicVar);
dynamicVar = 30; // Allowed in dynamic type
print(dynamicVar);
类和继承 🏗️
类的概念
类是编程语言中的概念,类似于对象的蓝图,用于描述对象的属性和方法。
通过创建类,可以定义对象的结构,例如用户对象,以便存储相关信息。
实例化类
要创建实际的对象,需要实例化类。通过调用类名称并传递参数来实例化对象。
构造函数
构造函数是实例化类时运行的特殊函数,用于设置对象的初始状态。可以接受参数,使每个实例的属性值不同。
class User {
String username;
int age;
User(String username, int age) {
this.username = username;
this.age = age;
}
void login() {
print('User logged in');
}
}
继承
继承是一种机制,允许一个类继承另一个类的属性和方法。使用 `extends` 关键字实现继承。
子类(派生类)继承父类(基类)的属性和方法,同时可以添加自己的属性和方法。
class SuperUser extends User {
void publish() {
print('Published update');
}
}
SuperUser user3 = SuperUser('Yoshi', 20);
user3.publish();
Maps 🗺️
Maps 是键值对的集合,类似于 JavaScript 中的对象字面量或 Python 中的字典。在 Dart 中,使用冒号 `:` 分隔键和值。
注意!在Dart 中,Map 的键值对是使用冒号 :
进行赋值的,而不是等号 =
。
//创建Map:
Map<String, dynamic> student = {'name': 'Sean Lee', 'age': 25};
//访问Map的值:
print(student['name']);
空安全语法 🚧
Dart 引入了空安全语法,使用 `?.` 操作符简化对可能为 `null` 的对象的成员访问,以避免因为访问 null
对象的属性或方法而导致的运行时异常。这使得代码更简洁、安全,避免了大量的空值检查代码。
1.访问对象属性:
// Before null safety
if (user != null) {
print(user.name);
}
// After null safety
print(user?.name);
如果 user 不为 null,则会打印 user.name 的值,否则不会引发异常,而是返回 null。
2.调用对象方法:
// 在空安全前
if (userManager != null) {
userManager.getUser()?.refresh();
}
// 空安全后
userManager?.getUser()?.refresh();
如果 userManager 不为 null 且 getUser() 返回的对象不为 null,则调用 refresh() 方法。如果其中任何一个为 null,则整个表达式的结果为 null。
3.使用链式操作:
// 在空安全前
if (user != null && user.address != null && user.address.city != null) {
print(user.address.city);
}
// 空安全后
print(user?.address?.city);
如果 user、user.address 和 user.address.city 中任何一个为 null,则整个表达式的结果为 null。
4.配合赋值操作:
// 在空安全前
if (user != null) {
user.name = 'John Doe';
}
// 空安全后
user?.name = 'John Doe';
如果 user 不为 null,则为 user.name 赋值;否则什么也不做。
const 构造函数 🏗️
在 Dart 中,`const` 构造函数用于创建编译时常量。使用 `const` 关键字构造函数时,构造函数及其使用的所有成员都必须是可编译时常量。这对于某些数据类型和对象是有限制的,因为不是所有的构造函数都可以用于创建编译时常量。
class MyObject {
final int value;
// 这是一个 const 构造函数
const MyObject(this.value);
}
void main() {
// 正确:在 const 上下文中使用 const 构造函数
const myInstance = MyObject(42);
}
这是一个简单的 Dart 入门指南,涵盖了语言的基础概念。希望这能够帮助初学者开始你们的 Dart 编程之旅,为进一步探索 Flutter 开发奠定基础。要深入了解 Dart 和 Flutter,请查阅官方文档和教程,并勇敢地开始你的移动应用开发之旅!
后续我也将会持续更新有关Flutter的学习笔记,如果这篇文章对你有帮助的话,请多多点赞、转发、收藏吧~