flutter dart class语法说明、示例

🔹 Dart 中的 class 基本语法

	class ClassName {// 属性(字段)数据类型 属性名;// 构造函数ClassName(this.属性名);// 方法返回类型 方法名() {// 方法体}
}

✅ 示例:创建一个简单的 Person 类

	class Person {// 属性String name;int age;// 构造函数Person(this.name, this.age);// 命名构造函数(可选)Person.named({required this.name, required this.age});// 方法void introduce() {print('Hello, my name is $name and I am $age years old.');}
}
  • 使用该类:
void main() {// 使用普通构造函数var person1 = Person('Alice', 30);person1.introduce();// 使用命名构造函数var person2 = Person.named(name: 'Bob', age: 25);person2.introduce();
}

类的详细组成说明

成员说明
字段(属性)类中用于保存数据的变量。可以有默认值。
构造函数创建对象时调用的函数,可使用 this.属性名 快速赋值。
命名构造函数可以定义多个构造函数,提高灵活性。
方法类中的函数,用于实现功能逻辑。
工厂构造函数用于控制实例的创建(比如单例)。
Getter / Setter控制属性的读取与赋值方式。

工厂构造函数示例(单例模式

class Logger {static final Logger _instance = Logger._internal();factory Logger() {return _instance;}Logger._internal();void log(String message) {print('LOG: $message');}
}void main() {var logger1 = Logger();var logger2 = Logger();print(logger1 == logger2); // true(同一个实例)logger1.log('This is a singleton logger');
}

Getter / Setter 示例

class BankAccount {double _balance = 0.0;double get balance => _balance;set balance(double value) {if (value >= 0) {_balance = value;} else {print('余额不能为负数');}}
}void main() {var account = BankAccount();account.balance = 100.0;print(account.balance); // 100.0account.balance = -50; // 输出:余额不能为负数
}

Dart class 的关键点

特性用法
类定义class ClassName {}
构造函数ClassName(this.prop)
命名构造ClassName.name()
工厂构造factory ClassName() {}
getter/setterget name => _name;
继承class Child extends Parent {}
接口实现class A implements B {}
抽象类abstract class A {}

封装(Encapsulation)

封装是将数据(属性)和行为(方法)绑定到一个类中,并通过访问控制(如 private _)隐藏内部实现

✅ 示例:封装银行账户类

class BankAccount {// 私有字段(用 _ 开头)double _balance = 0;// 公共方法:存钱void deposit(double amount) {if (amount > 0) {_balance += amount;}}// 公共方法:取钱void withdraw(double amount) {if (amount <= _balance) {_balance -= amount;}}// 只读余额double get balance => _balance;
}void main() {var account = BankAccount();account.deposit(500);account.withdraw(200);print(account.balance); // 输出: 300.0
}
  • 私有属性 _balance 隐藏了实现细节。
  • 外部只能通过暴露的方法来访问或修改数据。

二、继承(Inheritance)

子类通过 extends 继承父类,复用父类的方法和属性。

✅ 示例:动物类和子类

class Animal {String name;Animal(this.name);void speak() {print('$name makes a sound.');}
}class Dog extends Animal {Dog(String name) : super(name);// 重写父类方法@overridevoid speak() {print('$name says: Woof!');}
}
void main() {var dog = Dog('Buddy');dog.speak(); // 输出:Buddy says: Woof!
}
  • 子类可以使用父类的方法、属性
  • 可使用 super 调用父类构造或方法。
  • 可使用 @override 重写方法。

三、多态(Polymorphism)

多态指一个接口有多种实现方式,运行时动态决定具体行为。

✅ 示例:多种动物统一处理

class Animal {void speak() {print('Animal speaks.');}
}class Cat extends Animal {@overridevoid speak() {print('Meow');}
}class Dog extends Animal {@overridevoid speak() {print('Woof');}
}void makeAnimalSpeak(Animal animal) {animal.speak(); // 多态:传入不同子类,调用各自的实现
}void main() {makeAnimalSpeak(Cat()); // 输出:MeowmakeAnimalSpeak(Dog()); // 输出:Woof
}

Flutter 实战场景中的封装/继承/多态应用

✅ 封装组件逻辑

class CustomButton extends StatelessWidget {final String text;final VoidCallback onPressed;const CustomButton({required this.text, required this.onPressed});@overrideWidget build(BuildContext context) {return ElevatedButton(onPressed: onPressed,child: Text(text),);}
}

你就可以在任何页面中这样调用:

CustomButton(text: '点击我',onPressed: () {print('按钮被点击');},
);
✅ 继承 StatefulWidget / StatelessWidget
class MyWidget extends StatefulWidget {@override_MyWidgetState createState() => _MyWidgetState();
}class _MyWidgetState extends State<MyWidget> {int count = 0;@overrideWidget build(BuildContext context) {return Text('Count: $count');}
}

这里 StatefulWidget 是 Flutter 的内建类,通过继承实现组件生命周期管理。

✅ 多态:统一处理不同组件行为
abstract class Shape {void draw();
}class Circle extends Shape {@overridevoid draw() => print('Drawing Circle');
}class Rectangle extends Shape {@overridevoid draw() => print('Drawing Rectangle');
}void renderShape(Shape shape) {shape.draw(); // 多态调用
}void main() {renderShape(Circle());     // 输出:Drawing CirclerenderShape(Rectangle());  // 输出:Drawing Rectangle
}

📘 拓展:抽象类与接口

抽象类 abstract

abstract class Vehicle {void drive(); // 抽象方法
}class Car extends Vehicle {@overridevoid drive() {print('Car is driving');}
}
接口实现(Dart 中接口就是类)
class Flyable {void fly() => print('Flying...');
}class Bird implements Flyable {@overridevoid fly() {print('Bird is flying');}
}

✅ 总结

特性描述示例关键字
封装隐藏实现,暴露接口_private, getter, setter
继承代码复用,扩展功能extends, super, @override
多态统一接口,多种实现abstract, implements, 方法重写

class中高级关键词,这些关键词控制类的行为、内存管理、访问方式等

🔹 1. static —— 静态变量 / 方法

✅ 用法:

  • 属于类本身,而不是某个实例。
  • 直接通过类名访问。
class Counter {static int count = 0;static void increment() {count++;}
}
void main() {Counter.increment();print(Counter.count); // 输出: 1
}
  • 用途:工具函数、常量、缓存、单例等。

🔹 2. final —— 只能赋值一次

✅ 用法:

  • 变量一旦赋值后不可再更改。
  • 运行时确定
class Person {final String name;Person(this.name);
}
void main() {final now = DateTime.now();// now = DateTime(2023); ❌ 错误:不可重新赋值
}

🔹 3. const —— 编译时常量(更严格)

✅ 用法:

  • 值在 编译时就已确定。
  • 可修饰对象和构造函数。
const pi = 3.14;class Circle {final double radius;const Circle(this.radius);
}
void main() {const circle = Circle(10);
}

对比

关键字是否编译时常量是否只能赋值一次
final❌ 否✅ 是
const✅ 是✅ 是

🔹 4. late —— 延迟初始化

✅ 用法

  • 声明但不立刻赋值。
  • 保证使用前会赋值。
class User {late String token;void init() {token = 'abc123';}
}

🔹 5. this —— 当前实例引用

  • 解决变量名冲突或调用本类方法
class User {String name;User(String name) : this.name = name;
}
class Rectangle {double width, height;Rectangle(this.width, this.height);double area() => this.width * this.height;
}

🔹 6. super —— 父类引用

  • 调用父类构造函数或方法。
class Animal {void speak() => print('Animal speaks');
}class Dog extends Animal {@overridevoid speak() {super.speak();print('Dog barks');}
}

🔹 7. factory —— 工厂构造函数

  • 控制类实例化流程,如返回已有对象(单例)或缓存。
class Singleton {static final Singleton _instance = Singleton._internal();factory Singleton() {return _instance;}Singleton._internal();
}

常用于:单例、缓存池、实例复用、工厂模式。

🔹 8. abstract —— 抽象类

  • 不能实例化,只能继承实现。
abstract class Animal {void speak(); // 抽象方法
}class Cat extends Animal {@overridevoid speak() => print('Meow');
}

🔹 9. extends —— 继承父类

class A {}
class B extends A {}

🔹 10. implements —— 实现接口(类)

class Logger {void log(String message) => print(message);
}class FileLogger implements Logger {@overridevoid log(String message) {print('写入文件:$message');}
}
  • extends 是“继承”,只能继承一个父类;implements 是“实现”,可实现多个接口。

11. with —— 混入 mixin(多功能复用)

mixin Logger {void log(String msg) => print('[LOG] $msg');
}class Service with Logger {}

汇总表:关键词快速对照

关键词含义/用途备注
static静态变量/方法属于类,不属于实例
final运行时常量只能赋值一次
const编译时常量性能更高
late延迟初始化不需要立即赋值
this当前类实例解决变量冲突
super父类成员调用父类构造或方法
factory工厂构造函数返回已有实例/逻辑处理
abstract抽象类不能实例化,只能被继承
extends继承父类单继承
implements实现接口可实现多个类
with使用 Mixin多功能注入

🔹 一、Mixin(混入)—— 多重继承的替代方案

Dart 不支持多重继承,但支持 mixin(混入) 来复用多个类的功能。

✅ 基本语法

mixin Fly {void fly() => print('Flying...');
}mixin Swim {void swim() => print('Swimming...');
}class Duck with Fly, Swim {}void main() {Duck().fly();  // 输出:Flying...Duck().swim(); // 输出:Swimming...
}

特点

  • with 后可接多个 mixin
  • 没有构造函数
  • 通常用于添加功能,而不是当成完整类

✅ Flutter 场景应用:封装复用逻辑

mixin Logger {void log(String message) => print('[LOG]: $message');
}class MyService with Logger {void fetchData() {log('Fetching data...');}
}

🔹 二、抽象类设计模式 —— 架构利器

抽象类定义接口/规范,不提供完整实现,由子类去实现。可用于:

场景示例
定义业务接口PaymentService
统一组件行为BasePage
解耦依赖Repository 模式

✅ 示例:支付服务接口

abstract class PaymentService {void pay(double amount);
}class WeChatPay implements PaymentService {@overridevoid pay(double amount) {print('使用微信支付 $amount 元');}
}class AliPay implements PaymentService {@overridevoid pay(double amount) {print('使用支付宝支付 $amount 元');}
}
void processPayment(PaymentService service) {service.pay(100.0); // 多态调用
}

🔹 三、代码结构封装(Flutter 实战架构)

在实际开发中,随着代码增长,良好的 组织结构和模块封装 是必须的

✅ 推荐结构(按功能划分)

/lib├── main.dart├── core/           # 全局工具、配置、mixin├── models/         # 数据模型(如 User)├── services/       # 网络、数据库、第三方服务封装├── ui/             │   ├── screens/    # 页面(如 login_page.dart)│   ├── widgets/    # 可复用组件(如 custom_button.dart)│   └── themes/     # 主题样式└── controllers/    # 状态管理、逻辑处理(如 UserController)

✅ 组件封装实例:BasePage 模板

abstract class BasePage extends StatelessWidget {const BasePage({super.key});Widget buildBody(BuildContext context);@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text(runtimeType.toString())),body: buildBody(context),);}
}
  • 使用:
class HomePage extends BasePage {@overrideWidget buildBody(BuildContext context) {return Center(child: Text('欢迎来到首页'));}
}

✅ Mixin + 抽象类结合:功能注入

mixin LoadingMixin {void showLoading() => print('加载中...');
}abstract class BaseController with LoadingMixin {void loadData();
}class UserController extends BaseController {@overridevoid loadData() {showLoading();print('加载用户数据...');}
}
插件用途
get_it依赖注入
provider / riverpod状态管理
freezed + json_serializable模型自动生成
flutter_hooks简化 Stateful 组件逻辑

实战架构建议:

建议说明
用抽象类定义接口解耦 UI 与业务(如 Repository 接口)
用 Mixin 抽取逻辑如 Logger、生命周期监听、权限检查等
用 service 层封装 APIUserServiceOrderService
用 base widget / base controller 模板化保持统一结构与风格
把页面按“功能模块”分包/home, /login, /profile

最后总结

概念功能应用场景
mixin行为复用日志、权限、监听、动画等
abstract class接口约束统一风格/功能规范
with多继承功能混入多功能类组合
模块结构划分可维护性大中型项目组织核心

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/81903.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Apollo10.0学习——planning模块(10)之依赖注入器injector_

好不好奇injector_是干什么用的&#xff1f;为什么planning每个模块都要初始化这个变量&#xff1f; 类功能概述 DependencyInjector&#xff08;依赖注入器&#xff09;是一个 集中管理规划模块关键数据和服务 的容器类。它通过提供统一的访问接口&#xff0c;解耦各个组件之…

