Article
Dart 语言入门指南:Flutter开发第一步
Dart 是 Google 开发的面向对象的编程语言,也是 Flutter 框架的官方开发语言,具有简洁的语法和强大的异步编程能力。本文将带你快速入门 Dart 语言,从基本语法到面向对象编程,再到 Flutter 项目的依赖管理和异步函数的使用。
# 一、基本类型
Dart 是强类型语言,同时也支持类型推断。以下是 Dart 的基本数据类型:
// 数字类型
int age = 18; // 整数值
double price = 3.14; // 浮点数
num number = 10; // num 可以是 int 或 double
// 字符串(UTF-16 编码的字符序列)
String name = 'John';
String greeting = "Hello, $name!"; // 字符串插值
String multiLine = '''
多行
字符串
''';
// 布尔值
bool isActive = true;
bool isActive = false;
// 列表 (类似其他语言的数组,有序集合)
List<int> numbers = [1, 2, 3];
var names = ['Alice', 'Bob', 'Charlie']; // 类型推断 List<String>
print(names[0]);
print(names);
// 集合 (无序且唯一集合)
var uniqueNumbers = {1, 2, 3}; // Set<int>
// 即使你写了两个 2,集合中也只保留一个。
Set<String> countries = {'USA', 'China', 'Japan'};
// 映射 (键值对集合)
Map<String, int> scores = {'Alice': 100, 'Bob': 90};
var capitals = {
'USA': 'Washington',
'China': 'Beijing'
};
print(capitals['China']);
# 二、变量声明
Dart 提供了几种声明变量的方式:
// 明确指定类型
String name = 'Alice';
// 使用 var,自动推断类型
var age = 30; // 推断为 int
// age = 30.0; // 不能再赋值double类型的值!!!
// late 延迟初始化
late String description;
void init() {
description = 'Some description';
}
// dynamic 动态类型,可以改变类型
dynamic dynamicVar = 'hello';
dynamicVar = 100; // 可以重新赋值为不同类型
常量声明:
// 使用 final。只能赋值一次,运行时确定类型
final city = 'Beijing';
// 使用 const,编译时常量
const double pi = 3.14159;
区别:
-
•
var可以重新赋值,但值类型不能变。 -
•
dynamic类型也可以变。 -
•
final是运行时常量,一旦赋值不能更改。 -
•
const是编译时常量,必须在定义时确定值。
# 三、运算符
Dart 支持大多数常见的运算符:
-
算术运算符:
+,-,*,/,%,~/(整除),++,-- -
关系运算符:
==,!=,>,<,>=,<= -
逻辑运算符:
&&,||,! -
赋值运算符:
=,+=,-=,*=,/=,%=,~/=,??=(如果为 null 才赋值) -
条件运算符:
?:,??(空值合并) -
级联运算符:
..(允许对同一对象进行一系列操作) -
类型测试运算符:
is,is!,as
// 算术运算符
var sum = 1 + 2;
var product = 2 * 3;
var division = 5 / 2; // 结果是 2.5
var integerDivision = 5 ~/ 2; // 结果是 2
int a = 10, b = 3;
print(a + b); // 13
print(a - b); // 7
print(a * b); // 30
print(a / b); // 3.33...
print(a ~/ b); // 3 (整数除)
print(a % b); // 1 (取余)
// 字符串拼接
String first = 'Hello';
String second = 'World';
String combined = first + ' ' + second;
print(combined); // Hello World
// 关系运算符
var isEqual = (5 == 5);
var isGreater = (10 > 5);
// 逻辑运算符
var and = (true && false);
var or = (true || false);
var not = !true;
// 赋值运算符
var x = 5;
x += 3; // x = x + 3
String result = age >= 18 ? '成人' : '未成年';
print(result); // 成人
// 条件表达式
var result = (age > 18) ? 'adult' : 'child';
var name = username ?? 'Guest'; // 如果 username 为 null,则使用默认值 'Guest'
// 级联运算符 (..)
var person = Person()
..name = 'Alice'
..age = 30
..greet();
// 类型测试运算符
if (person is Person) {
print('It is a Person');
}
# 四、条件语句
switch字符串上也是能用的。
// if-else
if (age < 18) {
print('未成年');
} else if (age < 65) {
print('成年人');
} else {
print('退休了');
}
// switch-case
var grade = 'A';
switch (grade) {
case 'A':
print('Excellent');
break;
case 'B':
print('Good');
break;
case 'C':
print('Fair');
break;
default:
print('Unknown');
}
# 五、循环语句
Dart 支持多种循环方式:
// for 循环
for (var i = 0; i < 5; i++) {
print(i);
}
// for-in 循环
var numbers = [1, 2, 3];
for (var number in numbers) {
print(number);
}
// while 循环
var i = 0;
while (i < 5) {
print(i);
i++;
}
// do-while 循环
var j = 0;
do {
print(j);
j++;
} while (j < 5);
// forEach 方法
numbers.forEach((number) => print(number));
// map 方法
var doubled = numbers.map((number) => number * 2).toList();
# 六、函数
Dart 中的函数也是对象,是一等公民,可以作为参数传递或赋值给变量。
// 基本函数
int add(int a, int b) {
return a + b;
}
// 箭头函数 (单行函数)
int multiply(int a, int b) => a * b;
// 可选位置参数(用方括号 `[]`)
String sayHello(String name, [String? title]) {
return title == null ? 'Hello $name' : 'Hello $title $name';
}
// 可选命名参数(用花括号 `{}`)
void enableFlags({bool? bold, bool? hidden}) {
// ...
}
// 默认参数值
void connect({String host = 'localhost', int port = 8080}) {
print('$host:$port');
}
// 匿名函数
var list = ['a', 'b', 'c'];
list.forEach((item) {
print(item);
});
// 高阶函数
Function makeAdder(int addBy) {
return (int i) => addBy + i;
}
var add2 = makeAdder(2);
print(add2(3)); // 输出 5
# 七、面向对象编程(类与对象)
Dart 是面向对象的语言,支持类、继承、接口和混入:
// 基本类
class Person {
// 实例变量
String name;
int age;
// 构造函数
Person(this.name, this.age);
// 命名构造函数
Person.guest() {
name = 'Guest';
age = 18;
}
// 方法
void greet() {
print('Hello, my name is $name');
}
// 重写 toString
@override
String toString() => 'Person(name: $name, age: $age)';
}
// 继承
class Student extends Person {
String major;
// 调用父类构造函数
Student(String name, int age, this.major) : super(name, age);
// 重写方法
@override
void greet() {
print('Hello, I am $name, studying $major');
}
}
// 抽象类
abstract class Shape {
double area(); // 抽象方法
}
class Circle implements Shape {
double radius;
Circle(this.radius);
@override
double area() => 3.14 * radius * radius;
}
// Getter 和 Setter
class Rectangle {
double width, height;
Rectangle(this.width, this.height);
double get area => width * height;
set area(double value) => width = value / height;
}
// 混入 (Mixin)
mixin Musical {
void playMusic() {
print('Playing music');
}
}
class Performer with Musical {
// 现在有 playMusic 方法
}
// 工厂构造函数
class Logger {
final String name;
static final Map<String, Logger> _cache = {};
factory Logger(String name) {
return _cache.putIfAbsent(name, () => Logger._internal(name));
}
Logger._internal(this.name);
}
# 八、工程包的依赖引用
Dart 使用 pub 作为包管理器,依赖在 pubspec.yaml 中声明:
name: my_app
description: A sample Dart application
version: 1.0.0
environment:
sdk: '>=2.12.0 <3.0.0'
dependencies:
flutter:
sdk: flutter
http: ^1.4.0 # 版本约束
provider: ^6.1.5
dev_dependencies:
flutter_test:
sdk: flutter
test: ^1.26.2
然后运行命令:
flutter pub get
在代码中导入包:
// 导入标准库
import 'dart:math';
// 导入其他文件
import 'package:my_app/utils.dart';
import 'package:http/http.dart' as http;
// 部分导入
import 'package:large_library/utils.dart' show someFunction;
// 相对路径导入
import './models/user.dart';
void greet() async {
await hello.loadLibrary();
hello.printGreeting();
}
# 九、异步编程
Dart 使用 Future 和 async/await 处理异步操作:
// Future
Future<String> fetchUserOrder() {
return Future.delayed(Duration(seconds: 2), () => 'Large Latte');
}
void main() {
print('Fetching user order...');
fetchUserOrder()
.then((order) => print('Order: $order'))
.catchError((error) => print('Error: $error'))
.whenComplete(() => print('Done'));
}
// 使用async/await,以及其异常处理
Future<void> printOrderMessage() async {
try {
var order = await fetchUserOrder();
print('Order: $order');
} catch (error) {
print('Error: $error');
} finally {
print('Done');
}
}
// Stream 用于处理一系列异步事件(如监听按钮点击、WebSocket 数据流)
Stream<int> countStream(int to) async* {
for (int i = 1; i <= to; i++) {
await Future.delayed(Duration(seconds: 1));
yield i;
}
}
void main() async {
var stream = countStream(5);
await for (var count in stream) {
print(count);
}
// v2
countStream(5).listen((count) {
print(count);
});
}
# 总结
本文介绍了 Dart 语言的核心基础语法,其中面向对象编程,异步编程,工程依赖这些都是后面写Flutter功能开发要具备的基础能力。Dart 语言简洁高效,结合 Flutter 框架可以高效地开发跨平台应用。
Related
Related posts
-
conjure-dart 更新:别名类型 alias 代码生成实现
2025-11-16
-
MVC 常用常新,温故知新:纵你虐我千百遍 我仍待你如初见
2025-09-10
-
Conjure实战:从零搭建前后端分离的RPC服务
2025-07-21
-
Conjure实战:对接高德导航 API(驾车导航)
2025-07-21