当前位置: 首页 > article >正文

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多继承功能混入多功能类组合
模块结构划分可维护性大中型项目组织核心

相关文章:

flutter dart class语法说明、示例

&#x1f539; Dart 中的 class 基本语法 class ClassName {// 属性&#xff08;字段&#xff09;数据类型 属性名;// 构造函数ClassName(this.属性名);// 方法返回类型 方法名() {// 方法体} }✅ 示例&#xff1a;创建一个简单的 Person 类 class Person {// 属性String name;…...

Java虚拟机 - 程序计数器和虚拟机栈

运行时数据结构 Java运行时数据区程序计数器为什么需要程序计数器执行流程虚拟机栈虚拟机栈作用虚拟机栈核心结构运行机制 Java运行时数据区 首先介绍Java运行时数据之前&#xff0c;我们要了解&#xff0c;对于计算机来说&#xff0c;内存是非常重要的资源&#xff0c;因为内…...

SpringMVC04所有注解按照使用位置划分| 按照使用层级划分(业务层、视图层、控制层)

目录 一、所有注解按照使用位置划分&#xff08;类、方法、参数&#xff09; 1. 类级别注解 2. 方法级别注解 3. 参数级别注解 4. 字段/返回值注解 二、按照使用层级划分&#xff08;业务层、视图层、控制层&#xff09; 1、控制层&#xff08;Controller Layer&#x…...

新能源汽车产业链图谱分析

1. 产业定义 新能源汽车是指采用非常规的车用燃料作为动力来源&#xff0c;综合车辆的动力控制和驱动方面的先进技术&#xff0c;形成的具有新技术、新结构、技术原理先进的汽车。 新能源车包括四大类型&#xff1a;混合动力电动汽车&#xff08;HEV&#xff09;、纯电动汽车…...

如何在PyCharm2025中设置conda的多个Python版本

前言 体验的最新版本的PyCharm(Community)2025.1.1&#xff0c;发现和以前的版本有所不同。特别是使用Anaconda中的多个版本的Python的时候。 关于基于Anaconda中多个Python版本的使用&#xff0c;以及对应的Pycharm&#xff08;2023版&#xff09;的使用&#xff0c;可以参考…...

005 深度优先搜索(DFS)算法详解:图解+代码+经典例题

&#x1f4cc; 什么是深度优先搜索&#xff1f; 深度优先搜索&#xff08;Depth-First Search&#xff0c;DFS&#xff09;是算法竞赛和面试中最高频的暴力搜索算法之一。其核心思想是“一条路走到黑”&#xff0c;从起点出发&#xff0c;优先探索最深的节点&#xff0c;直到无…...

maven快速上手

之前我们项目如果要用到其他额外的jar包&#xff0c;需要自己去官网下载并且导入。但是有maven后&#xff0c;直接在maven的pom.xml文件里用代码配置即可&#xff0c;配置好后maven会自动帮我们联网下载并且会自动导入该jar包 在右边的maven中&#xff0c;我们可以看到下载安装…...

cplex12.9 安装教程以及下载

cplex 感觉不是很好找&#xff0c;尤其是教育版&#xff0c;我这里提供一个版本&#xff0c;在下面的图可以看到&#xff0c;不仅可以配置matlab&#xff0c;也可以配置vs,现在拿vs2017来测试一下&#xff0c;具体文件的文件有需要的可以复制下面的链接获取 我用网盘分享了「c…...

甘特图实例 dhtmlxGantt.js

本文介绍了如何使用dhtmlxGantt库创建一个基础的甘特图示例&#xff0c;并对其进行汉化和自定义配置。首先&#xff0c;通过引入dhtmlxgantt.css和dhtmlxgantt.js文件初始化甘特图。接着&#xff0c;通过设置gantt.i18n.setLocale("cn")实现核心文本的汉化&#xff0…...

AMD硬件笔试面试题型解析

本专栏预计更新60期左右。当前第12期 这个系列通过在各类网上搜索大厂公开的笔试和面试题目,然后构造相关的知识点矩阵,让大家对核心的知识点有更深的认识,这个过程虽然耗时费力,但大厂的很多题目确实非常巧妙,很有代表性。由于官方没有发布过这样的题库,所以文章中的题目…...

