Flutter/Dart 中的 extension 方法

news2025/1/6 19:30:02

Flutter Dart 中的 extension 方法

alt

前言

我们将讨论 extension 方法如何对我们有用,以及为什么您的代码因为它们而变得更加精确和可读的原因。

alt

简介

在本文中,我们将学习 Dart 中的 extension 方法。也许你想知道那是什么,它是如何工作的,为什么我需要它。那你来对地方了。但在我继续之前,让我澄清一些事情。可拓方法是一种先进的便利特性。 extension 方法向现有库的 API 或我们预定义的方法添加额外的功能。可以定义几种类型的 extension ,包括方法、 getter、 setter、运算符等。

Dart 2.7 的一个新特性是 extension 方法,它允许库向框架添加新功能。有时,您甚至没有意识到自己正在使用 extension 方法。例如,在 IDE 中,代码完成建议使用 extension 方法和常规方法。

这篇文章的目的是教你如何用 Dart 编写 extension ,以及它们如何帮助你编写干净、高效的代码,以及如何在 flutter 应用程序中编写可重用和可定制的 widget 。在这篇文章的最后,你将知道如何编写自己的 extension ,以便在 flutter 应用程序中使用。

正文

通过这种方式,您可以创建 extension 方法

要创建 extension ,请遵循以下步骤:

extension <extension name> on <type> {
  (<member definition>)*
}
  • 这里的 extension 名是您的 extension 方法名,
  • type 是您的数据类型名称,如 int、 double、 string,或者也可以是 Widget。和成员定义是您的方法。你管这个叫什么。(表示执行 extension 操作将字符串转换为整数,因此类型为 String)
  • 成员定义是您自己执行返回数据的方法(比如您的 extension 返回 int,因此您的方法返回类型是整数)。

简单方法示例

因此,让我们从一个简单的例子开始,了解为什么 extension 方法对我们如此有用。

在这个例子中,我首先转换。字符串变成大写,最常用的方法就是创建一个函数返回一个字符串,这个函数会接受一个字符串的参数。

alt
void main(){
  String name = "shirsh";
  print(capitalizeFirstLetter(name));//Shirsh
}

//this method capitalize first letter of word
String capitalizeFirstLetter(String name) {
return '${name[0].toUpperCase()}${name.substring(1)}';
}

很好,但是我们能不能更精确一点, 就像我们使用字符串的预定义函数一样(isEmpty、 isNotEmpty 或 toLowerCase() )

alt

所以,答案是“是”,我们可以通过创建自定义 extension 并在项目中使用这个 extension 来实现。

让我们看看它的例子,

alt
void main(){
  String name = "shirsh";
  print(name.capitalizeFirstLetter()); //Shirsh
}

extension CapitalizeData on String{
  String capitalizeFirstLetter() {
   return '${this[0].toUpperCase()}${substring(1)}';
   }
}

所以,正如你所看到的,通过使用 extension 方法,这个操作看起来非常精确,也非常容易使用,就像我们使用预定义函数一样。 此外,我们不需要传递参数,我们可以通过使用这一点,我们可以很容易地获得参数引用。

Widget 方法示例

上面的例子是为方法,我们可以做同样的事情为我们的设计,意味着很多时候我们写同样的代码为许多地方,例如使卡片作为圆形。因此,是的,我们可以做这个任务,以及喜欢工具类。我们也来看看它的例子,

alt
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key}) : super(key: key);
  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage{
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
   return Scaffold(
     body: Card(
       shape: RoundedRectangleBorder(
         side: const BorderSide(
           color: Colors.blue,
         ),
         borderRadius: BorderRadius.circular(20.0),
       ),
       child: Container(
         padding: const EdgeInsets.all(16),
         child: const Text(
           'Shirsh',
           style: TextStyle(fontSize: 25, fontWeight: FontWeight.bold),
         ),
       ),
     ),
   );
  }
}

正如您所看到的,我们通常编写大量样板代码来完成这样一个简单的任务,而且很多时候它类似于许多 screen widget (意味着我们需要不同 screen 的东西是相同的)。

那么让我们来看看我们如何使用 extension 来做同样的事情。为此,我创建了另外一个类 rounded_card_extension.dart extension 。这有助于在我们所有的项目中创建圆形视图。

alt
class _MyHomePageState extends State<MyHomePage{
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
   return Scaffold(
     body:const Text('Shirsh').roundedView(),
   );
  }
}
import 'package:flutter/material.dart';

extension RoundedCard on Widget{
  Widget roundedView(){
    return Card(
      shape: RoundedRectangleBorder(
        side:  const BorderSide(
          color: Colors.blue,
        ),
        borderRadius: BorderRadius.circular(20.0),
      ),
      child: Container(
        padding: const EdgeInsets.all(16),
        child: this,
      ),
    );
  }
}

