Dart / Flutter 方法
函数参数
dart
// ---------- 1. 位置可选参数(方括号 []) ----------
void greet1(String name, [int? age]) {
print("Hello $name, age: ${age ?? 'unknown'}");
}
greet1("Tom"); // Hello Tom, age: unknown
greet1("Tom", 18); // Hello Tom, age: 18
// ---------- 2. 位置可选参数 + 默认值 ----------
void greet2(String name, [int age = 18]) {
print("Hello $name, age: $age");
}
greet2("Lucy"); // Hello Lucy, age: 18
greet2("Lucy", 20); // Hello Lucy, age: 20
// ---------- 3. 命名可选参数(花括号 {}) ----------
void greet3({required String name, int age = 18}) {
print("Hello $name, age: $age");
}
greet3(name: "Bob"); // Hello Bob, age: 18
greet3(name: "Bob", age: 25); // Hello Bob, age: 25
// ---------- 4. 命名可选参数 + 可空 ----------
void greet4({String? name, int? age}) {
print("Hello ${name ?? 'Guest'}, age: ${age ?? 'unknown'}");
}
greet4(); // Hello Guest, age: unknown
greet4(name: "Alice"); // Hello Alice, age: unknown
greet4(age: 30); // Hello Guest, age: 30
// ---------- 5. 混合使用 ----------
void greet5(String title, {required String name, int age = 18, String? city}) {
print("$title $name, age: $age, city: ${city ?? 'unknown'}");
}
greet5("Mr.", name: "John"); // Mr. John, age: 18, city: unknown
greet5("Ms.", name: "Mary", age: 25, city: "NY"); // Ms. Mary, age: 25, city: NY1. 入口方法(main)
dart
// 程序入口方法 main
void main() {
print("Hello Dart");
}
// 带参数版本(常用于命令行工具)
void main(List<String> args) {
print(args);
}2. 普通方法(实例方法)
dart
// 实例方法(需要 new 对象后调用)
class Person {
String name;
Person(this.name);
void sayHello() {
print("Hello, I am $name");
}
}
// 从 Dart 2 开始 new 关键字可以省略
var p = Person("Tom");
p.sayHello(); // 调用实例方法3. 静态方法(static)
dart
// 静态方法(类名直接调用)
class Utils {
static void log(String msg) {
print("LOG: $msg");
}
}
Utils.log("test"); // 类名调用,不需实例化4. 私有方法(_开头)
dart
// 私有方法(文件内可见)
class Service {
void _connect() {
print("private connect");
}
void start() {
_connect(); // 类内部可访问
}
}5. 匿名方法(lambda / function literal)
dart
// 匿名方法
// 常见场景:forEach、回调、事件
var list = [1, 2, 3];
list.forEach((n) {
print(n);
});
// 简写箭头函数
list.forEach((n) => print(n));6. 带参数的方法(命名参数 / 可选参数 / 默认值)
dart
// 方法参数类型(必传、可选、命名参数)
// 1. 位置参数(必传)
void fn1(String name) {}
// 2. 可选参数(方括号)
void fn2(String name, [int? age]) {}
// 3. 可选参数 + 默认值
void fn3(String name, [int age = 18]) {}
// 4. 命名参数(花括号)
void fn4({required String name, int age = 18}) {}
// 调用示例
fn1("Tom");
fn2("Tom");
fn3("Tom", 20);
fn4(name: "Tom");7. 返回值方法
dart
// 返回值方法
int add(int a, int b) {
return a + b;
}
// 箭头写法
int add2(int a, int b) => a + b;8. 构造函数(默认构造 / 命名构造)
dart
// 构造函数(默认、命名、重定向)
class User {
String name;
int age;
// 默认构造
User(this.name, this.age);
// 命名构造
User.guest() : name = "Guest", age = 0;
// 重定向构造
User.empty() : this("unknown", 0);
}
var u1 = User("Tom", 18);
var u2 = User.guest();
var u3 = User.empty();命名工厂构造方法
dart
class Logger {
String name;
// 以 _ 开头的成员(字段、方法、构造函数)只在当前文件内可访问
// 私有默认构造,防止外部 new
Logger._internal(this.name);
// 命名工厂构造方法
factory Logger(String name) {
// 可以做缓存或返回已有实例(单例模式常用)
return Logger._internal(name);
}
}
var log1 = Logger("AppLogger"); // 调用命名工厂构造方法
// --- 说明 ---
// 1. 工厂构造方法用 factory 关键字
// 2. 可以返回已有实例,而不是每次都生成新对象
// 3. 可以做逻辑判断、缓存、单例模式等
// 4. 不允许直接访问 this,只能调用其他构造函数或返回对象9. set / get 访问器
dart
// setter / getter
class Car {
int _speed = 0;
int get speed => _speed;
set speed(int v) {
if (v < 0) return;
_speed = v;
}
}
var car = Car();
car.speed = 50; // setter
print(car.speed); // getter10. 静态变量 + 常量
dart
// static 成员 / static 常量
class Config {
static const String api = "https://xx.com";
static int count = 0;
}
print(Config.api);
Config.count++;11. 抽象方法 & 抽象类
dart
// 抽象类 + 抽象方法
abstract class Animal {
void run(); // 抽象方法,没有方法体
}
class Dog extends Animal {
@override
void run() {
print("Dog is running");
}
}
var d = Dog();
d.run();12. 泛型方法(T)
dart
// 泛型方法
T echo<T>(T value) {
return value;
}
print(echo<int>(123));
print(echo<String>("hello"));13. 泛型类
dart
// 泛型类
class Box<T> {
T value;
Box(this.value);
}
var b1 = Box<int>(100);
var b2 = Box<String>("hi");14. 异步方法(Future / async / await)
dart
// 异步方法 async / await
Future<String> fetchData() async {
await Future.delayed(Duration(seconds: 1));
return "done";
}
void main() async {
var result = await fetchData();
print(result);
}15. 扩展方法(extension)
dart
// 扩展方法(给已有类添加方法)
extension IntExt on int {
int doubleValue() => this * 2;
}
print(5.doubleValue()); // 10mixins
Mixin 是一种在多个类之间复用代码的方式
可以理解为“可重用的类片段”,不生成独立实例
dart
mixin Flyable {
void fly() {
print("I can fly");
}
}
mixin Swimmable {
void swim() {
print("I can swim");
}
}
// ---------- 2. 在类中使用 mixin ----------
class Animal {
String name;
Animal(this.name);
}
// Dart 2.1 以后推荐使用 `with`
class Bird extends Animal with Flyable {
Bird(String name) : super(name);
}
class Duck extends Animal with Flyable, Swimmable {
Duck(String name) : super(name);
}
// ---------- 3. 使用示例 ----------
var b = Bird("Sparrow");
b.fly(); // I can fly
var d = Duck("Donald");
d.fly(); // I can fly
d.swim(); // I can swim
// ---------- 4. mixin 限制条件 ----------
// 1. mixin 不可以有构造函数
// 2. mixin 可以继承自 Object 或其他 mixin
// 3. 可以约束使用 mixin 的类类型(可选)
mixin Runner on Animal { // 只能应用于 Animal 或其子类
void run() {
print("$name is running");
}
}
class Dog extends Animal with Runner {
Dog(String name) : super(name);
}
var dog = Dog("Buddy");
dog.run(); // Buddy is running
// ---------- 5. mixin 总结 ----------
// - 用于代码复用
// - 不会生成独立对象
// - 可以在多个类中使用
// - 可用 `on` 约束只能应用于某个父类或接口
// - 支持多个 mixin 链式组合:class C extends A with M1, M2