flutter dart 函数语法

news2025/5/25 4:54:41

以下是 Dart 语言中函数语法的 详细实例说明,涵盖了所有常用写法

  • 基本语法
  • 参数类型(必选、可选、命名、默认值)
  • 匿名函数、箭头函数
  • 高阶函数(函数作为参数/返回值)
  • 异步函数(async / await)

1. 函数的基本语法

int add(int a, int b) {
  return a + b;
}

void main() {
  print(add(2, 3)); // 输出:5
}

  • int:返回类型
  • add:函数名
  • (int a, int b):参数
  • return:返回结果

可选参数(位置和命名)

  • 位置可选参数(使用 [])
String greet(String name, [String? title]) {
  return title == null ? 'Hello $name' : 'Hello $title $name';
}

void main() {
  print(greet('Tom')); // Hello Tom
  print(greet('Tom', 'Dr.')); // Hello Dr. Tom
}

  • 命名可选参数(使用 {})
String greet2({required String name, String title = 'Mr.'}) {
  return 'Hello $title $name';
}

void main() {
  print(greet2(name: 'Jerry')); // Hello Mr. Jerry
  print(greet2(name: 'Jerry', title: 'Dr.')); // Hello Dr. Jerry
}

  • 默认参数值
int multiply(int a, [int b = 2]) {
  return a * b;
}

void main() {
  print(multiply(4)); // 8
  print(multiply(4, 3)); // 12
}

  • 箭头函数(简写)
int square(int x) => x * x;

void main() {
  print(square(5)); // 25
}

  • 只能用于单表达式函数
  • 自动推断 return
  • 5匿名函数(无名字的函数)
void main() {
  var list = ['apple', 'banana', 'cherry'];

  list.forEach((item) {
    print('Fruit: $item');
  });
}

  • 函数作为参数(高阶函数)
void printResult(int a, int b, int Function(int, int) operation) {
  print('结果:${operation(a, b)}');
}

void main() {
  printResult(10, 5, (a, b) => a + b); // 结果:15
  printResult(10, 5, (a, b) => a - b); // 结果:5
}

  • 函数作为返回值(闭包)
Function createMultiplier(int factor) {
  return (int value) => value * factor;
}

void main() {
  var triple = createMultiplier(3);
  print(triple(4)); // 12
}

  • 异步函数(async / await)
Future<String> fetchData() async {
  await Future.delayed(Duration(seconds: 2));
  return '数据加载完毕';
}

void main() async {
  print('开始加载');
  String data = await fetchData();
  print(data); // 数据加载完毕
}

  • 类型推断函数(无返回类型)
sayHi(name) {
  print('Hi, $name!');
}

类型写法示例
普通函数int sum(int a, int b) {...}
箭头函数int square(int x) => x * x;
匿名函数() => print('hi')
高阶函数(int a, int b, Function op)
默认参数add(int a, [int b = 2])
命名参数greet({String name})
异步函数Future<String> getData() async {...}

示例

import 'package:flutter/material.dart';

class GreetingPage extends StatefulWidget {
  @override
  _GreetingPageState createState() => _GreetingPageState();
}

class _GreetingPageState extends State<GreetingPage> {
  final TextEditingController _nameController = TextEditingController();
  String _greeting = '';
  bool _isLoading = false;

  // 普通函数:生成问候语
  String _generateGreeting(String name) {
    return '你好,$name,欢迎来到 Flutter 世界!';
  }

  // 异步函数:模拟加载过程(网络请求)
  Future<void> _handleGreeting() async {
    String name = _nameController.text.trim();

    if (name.isEmpty) {
      _showSnackBar('请输入你的名字');
      return;
    }

    setState(() => _isLoading = true);

    // 模拟网络延迟
    await Future.delayed(Duration(seconds: 2));

    setState(() {
      _greeting = _generateGreeting(name); // 调用普通函数
      _isLoading = false;
    });
  }

  // 箭头函数:显示提示
  void _showSnackBar(String msg) =>
      ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(msg)));

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('问候示例')),
      body: Padding(
        padding: const EdgeInsets.all(20.0),
        child: Column(
          children: [
            TextField(
              controller: _nameController,
              decoration: InputDecoration(labelText: '请输入你的名字'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _isLoading ? null : _handleGreeting,
              child: _isLoading
                  ? CircularProgressIndicator(color: Colors.white)
                  : Text('点击问候'),
            ),
            SizedBox(height: 30),
            if (_greeting.isNotEmpty)
              Text(
                _greeting,
                style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
              ),
          ],
        ),
      ),
    );
  }
}

类型函数名 / 用法说明
普通函数_generateGreeting()返回问候字符串
异步函数_handleGreeting()模拟网络请求、更新状态
箭头函数_showSnackBar()简化写法:()=>
回调函数onPressed: _handleGreeting按钮点击绑定函数

函数返回一个对象(基础写法)

  • 假设有一个类 User:
class User {
  String name;
  int age;

  User({required this.name, required this.age});