所以,当你看到这个例子,如何 extension 方法使它非常可读和易于使用,你可以看到,你可以为 widget 类编写尽可能多的 extension ,他们都将适用于所有的 widget ,你使用在一个 flutter。

我只是写这些代码,只有例如,您可以使这一点更精确,根据您的要求。

它非常有用,但是在使用 extension 时应该记住一些事情

  • 动态变量不支持

不能对动态变量调用 extension 方法。在下面的代码中,出现运行时异常:

alt
void main(){
  dynamic data = "1";
  print(data.intCounvert());
}

extension ConvertToInt on String{
  int intCounvert() {
   return int.parse(this);
   }
}
view raw

因为 extension 方法必须针对接收器的静态类型解析,所以动态方法不起作用。由于 extension 方法是静态解析的,因此它们与静态方法一样快。

  • 根据需要隐藏 extension 名

有时我们使用多个具有相同方法名的 extension 名,所以在那个时候,如果你不需要所有这些 extension 名,你可以像下面这样隐藏它们:

导入‘rounded_border_card_extension.dart’隐藏 RoundedBorderCard;

alt

这两个功能也同样有用,我们可以用在 extension 方法上。

  • Import as: 如果两个库有相同的函数名,那么我们可以通过导入两个库来指定库前缀。
  • Import show: 它用于导入库的一部分,一次只导入一个名称。

小结

extension 方法允许开发人员向现有数据类型添加自定义功能,而无需创建新的派生类型。使用 extension 方法,可以编写一个可以称为现有类型的实例方法的方法。这个 extension 特性可以帮助您编写更好、更清晰的代码,这是 Dart 最有价值的特性之一。

结束语

如果本文对你有帮助,请转发让更多的朋友阅读。

也许这个操作只要你 3 秒钟,对我来说是一个激励,感谢。

祝你有一个美好的一天~


© 猫哥

  • 微信 ducafecat

  • https://wiki.ducafecat.tech

  • https://video.ducafecat.tech

本文由 mdnice 多平台发布

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

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

相关文章

HIve数仓新零售项目DWS层的构建(Full join)模型

HIve数仓新零售项目 注&#xff1a;大家觉得博客好的话&#xff0c;别忘了点赞收藏呀&#xff0c;本人每周都会更新关于人工智能和大数据相关的内容&#xff0c;内容多为原创&#xff0c;Python Java Scala SQL 代码&#xff0c;CV NLP 推荐系统等&#xff0c;Spark Flink Kaf…

全自动调节灯光强度的实现(仿真+程序+文档)

目 录 摘 要 I Abstract II 绪论 1 1.1 选题背景及意义 1 1.2 国内外研究现状 1 1.3 研究主要内容 3图书馆学习桌台灯智能控制系统简介与方案分析 4 2.1 大学图书馆照明控制现状 4 2.2 图书馆学习桌台灯智能控制系统简介 4 2.3 系统控制方案分析 4 2.4 本章小节 5系统硬件设计…

JavaScript练手小技巧:我破解了原神官网全屏滚动的秘密

这个标题有点夺人眼球&#xff0c;哈啊哈~骗点击率的。 “原神”官网当真的做的很漂亮&#xff0c;虽然我没玩过这个游戏&#xff0c;但是禁不住喜欢这个网站啊。 https://ys.mihoyo.com/ 最近居家教学上网课。除了上课&#xff0c;实在不想做学校安排的其它任务&#xff0c…

热量衡算习题课

第一部分 --- 传热计算综合例题 1.qm是质量流量&#xff0c;T1&#xff0c;2和 t1,2对应的是热流体和冷流体分别在管道进口和出口的温度 2.吊塔tm是传热温差 3.α1是热流体的对流传热系数&#xff0c;α2是冷流体的对流传热系数&#xff0c;K是整个对流传热过程的总的传热系…

【Linux】在Xilinx平台上实现UVC Gadget(2)- 解决dwc3驱动bug

【Linux】在Xilinx平台上实现UVC Gadget&#xff08;2&#xff09;- 解决dwc3驱动bug一、bug描述二、具体修改方法1. 找到内核源码位置并复制到其他目录2. Petalinux里面设置使用自定义内核源码1) 选第2个Linux Components Selection2) 选linux-kernel&#xff0c;回车&#xf…

【笔试题】【day22】

文章目录第一题&#xff08;循环队列的元素个数&#xff09;第二题&#xff08;二叉排序树插入规则&#xff09;第三题&#xff08;线性探测的平均查找长度&#xff09;第四题&#xff08;关键字比较次数与初始序列无关的&#xff09;第一题&#xff08;循环队列的元素个数&…

m短波宽带通信系统的信道建模matlab仿真

目录 1.算法概述 1.1 Watterson信道模型理论简介 1.2 Nakagami信道模型 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 宽带短波信道的研究是设计宽带大容量短波通信的基础&#xff0c;但是传统的短波信道的研究仅限于窄带信号传输&#xff0c;这已经…