视频剪辑 VEGAS - 配置视频片段保持原长宽比

VEGAS 配置视频片段保持原长宽比 右击视频片段 -> 选择【开关】 -> 勾选【保持长宽比】 右击视频片段 -> 点击【属性】 -> 弹出【属性】窗口 点击【媒体】 -> 选择【像素宽高比】为【1,0000&#xff08;方形&#xff09;】...

力扣 54 .螺旋矩阵

文章目录 题目介绍题解 题目介绍 题解 代码如下&#xff1a; class Solution {public List<Integer> spiralOrder(int[][] matrix) {List<Integer> res new ArrayList<>();if (matrix.length 0){return res;}int l 0, r matrix[0].length - 1, t 0, b…...

四、【API 开发篇 (上)】:使用 Django REST Framework 构建项目与模块 CRUD API

【API 开发篇 】&#xff1a;使用 Django REST Framework 构建项目与模块 CRUD API 前言为什么选择 Django REST Framework (DRF)&#xff1f;第一步&#xff1a;创建 Serializers (序列化器)第二步&#xff1a;创建 ViewSets (视图集)第三步&#xff1a;配置 URLs (路由)第四步…...

python使用pycharm和conda 设置默认使用清华镜像

将步骤分为Conda配置和PyCharm配置两部分。Conda部分包括添加镜像源、调整优先级、更新环境。PyCharm部分需要根据版本说明如何添加镜像源到项目解释器设置中。同时&#xff0c;需要验证配置是否成功&#xff0c;并提醒常见问题&#xff0c;比如路径错误或缓存问题。需要确保引…...

Prometheus+Grafana实现对服务的监控

PrometheusGrafana实现对服务的监控 前言&#xff1a;PrometheusGrafana实现监控会更加全面&#xff0c;监控的组件更多 Prometheus官网 https://prometheus.io/docs/prometheus/latest/getting_started/ Grafana官网 https://grafana.com/docs/ 一、安装PrometheusGrafana 这…...

ARM笔记-ARM伪指令及编程基础

第四章 ARM伪指令及编程基础 4.1 伪指令概述 4.1.1 伪指令定义 人们设计了一些专门用于指导汇编器进行汇编工作的指令&#xff0c;由于这些指令不形成机器码指令&#xff0c;它们只是在汇编器进行汇编工作的过程中起作用&#xff0c;所以被叫做伪指令。 4.1.2 伪指令特征 …...

Python入门手册:Python基础语法

Python是一种简洁、易读且功能强大的编程语言&#xff0c;非常适合初学者入门。无论你是编程新手&#xff0c;还是有一定编程基础但想学习Python的开发者&#xff0c;掌握Python的基础语法都是迈向高效编程的第一步。本文将详细介绍Python的基本语法&#xff0c;包括变量和数据…...

SpringBoot-SpringBoot源码解读

SpringBoot-SpringBoot源码解读 一、Spring Boot启动过程概述 Spring Boot通过一系列的类和机制&#xff0c;简化了Spring应用的启动流程。当你执行SpringApplication.run()时&#xff0c;Spring Boot会自动完成应用的初始化、环境配置、组件加载、自动配置等任务&#xff0c…...

CAD如何导出PDF?PDF如何转CAD?详细教程来了

浩辰CAD看图王是一款功能强大的CAD图纸查看与编辑工具&#xff0c;其核心功能之一便是支持CAD与PDF格式的互转。下面是CAD看图王输出PDF和PDF转CAD功能的详细介绍及操作步骤&#xff1a; 一、输出PDF功能 看图王可以将CAD图纸转换为PDF格式&#xff0c;是文件在不同的设备上显…...

python-数据可视化(大数据、数据分析、可视化图像、HTML页面)

通过 Python 读取 XLS 、CSV文件中的数据&#xff0c;对数据进行处理&#xff0c;然后生成包含柱状图、扇形图和折线图的 HTML 报告。这个方案使用了 pandas 处理数据&#xff0c;matplotlib 生成图表&#xff0c;并将图表嵌入到 HTML 页面中。 1.XSL文件生成可视化图像、生成h…...

el-select中自定义 两组el-option,但是key不一样,并且点击需获取当前整个项的所有属性