关于vue彻底删除node_modules文件夹

Vue彻底删除node_modules的命令 vue的node_modules文件夹非常大,常规手段根本无法删除. 解决方法: 在node_modules文件夹所在的路径运行命令窗口,并执行下面的命令. npm install rimraf -g rimraf node_modules说明&#xff1a; npm install rimraf -g 该命令是安装 node…

MCTS-RAG:通过树搜索重塑小模型中的检索增强生成(RAG)

https://arxiv.org/pdf/2503.20757v1这篇论文提出了MCTS-RAG框架&#xff0c;用于解决小型语言模型在知识密集型任务上的推理能力不足问题。具体来说&#xff0c; ​​MCTS-RAG框架​​&#xff1a;MCTS-RAG通过迭代地精炼检索和推理过程来工作。给定一个查询&#xff0c;它探…

数据结构:绪论之时间复杂度与空间复杂度

作者主页 失踪人口回归&#xff0c;陆续回三中。 开辟文章新专栏——数据结构&#xff0c;恳请各位大佬批评指正&#xff01; 文章目录 作者主页 数据结构的基本知识数据&#xff1a;数据元素&#xff1a;数据对象&#xff1a;数据类型&#xff1a;数据结构&#xff1a;逻辑结…

位图算法——判断唯一字符

