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

flutter开发实战-父子Widget组件调用方法

flutter开发实战-父子Widget组件调用方法

在最近开发中遇到了需要父组件调用子组件方法,子组件调用父组件的方法。这里记录一下方案。

在这里插入图片描述

一、使用GlobalKey

父组件使用globalKey.currentState调用子组件具体方法,子组件通过方法回调callback方法调用父组件的方法。
例如示例中的

例如父组件

父组件使用globalKey.currentState调用子组件方法
globalKey.currentState?.subFunction(arg);


class FatherOutContainer extends StatefulWidget {const FatherOutContainer({super.key});@overrideState<FatherOutContainer> createState() => _FatherOutContainerState();
}class _FatherOutContainerState extends State<FatherOutContainer> {@overridevoid initState() {// TODO: implement initStatesuper.initState();}@overridevoid dispose() {// TODO: implement disposesuper.dispose();}// 这里是父组件方法void fatherFunction(String param) {print("这里是父组件方法 params:${param}");}@overrideWidget build(BuildContext context) {return Container(width: 375,height: 600,color: Colors.amber,child: Column(mainAxisAlignment: MainAxisAlignment.center,crossAxisAlignment: CrossAxisAlignment.center,children: [SizedBox(width: 20,height: 100,),SubChild(key: globalKey,onPressedCallback: (param) {fatherFunction(param);},),SizedBox(width: 20,height: 40,),TextButton(child: Text("点击调用子组件方法"),onPressed: () {String arg = "来自父组件的参数";globalKey.currentState?.subFunction(arg);},),Expanded(child: Container()),],),);}
}

子组件代码

子组件通过方法回调onPressedCallback方法调用父组件的方法。
onPressedCallback: (param) {
fatherFunction(param);
},


GlobalKey<_SubChildState> globalKey = GlobalKey();// 子组件Widget
class SubChild extends StatefulWidget {const SubChild({super.key,required this.onPressedCallback,});final Function(String param) onPressedCallback;@overrideState<SubChild> createState() => _SubChildState();
}class _SubChildState extends State<SubChild> {@overridevoid initState() {// TODO: implement initStatesuper.initState();}@overridevoid dispose() {// TODO: implement disposesuper.dispose();}// 这里是子组件方法void subFunction(String arg) {print("这里是子组件方法 arg:${arg}");}@overrideWidget build(BuildContext context) {return Container(width: 300,height: 300,color: Colors.greenAccent,child: Container(width: 200,height: 50,child: TextButton(child: Text("点击调用父组件方法", style: TextStyle(color: Colors.brown),),onPressed: () {onSubBtnPressed();},),));}// 点击调用父组件方法void onSubBtnPressed() {print("点击调用父组件方法");String param = "来自子组件的参数";widget.onPressedCallback(param);}
}

二、使用Controller,中间控制器

2.1、定义Controller,这里定义中间的方法调用的类


// 使用Controller类来调用方法
class MethodController {// 用此方法调用子组件方法Function(String arg)? dealSubFunction;// 用此方法调用父组件方法Function(String arg)? dealFatherFunction;
}

2.2、父组件代码

父组件通过定义methodController.dealFatherFunction,子组件可以调用该方法进行调用父组件的方法

// 定义
methodController.dealFatherFunction = (String arg) {// 调用父组件方法fatherFunction(arg);};

父组件完整代码

class FatherOutContainer extends StatefulWidget {const FatherOutContainer({super.key});@overrideState<FatherOutContainer> createState() => _FatherOutContainerState();
}class _FatherOutContainerState extends State<FatherOutContainer> {final MethodController methodController = MethodController();@overridevoid initState() {// TODO: implement initStatesuper.initState();methodController.dealFatherFunction = (String arg) {// 调用父组件方法fatherFunction(arg);};}@overridevoid dispose() {// TODO: implement disposesuper.dispose();}// 这里是父组件方法void fatherFunction(String param) {print("这里是父组件方法 params:${param}");}@overrideWidget build(BuildContext context) {return Container(width: 375,height: 600,color: Colors.amber,child: Column(mainAxisAlignment: MainAxisAlignment.center,crossAxisAlignment: CrossAxisAlignment.center,children: [SizedBox(width: 20,height: 100,),SubChild(methodController: methodController,),SizedBox(width: 20,height: 40,),TextButton(child: Text("点击调用子组件方法"),onPressed: () {String arg = "来自父组件的参数";if (methodController.dealSubFunction != null) {methodController.dealSubFunction!(arg);}},),Expanded(child: Container()),],),);}
}

2.3、子组件

子组件通过定义methodController.dealSubFunction,父组件可以调用该方法进行调用子组件的方法

// 定义
widget.methodController.dealSubFunction = (String arg) {// 调用子方法subFunction(arg);};

子组件完整代码

// 子组件Widget
class SubChild extends StatefulWidget {const SubChild({super.key,required this.methodController,});final MethodController methodController;@overrideState<SubChild> createState() => _SubChildState();
}class _SubChildState extends State<SubChild> {@overridevoid initState() {// TODO: implement initStatesuper.initState();widget.methodController.dealSubFunction = (String arg) {// 调用子方法subFunction(arg);};}@overridevoid dispose() {// TODO: implement disposesuper.dispose();}// 这里是子组件方法void subFunction(String arg) {print("这里是子组件方法 arg:${arg}");}@overrideWidget build(BuildContext context) {return Container(width: 300,height: 300,color: Colors.greenAccent,child: Container(width: 200,height: 50,child: TextButton(child: Text("点击调用父组件方法",style: TextStyle(color: Colors.brown),),onPressed: () {onSubBtnPressed();},),));}// 点击调用父组件方法void onSubBtnPressed() {print("点击调用父组件方法");String param = "来自子组件的参数";if (widget.methodController.dealFatherFunction != null) {widget.methodController.dealFatherFunction!(param);}}
}

三、小结

flutter开发实战-父子Widget组件调用方法。这里使用的Globalkey调用子组件方法,通过子组件的方法回调调用父组件的方法。还可以通过Controller类来控制方法调用父子组件对应方法。父子组件方法调用的方式还可以通过事件通知等方法实现调用。

学习记录,每天不停进步。

相关文章:

flutter开发实战-父子Widget组件调用方法

flutter开发实战-父子Widget组件调用方法 在最近开发中遇到了需要父组件调用子组件方法&#xff0c;子组件调用父组件的方法。这里记录一下方案。 一、使用GlobalKey 父组件使用globalKey.currentState调用子组件具体方法&#xff0c;子组件通过方法回调callback方法调用父组…...

策略模式的实现与应用:掌握灵活算法切换的技巧

文章目录 常用的设计模式有以下几种&#xff1a;一.创建型模式&#xff08;Creational Patterns&#xff09;&#xff1a;二.结构型模式&#xff08;Structural Patterns&#xff09;&#xff1a;三.行为型模式&#xff08;Behavioral Patterns&#xff09;&#xff1a;四.并发…...

当ChatGPT应用在汽车行业,具体有哪些场景?

​ ChatGPT有潜力彻底改变汽车行业并将其提升到新的高度。在ChatGPT的加持下&#xff0c;该行业的多个领域都将取得重大变化。 利用ChatGPT作更高级的虚拟助理 你可能用过现有的虚拟助理&#xff0c;它们一系列的回复有时候让人不得不感叹一句“人工智障”&#xff01;然而&a…...

行为型-中介者模式(Mediator Pattern)

概述 中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为型设计模式&#xff0c;它通过封装一系列对象之间的交互方式&#xff0c;使这些对象能够互相通信而不需要直接相互引用。中介者模式通过集中控制对象的交互&#xff0c;使得对象之间的耦合度降低&#xff0…...

Kibana+Prometheus+node_exporter 监控告警部署

下载好三个软件包 一、prometheus安装部署 1、解压 linxxubuntu:~/module$ tar -xvf prometheus-2.45.0-rc.0.linux-amd64.tar.gz 2、修改配置文件的IP地址 # my global config global:scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is ever…...

【前端知识】JavaScript——设计模式(工厂模式、构造函数模式、原型模式)

【前端知识】JavaScript——设计模式&#xff08;工厂模式、构造函数模式、原型模式&#xff09; 一、工厂模式 工厂模式是一种众所周知的设计模式&#xff0c;广泛应用于软件工程领域&#xff0c;用于抽象创建特定对象的过程。 优点&#xff1a;可以解决创建多个类似对象的…...

未来的算法备案法规:创新和安全如何兼顾?

随着科技的快速发展&#xff0c;算法正逐步渗透到我们生活的各个方面&#xff0c;从推荐引擎到自动驾驶&#xff0c;从医疗诊断到金融交易&#xff0c;这一现象既充满希望&#xff0c;也充满了挑战。其中一个关键的挑战就是如何设计和实施有效的算法备案法规&#xff0c;以促进…...

pycharm 使用远程服务器 jupyter (本地jupyter同理)

1. 远程服务器miniconda 环境中创建jupyter环境 # 1. 激活环境 conda activate envname#2. 在环境中安装jupyter pip install jupyter # 或者 conda install jupyter#3. 生成jupyter_notebook_config.py文件 jupyter notebook --generate-config#4. 设置密码 jupyter noteboo…...

leetcode 376. 摆动序列

2023.7.28 本题思路是定义一个 direct变量记录上一次摆动是上坡还是下坡 。 然后在一个for循环中循环判断当前摆动和上一次摆动是否一致&#xff0c;如果不一致则视为一次摆动。 如果前后元素值相等得话&#xff0c;直接continue进入下一次循环。 下面看代码&#xff1a; clas…...

【图像处理】使用自动编码器进行图像降噪(改进版)

阿里雷扎凯沙瓦尔兹 一、说明 自动编码器是一种学习压缩和重建输入数据的神经网络。它由一个将数据压缩为低维表示的编码器和一个从压缩表示中重建原始数据的解码器组成。该模型使用无监督学习进行训练&#xff0c;旨在最小化输入和重建输出之间的差异。自动编码器可用于降维、…...

MySQL大数据量分页查询方法及其优化

---方法1: 直接使用数据库提供的SQL语句 ---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N ---适应场景: 适用于数据量较少的情况(元组百/千级) ---原因/缺点: 全表扫描,速度会很慢 且 有的数据库结果集返回不稳定(如某次返回1,2,3,另外的一次返回2,1,3). L…...

dataTable转成对象、json、list

datatable转换成list集合 public static T TableToEntity<T>(DataTable dt, int rowindex 0, bool isStoreDB true){Type type typeof(T);T entity Activator.CreateInstance<T>();if (dt null){return entity;}DataRow row dt.Rows[rowindex];PropertyInfo…...

ubuntu环境安装centos7虚拟机网络主机不可达,ping不通

【NAT模式下解决】1.首先vi /etc/sysconfig/network-scripts/ifcfg-ens33检查ONBOOTyes&#xff0c;保存 2.输入systemctl restart network命令重启网关...

STN:Spatial Transformer Networks

1.Abstract 卷积神经网络缺乏对输入数据保持空间不变的能力&#xff0c;导致模型性能下降。作者提出了一种新的可学习模块&#xff0c;STN。这个可微模块可以插入现有的卷积结构中&#xff0c;使神经网络能够根据特征图像本身&#xff0c;主动地对特征图像进行空间变换&#x…...

C语言学习笔记 VScode设置C环境-06

目录 一、下载vscode软件 二、安装minGW软件 三、VS Code安装C/C插件 3.1 搜索并安装C/C插件 3.2 配置C/C环境 总结 一、下载vscode软件 在官网上下载最新的版本 Download Visual Studio Code - Mac, Linux, Windowshttps://code.visualstudio.com/download 二、安装minGW…...

alias取别名后,另一个shell中和shell脚本中不生效的问题以及crontab执行docker失败问题

目录 问题一&#xff1a;用alias取别名后&#xff0c;另一个shell中不生效描述原因解决 问题二&#xff1a;用alias取别名后&#xff0c;别名在脚本中不生效描述原因解决 问题三&#xff1a;crontab计划任务不能运行docker命令描述原因解决 问题一&#xff1a;用alias取别名后&…...

Shell ❀ 一键配置Iptables规则脚本 (HW推荐)

文章目录 注意事项1. 地址列表填写规范2. 代码块3. 执行结果4. 地址与端口获取方法4.1 tcpdump抓包分析&#xff08;推荐使用&#xff09;4.2 TCP连接分析&#xff08;仅能识别TCP连接&#xff09; 注意事项 请务必按照格式填写具体参数&#xff0c;否则会影响到匹配规则的创建…...

linux服务器查找大文件及删除文件后磁盘空间没有得到释放

1、查询服务器中大于1G的文件 find / -type f -size 1G这条命令是查询自”/”根目录下所有大小超过1G的文件&#xff0c;查询的大小可以根据需要改变&#xff0c;如下&#xff1a; 相关查询&#xff1a;查询服务器中大于100M的文件 find / -type f -size 100M2、查询服务器中…...

Java那些“锁”事 - 死锁及排查

死锁是两个或者两个以上的线程在执行过程中&#xff0c;因争夺资源而造成的一种互斥等待现象&#xff0c;若没有外界干涉那么它们将无法推进下去。如果系统资源不足&#xff0c;进程的资源请求都得到满足&#xff0c;死锁出现的可能性就很低&#xff0c;否则就会因为争夺有限的…...

LLM系列 | 18 : 如何用LangChain进行网页问答

简介 一夕轻雷落万丝&#xff0c;霁光浮瓦碧参差。 紧接之前LangChain专题文章&#xff1a; 15:如何用LangChain做长文档问答&#xff1f;16:如何基于LangChain打造联网版ChatGPT&#xff1f;17:ChatGPT应用框架LangChain速成大法 今天这篇小作文是LangChain实践专题的第4…...

如何用XHS-Downloader解决内容采集难题?3大维度提升效率90%

如何用XHS-Downloader解决内容采集难题&#xff1f;3大维度提升效率90% 【免费下载链接】XHS-Downloader 小红书&#xff08;XiaoHongShu、RedNote&#xff09;链接提取/作品采集工具&#xff1a;提取账号发布、收藏、点赞、专辑作品链接&#xff1b;提取搜索结果作品、用户链接…...

避坑指南:MoE训练中AllToAll通信的配置与性能调优(以DeepSpeed为例)

MoE训练实战&#xff1a;AllToAll通信性能调优与DeepSpeed配置避坑指南 当你在500张GPU的集群上启动MoE模型训练时&#xff0c;控制台突然刷出"AllToAll timeout"的红色警告——这不是假设场景&#xff0c;而是去年我们在训练千亿参数模型时真实遭遇的噩梦。AllToAll…...

多平台资源嗅探与下载工具:解决网络资源获取难题的技术方案

多平台资源嗅探与下载工具&#xff1a;解决网络资源获取难题的技术方案 【免费下载链接】res-downloader 资源下载器、网络资源嗅探&#xff0c;支持微信视频号下载、网页抖音无水印下载、网页快手无水印视频下载、酷狗音乐下载等网络资源拦截下载! 项目地址: https://gitcod…...

运放跟随器:电路设计中最容易被低估的‘保镖‘(隔离驱动全解析)

运放跟随器&#xff1a;电路设计中最容易被低估的"保镖"&#xff08;隔离&驱动全解析&#xff09; 在硬件工程师的日常设计中&#xff0c;运放跟随器常常被视为一个"可有可无"的组件——毕竟它的电压增益仅为1&#xff0c;看起来似乎只是将输入信号原封…...

深入理解Practical Modern JavaScript:Proxy对象与反射机制探索指南

深入理解Practical Modern JavaScript&#xff1a;Proxy对象与反射机制探索指南 【免费下载链接】practical-modern-javascript &#x1f3ca; Dive into ES6 and the future of JavaScript 项目地址: https://gitcode.com/gh_mirrors/pr/practical-modern-javascript J…...

移动端Transformer加速新范式:EAA注意力机制与SwiftFormer架构解析

1. 移动端Transformer的算力困局与EAA的破局思路 当Transformer架构从NLP领域跨界到计算机视觉时&#xff0c;所有人都被ViT的表现惊艳到了。但当我们兴冲冲地想把这种"视觉Transformer"塞进手机里时&#xff0c;现实给了我们当头一棒——传统的多头自注意力机制&…...

避开高光谱求导的坑:你的平滑做对了吗?附MATLAB代码与数据示例

高光谱微分预处理实战指南&#xff1a;如何避免噪声放大陷阱 第一次处理高光谱数据时&#xff0c;我兴奋地直接对原始光谱曲线求导&#xff0c;结果得到了一堆杂乱无章的噪声信号。这个教训让我明白了一个关键原则&#xff1a;未经平滑的微分操作就像在放大镜下观察指纹——细节…...

UUID和Name不在同一条BLE广播报文里

概要通过在命令行窗口打印部分报文信息&#xff0c;发现&#xff1a;设备向外发送BLE蓝牙低功耗广播&#xff0c;设备的UUID和Name不在同一条广播报文里UUID是通用唯一标识符一、设备1、发送报文的设备能够发送BLE蓝牙低功耗广播的设备。本篇使用的是周围环境中的未知设备。2、…...

罗技鼠标宏压枪系统:从技术原理到实战应用

罗技鼠标宏压枪系统&#xff1a;从技术原理到实战应用 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 引言&#xff1a;射击游戏中的后坐力挑战 …...

Windows下Pytesseract报错‘Error opening data file’?三步搞定TESSDATA_PREFIX环境变量配置

Windows下Pytesseract报错终极解决方案&#xff1a;深入理解TESSDATA_PREFIX环境变量 每次看到屏幕上跳出那个令人沮丧的"Error opening data file"错误提示&#xff0c;我都忍不住想起自己第一次配置Pytesseract时的抓狂经历。作为一个长期与OCR打交道的开发者&…...