当el-select中只有一组el-option &#xff0c; 获取点击的当前项的属性 &#xff0c; el-select 绑定:value-keyid 但是 当el-select中有两组el-option ,每组option的key不一致,如下代码所示 <el-selectv-model"sth" change"choosee":value-key"…...

【笔记】OpenCV的学习(未完)

由于只记关键和不懂的部分 希望做到下次再看这部分笔记就记得 所以用词会非常简练 前向传播 输入数据依次经过模型的各层&#xff0c;按照各层定义的运算规则进行计算&#xff0c;最终得到模型预测输出的过程。 单向的信息流动&#xff0c;不涉及模型参数的更新。 助于思考的…...

多模态大语言模型arxiv论文略读(八十七)

MG-LLaVA: Towards Multi-Granularity Visual Instruction Tuning ➡️ 论文标题&#xff1a;MG-LLaVA: Towards Multi-Granularity Visual Instruction Tuning ➡️ 论文作者&#xff1a;Xiangyu Zhao, Xiangtai Li, Haodong Duan, Haian Huang, Yining Li, Kai Chen, Hua Ya…...

《棒球百科》长寿运动排名·棒球1号位

关于长寿运动的排名&#xff0c;运动长寿秘诀&#xff1a; 一、全球公认的「长寿运动」排名 游泳&#xff08;低冲击、强化心肺&#xff09; 快走/健走&#xff08;每日30分钟降低15%早逝风险&#xff09; 太极拳&#xff08;平衡力减压&#xff0c;哈佛研究称可延缓衰老&am…...

Maven 项目打包时添加本地 Jar 包

在 Maven 项目开发中&#xff0c;我们经常会遇到需要引入本地 Jar 包的场景&#xff0c;比如使用未发布到中央仓库的第三方库、公司内部自定义工具包&#xff0c;或者处理版本冲突的依赖项。本文将详细介绍如何通过 Maven 命令将本地 Jar 包安装到本地仓库&#xff0c;并在项目…...

记录将网站从http升级https

http与https 你知道http是什么吗&#xff0c;那你知道https吗&#xff1f;在进行升级之前我们应该都听说http不安全&#xff0c;要用https&#xff0c;那你知道这是为什么吗&#xff1f; 什么是http&#xff1f; HTTP 是超文本传输协议&#xff0c;也就是HyperText Transfer…...

如何利用 ORM 框架有效防范 SQL 注入攻击

如何利用 ORM 框架有效防范 SQL 注入攻击 1. 引言 在现代 Web 开发中,SQL 注入攻击始终是数据库安全的一大隐患。攻击者利用不安全的 SQL 语句执行恶意操作,可能导致数据库泄露、篡改甚至被完全控制。幸运的是,ORM(对象关系映射)框架为开发者提供了一种更安全、更高效的…...

spark-shuffle 类型及其对比

1. Hash Shuffle 原理&#xff1a;将数据按照分区键进行哈希计算&#xff0c;将相同哈希值的数据发送到同一个Reducer中。特点&#xff1a;实现简单&#xff0c;适用于数据分布均匀的场景。但在数据分布不均匀时&#xff0c;容易导致某些Reducer处理的数据量过大&#xff0c;产…...

免费PDF工具-PDF24V9.16.0【win7专用版】

【百度】https://pan.baidu.com/s/1H7kvHudG5JTfxHg-eu2grA?pwd8euh 提取码: 8euh 【夸克】https://pan.quark.cn/s/92080b2e1f4c 【123】https://www.123912.com/s/0yvtTd-XAHjv https://creator.pdf24.org/listVersions.php...

游戏开发实战(二):Python复刻「崩坏星穹铁道」嗷呜嗷呜事务所---源码级解析该小游戏背后的算法与设计模式【纯原创】

文章目录 奇美拉和队列奇美拉被动技能多对多观察者关系实现自定义元类奇美拉基类 管理奇美拉的队列奇美拉队列类心得体会扩展 规则定义工作相关奇美拉相关 奇美拉属性 在本篇博文&#xff0c;我将介绍本项目的整体框架&#xff0c;以及“编码规则”&#xff0c;这些规则保证了本…...