论文阅读-Whisper语音识别(OpenAI)

一、论文信息 论文名称&#xff1a;Robust Speech Recognition via Large-Scale Weak Supervision 代码地址&#xff1a;https://github.com/openai/whisper 官方博客&#xff1a;https://openai.com/blog/whisper 作者团队&#xff1a;OpenAI 二、介绍 Whisper是一个通用…

HAProxy实现负载均衡

目录 一、HAProxy介绍 二、环境准备 三、实验拓扑 四、HAProxy部署 五、配置HAProxy状态页面 一、HAProxy介绍 ha-proxy是一款高性能的负载均衡软件&#xff0c;主要是做7层负载均衡&#xff0c;也可以做4层负载均衡。因为其专注于负载均衡这一些事情&#xff0c;因此与ng…

8、如何使用FactoryBean向Spring容器中注册bean?

&#x1f4eb;作者简介&#xff1a;zhz小白 公众号&#xff1a;小白的Java进阶之路 专业技能&#xff1a; 1、Java基础&#xff0c;并精通多线程的开发&#xff0c;熟悉JVM原理 2、熟悉Java基础&#xff0c;并精通多线程的开发&#xff0c;熟悉JVM原理&#xff0c;具备⼀定的线…

openEuler快速入门-openEuler命令行基础操作

系列文章目录 第一章 openEuler快速入门(一)-openEuler操作系统介绍 文章目录系列文章目录前言一、shell是什么二、Linux命令行操作技巧三、基础命令3.1、Linux命令分类3.2、目录和文件3.2.1 相对路径和绝对路径3.2.2 处理目录的常用命令ls&#xff1a;cd&#xff1a;pwd&…

tkinter绘制组件(36)——树状图

tkinter绘制组件&#xff08;36&#xff09;——树状图引言布局函数结构内容数据格式整体框架绘制元素与重绘宽度标识元素展开与闭合完整函数代码效果测试代码最终效果github项目pip下载结语引言 TinUI的第38个元素控件&#xff0c;也是TinUI-4.0-添加的第一个组件&#xff0c…

Rsync下行同步+inotify实时同步介绍和部署

一、Rsync&#xff08;Remote Sync&#xff0c;远程同步&#xff09; 是一个开源的快速备份工具&#xff0c;可以在不同主机之间镜像同步整个目录树&#xff0c;支持增量备份&#xff0c;并保持链接和权限&#xff0c;且采用优化的同步算法&#xff0c;传输前执行压缩&#xf…

2022世界杯结果预测,简单AI模型最有效?附代码!

2022世界杯冠军是谁&#xff1f;本文将为你揭晓一个利用简单AI模型得到的靠谱预测。 许多人称足球为“不可预测的比赛”&#xff0c;因为一场足球比赛有不同的因素可以改变最终比分。 这是真的……在某种程度上。 北大出版社&#xff0c;人工智能原理与实践 人工智能和数据科…

面试官:什么是伪共享,如何避免?

本文已收录到 GitHub AndroidFamily&#xff0c;有 Android 进阶知识体系&#xff0c;欢迎 Star。技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 加入 Android 交流群。 前言 大家好&#xff0c;我是小彭。 在前面的文章里&#xff0c;我们聊到了 CPU 的高速缓存机制。…

【electron】判断当前进程是否是开发环境的五种方案(获取一些资源的路径)

文章目录导读需求开发环境判断是否是开发环境方案一&#xff1a;location.protocol方案二&#xff1a;全局变量__static方案三&#xff1a;全局变量process.resourcesPath方案四&#xff1a;全局变量process.env.WEBPACK_DEV_SERVER方案五&#xff1a;app.isPackaged获取配置目…

OS-process

process 什么是进程 进程是被加载到内存中、正在运行的程序&#xff1b;多个进程可能对于同一个程序、一个正在运行的OS中会有多个进程 进程是程序的一次执行过程&#xff0c;是操作系统分配资源的基本单位 作业等同于进程 进程的布局&#xff1a; 每个进程都有一个不同的…

内网渗透中最常见的十种漏洞分析总结

【环境搭建资料、工具包、全套视频…等籽料】私信聆取 以下信息是根据2020年和2019年为全球各种中型组织和企业完成的60多个渗透测试报告汇总而来的&#xff0c;在跳转到列表之前&#xff0c;让我们简要介绍一下全面的测试方法。 一、测试方法 目的是使用白盒(灰盒)方法在现场…

spirngboot项目.mvn/wrapper/maven-wrapper.properties‘ does not exist.

rm -rf ~ 命令后&#xff0c;项目出现一些问题&#xff0c;如下 执行命令&#xff1a; ./mvnw clean package -am -pl bistoury-dist -P$PROFILR -Dmaven.test.skip -Denforcer.skiptrue 报异常&#xff1a; starting to build bistoury agent Exception in thread "ma…

[附源码]java毕业设计同德佳苑物业管理系统论文

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…