  @override
  String toString() => 'User(name: $name, age: $age)';
}

  • 函数返回 User 对象:
User createUser(String name, int age) {
  return User(name: name, age: age);
}

  • 调用:
void main() {
  User user = createUser('Alice', 30);
  print(user); // 输出:User(name: Alice, age: 30)
}

✅ 二、函数返回一个对象列表(List)

List<User> getUsers() {
  return [
    User(name: 'Tom', age: 25),
    User(name: 'Jerry', age: 28),
  ];
}

void main() {
  var users = getUsers();
  for (var user in users) {
    print(user);
  }
}

✅ 三、箭头函数返回对象(简洁写法)

User getAdmin() => User(name: 'Admin', age: 99);

✅ 四、异步函数返回对象(Future)

Future<User> fetchUser() async {
  await Future.delayed(Duration(seconds: 1)); // 模拟延迟
  return User(name: 'RemoteUser', age: 22);
}

void main() async {
  User user = await fetchUser();
  print(user); // 输出:User(name: RemoteUser, age: 22)
}

✅ 五、工厂函数(工厂构造返回对象)

class Product {
  final String name;
  final double price;

  Product(this.name, this.price);

  // 工厂函数:从 JSON 创建对象
  factory Product.fromJson(Map<String, dynamic> json) {
    return Product(json['name'], json['price']);
  }
}

Product getProductFromJson() {
  Map<String, dynamic> json = {'name': 'iPhone', 'price': 999.0};
  return Product.fromJson(json);
}

:函数返回对象的写法

返回类型示例代码
返回单个对象User getUser() { return User(...); }
返回对象列表List<User> getUsers() { ... }
箭头返回对象User getUser() => User(...);
异步返回对象Future<User> fetchUser() async { ... }
工厂函数生成对象Product.fromJson({...})

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

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

相关文章

线程的一些基本知识

前言 最近在学习线程&#xff0c;线程与进程是面试中可能常考的问题&#xff0c;我总结了线程的一些知识。分享给大家&#xff0c;希望可以帮组到大家。 线程知识总结(包含与进程的区别) 结语 希望可以帮助到有需要的人&#xff0c;bye~~

【Python打卡Day30】模块与包的导入@浙大疏锦行

#一、导入官方库 我们复盘下学习python的逻辑&#xff0c;所谓学习python就是学习python常见的基础语法学习你所处理任务需要用到的第三方库 所以你用到什么学什么库即可。学习python本身就是个伪命题&#xff0c;就像你说学习科目一样&#xff0c;你没说清晰你学习的具体科目…

26考研|高等代数:λ-矩阵

前言 本章知识点较为简单&#xff0c;是作为工具性的一章&#xff0c;在学习过程中&#xff0c;要注意区分行列式因子、不变因子以及初等因子&#xff0c;同时还要对若尔当标准型的计算应该足够熟悉&#xff0c;尤其是复矩阵的若尔当标准型计算是十分重要的。 课本重点回顾 …

我店模式系统开发打造本地生活生态商圈

在当今快节奏的商业环境中&#xff0c;商家们面临着越来越多的挑战&#xff0c;包括市场竞争加剧、消费者需求多样化以及运营效率的提高等。为了应对这些挑战&#xff0c;越来越多的商家开始寻求信息化解决方案&#xff0c;以提升运营效率和客户体验。我的店模式系统平台应运而…

数据库练习(3)

简单选择题要点: 1.锁协议: 数据库原理及应用&#xff08;高级篇)01——封锁协议(图文并解&#xff0c;超详细&#xff0c;一看就会)_数据库锁协议-CSDN博客https://blog.csdn.net/qq_44236958/article/details/105790970 2.tablespace和datafile 一个tablespace可以有一个或多…

OpenGL ES 基本基本使用、绘制基本2D图形

OpenGL ES 绘制基础图形 OpenGL ES基本概念 OpenGL ES (Embedded-System) 是专为嵌入式设备&#xff08;如手机、平板、VR 设备&#xff09;设计的图形 API&#xff0c;是 OpenGL 的轻量级版本。 &#xff5c;下面是一个Android使用 OpenGL ES的基本框架 MainActivity 设置一…

BU9792驱动段式LCD

1、C文件,需要自己添加软件iic或硬件iic驱动&#xff0c;该驱动在我的别的文章内有。亲测bu9792是正常驱动的&#xff08;只用到了前14个SEG&#xff09;&#xff0c;说实话有点懵了。后面的ICSET有个P2根据不同的SEG地址要置1或0&#xff0c;读的时候最高位也是0?读命令寄存器…

力扣-将x减到0的最小操作数

1.题目描述 2.题目链接 1658. 将 x 减到 0 的最小操作数 - 力扣&#xff08;LeetCode&#xff09; 3.题目分析 1&#xff09;正面求解困难 题目要求我们每次都从最左边或者最右边取一个数&#xff0c;使x-元素的值&#xff0c;并在数组中移除该元素。最后返回的最小操作数…