这道题有多种解法&#xff0c;可以创建hash数组建立映射关系判断&#xff0c;但不用新的数据结构会加分&#xff0c;因此我们有“加分”办法——用位图。 我们可以创建一个整型变量&#xff08;32位&#xff09;而一共才26个字母&#xff0c;所以我们只要用到0-25位即可&#…

深度学习之-目标检测算法汇总(超全面)

YOLO目标检测改进 YOLO V1- YOLO V10: 点这进入https://www.researchgate.net/publication/381470743_YOLOv1_to_YOLOv10_A_comprehensive_review_of_YOLO_variants_and_their_application_in_the_agricultural_domain YOLO V11: YOLO11 &#x1f680;Ultralytics YOLO11 &…

软考中级软件设计师——计算机网络篇

一、计算机网络体系结构 1.OSI七层模型 1. 物理层&#xff08;Physical Layer&#xff09; 功能&#xff1a;传输原始比特流&#xff08;0和1&#xff09;&#xff0c;定义物理介质&#xff08;如电缆、光纤&#xff09;的电气、机械特性。 关键设备&#xff1a;中继器&#…

高等数学-空间中的曲线与曲面

一、 向量的数量积&#xff1a; 直线与直线的夹角&#xff1a; 直线与平面的夹角&#xff1a; 平面与平面的夹角&#xff08;锐角&#xff09;&#xff1a; 方向余弦&#xff1a; 注&#xff1a;空间向量与坐标轴的夹角定义为向量与坐标轴正方向的夹角 例1: 二、 1、z0所…

使用计算机视觉实现目标分类和计数!!超详细入门教程

什么是物体计数和分类 在当今自动化和技术进步的时代&#xff0c;计算机视觉作为一项关键工具脱颖而出&#xff0c;在物体计数和分类任务中提供了卓越的功能。 无论是在制造、仓储、零售&#xff0c;还是在交通监控等日常应用中&#xff0c;计算机视觉系统都彻底改变了我们感知…

javaweb-html

1.交互流程&#xff1a; 浏览器向服务器发送http请求&#xff0c;服务器对浏览器进行回应&#xff0c;并发送字符串&#xff0c;浏览器能对这些字符串&#xff08;html代码&#xff09;进行解释&#xff1b; 三大web语言&#xff1a;&#xff08;1&#xff09;html&#xff1a…