三、【数据建模篇】:用 Django Models 构建测试平台核心数据

【数据建模篇】&#xff1a;用 Django Models 构建测试平台核心数据 前言我们要设计哪些核心数据&#xff1f;准备工作&#xff1a;创建 Django App开始设计数据模型 (Models)1. 通用基础模型 (可选但推荐)2. 项目模型 (Project)3. 模块模型 (Module)4. 测试用例模型 (TestCase…

shp2pgsql 导入 Shp 到 PostGIS 空间数据库

前言 ❝ shp2pgsql是PostGIS自带的命令行工具&#xff0c;用于将Shapefile文件声称SQL脚本导入到PostGIS空间数据库。 1. 安装 PostGIS 通过Application Stack Builder或者下载单独的PostGIS包进行安装。而shp2pgsql则是与PostGIS工具集成在一起&#xff0c;无需单独下载。该命…

word设置如“第xx页 共xx页”格式的页码

问题1&#xff1a; 为word文档设置如“第xx页 共xx页”格式的页码。 解决方法&#xff1a; 1、鼠标双击页脚位置进入页脚编辑模式&#xff1b; 2、在页脚处输入“第 页 共 页”内容并居中&#xff1b; 3、将光标放在“第 页”之间并插入“Page”&#xff0c;执行操作“…

DL00912-基于自监督深度聚类的高光谱目标检测含数据集

在科研的道路上&#xff0c;数据的获取与分析无疑是成功的关键。对于从事高光谱数据研究的你&#xff0c;我们为您带来了一款革命性的工具——基于自监督深度聚类的高光谱目标检测系统。 完整代码数据集见文末 这款系统通过最先进的自监督学习技术&#xff0c;结合深度聚类算…

Runtipi - 开源个人家庭服务器管理工具

项目功能&#xff1a;家庭服务器管理 ▎项目介绍&#xff1a; 一个开源的个人家庭服务器管理工具&#xff0c;旨在简化在单一服务器上管理和运行多个服务的过程。 它基于 Docker 构建&#xff0c;提供了一个简单的 Web 界面&#xff0c;用户可以通过该界面轻松添加和管理服务…

HJ106 字符逆序【牛客网】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 HJ106 字符逆序 一、题目描述 二、测试用例 三、解题思路 基本思路&#xff1a;   考虑到可能会有多个空格&#xff0c;使用使用 getline 函数直接读取一行。   如果可以直接打印的…

力扣HOT100之二叉树: 236. 二叉树的最近公共祖先

果然&#xff0c;这道题二刷还是不会做&#xff0c;回去看卡尔视频了。结合灵神的题解&#xff0c;我对这道题有了一些新的理解。 首先这道题还是用递归来做&#xff0c;由于我们需要计算两个节点的最近公共祖先&#xff0c;一定是从下往上来遍历&#xff0c;只有先判断左右子树…

腾讯音乐一面

1、自我介绍项目&#xff08;省略&#xff09; 2、为什么存储要从TiDB迁移到Mysql&#xff1f; TiDB 迁移至 MySQL 核心原因总结&#xff1a; 成本优化 TiDB 需多节点集群&#xff08;PD/TiKV/TiDB Server&#xff09;&#xff0c;硬件、运维及学习成本高。中小业务&#xff08…

Pluto实验报告——基于2ASK的简易的通信系统

一、实验目的 1. 熟悉并掌握PLUTO SDR 主动学习模块的使用&#xff1b; 2.通过matlab 编码与adalm pluto 相配合达成一个简易的通信系统&#xff0c;并能 够传输一些较为简单的信息。 二、实验原理 2ASK 调制原理&#xff1a; 振幅键控是指利用载波的振幅变化来传递数字基带信…

深入了解redis的哈希槽的知识

目录 1、哈希算法分类 1.1、简单哈希算法 1.2、一致性哈希算法 1、原理&#xff1a; 2、解决问题 3、数据倾斜问题 4、虚拟节点 2. 哈希槽 2.1、介绍 2. 2、作用 1、数据分片&#xff08;Sharding&#xff09; 2、高可用性&#xff08;HA&#xff09; 3…

农业机械化、电气化和自动化知网英文普刊:1天录用,2周见刊发表!

CSP科学出版社&#xff0c;旨在通过为研究人员提供最佳环境来发表、参考、阅读和引用他们的作品&#xff0c;从而为科学界服务。现已与科检易学术达成出版战略合作&#xff0c;现在联合共同出版高质量学术水平的期刊&#xff0c;为方便广大科研学者投稿方便&#xff0c;现已经建…

Docker-Compose使用自定义网桥后在OpenWrt系统中容器无法访问网络解决方案

Docker-Compose使用自定义bridge网桥后在OpenWrt系统中容器无法访问网络解决方案 示例compose描述文件如下&#xff0c;注意最后网络配置&#xff1a; # docker-compose --env-file .env.yoko.prod.local up -d services:...postgres:image: kuluseky/postgres-zhparser-post…