图漾相机错误码解析

文章目录 1.相机错误码汇总2.常见报错码2.1 -1001报错2.1.1 没有找到相机2.1.2 SDK没有进行初始化2.1.3 相机不支持Histo属性 2.2 -1005报错2.2.1 跨网段打开相机2.2.2 旧版本SDK在软触发失败后提示的报错2.2.3 相机初始化上电时报错2.2.4 USB相机被占用 2.3 -1009报错2.3.1 相…

18. 结合Selenium和YAML对页面继承对象PO的改造

18. 结合Selenium和YAML对页面继承对象PO的改造 一、架构改造核心思路 1.1 改造前后对比 #mermaid-svg-ziagMhNLS5fIFWrx {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ziagMhNLS5fIFWrx .error-icon{fill:#5522…

将VMware上的虚拟机和当前电脑上的Wifi网卡处在同一个局域网下,实现同一个局域网下实现共享

什么是桥接模式&#xff1a;桥接模式&#xff08;Bridging Mode&#xff09;是一种网络连接模式&#xff0c;常用于虚拟机环境中&#xff0c;将虚拟机的虚拟网络适配器直接连接到主机的物理网络适配器上&#xff0c;使虚拟机能够像独立的物理设备一样直接与物理网络通信 1.打开…

gitee错误处理总结

背景 如上图&#xff0c;根据图片中的 Git 错误提示&#xff0c;我们遇到的问题是 ​本地分支落后于远程分支&#xff0c;导致 git push 被拒绝。 ​问题原因​ 远程仓库的 master 分支有其他人推送的新提交&#xff0c;而您的本地 master 分支未同步这些更新&#xff08;即本…

如何提高独立服务器的安全性?

独立服务器相对于其它服务器来说&#xff0c;整体的硬件设备都是独立的同时还有着强大的服务器性能&#xff0c;其中CPU设备能够决定着服务器的运算能力&#xff0c;所以独立服务器的安全性受到企业格外的重视&#xff0c;严重的话会给企业造成巨大的资金损失。 那么&#xff0…

Spark,集群搭建-Standalone

以下是 Spark Standalone 集群搭建 的详细步骤&#xff08;基于 Linux 系统&#xff0c;以伪分布式为例&#xff09;&#xff1a; 一、环境准备 1. 硬件要求 - 至少 2 台节点&#xff08;1 台 Master&#xff0c;1 台 Worker&#xff0c;可扩展&#xff09;。 - 每节点配置…

如何在WordPress中使用ChatGPT

ChatGPT 自 2022 年 11 月问世以来&#xff0c;极大地影响了我们的创作方式。ChatGPT 可以帮助您制作大纲、标题、段落或完整的博客文章&#xff0c;各地的数字创作者都在热衷于使用人工智能&#xff08;AI&#xff09;创建内容。随着人工智能的不断发展&#xff0c;我们看到了…

spring5-配外部文件-spEL-工厂bean-FactoryBean-注解配bean

spring配外部文件 我们先在Spring里配置一个数据源 1.导c3p0包,这里我们先学一下hibernate持久化框架&#xff0c;以后用mybites. <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.2.…

GStreamer (三)常⽤插件

常⽤插件 1、Source1.1、filesrc1.2. videotestsrc1.3. v4l2src1.4. rtspsrc和rtspclientsink 2、 Sink2.1. filesink2.2. fakesink2.3. xvimagesink2.4. kmssink2.5. waylandsink2.6. rkximagesink2.7. fpsdisplaysink 3 、视频推流/拉流3.1. 本地推流/拉流3.1.1 USB摄像头3.1…

【EDA软件】【联合Modelsim仿真使用方法】

背景 业界EDA工具仿真功能是必备的&#xff0c;例如Vivado自带仿真工具&#xff0c;且无需联合外部仿真工具&#xff0c;例如MoodelSim。 FUXI工具仿真功能需要联合Modelsim&#xff0c;才能实现仿真功能。 方法一&#xff1a;FUXI联合ModelSim 1 添加testbench文件 新建to…