StatefulBuilder 和 Builder

前言

果然了解的越多,越发现自己狗屁都不是。StatefulBuilderBuilder 之前真的不知道。还是在 对话框状态管理
中了解到了这两个东西。

简介

以下内容来自通义灵码

在Flutter中,StatefulBuilderBuilder 都是用来动态构建 widget 树的组件,但它们在处理状态管理和构建上下文方面有所不同:

StatefulBuilder

  • StatefulBuilder 是一个特殊的 widget,主要用于那些本身不是 StatefulWidget 但却需要在构建过程中更改和反应状态变化的场景。它接收一个 builder 函数作为参数,这个函数会在状态更改时被调用并重新构建其内部 widget 树。
  • 使用 StatefulBuilder 时,你可以直接在其 builder 方法内调用提供的 _setState 参数来更新局部状态,并立即触发内部 widget 树的重建,而无需刷新整个页面或父级 StatefulWidget 的状态。
StatefulBuilder(builder: (BuildContext context, void Function(void Function()) setState) {bool isChecked = ...; // 可变状态return Checkbox(value: isChecked,onChanged: (bool newValue) {setState(() {isChecked = newValue;});},);},
);

Builder

  • Builder widget 不具备自身的状态管理能力,但它主要用于构建作用域内的BuildContext,特别是在涉及到InheritedWidget、Theme、Navigator等需要访问新构建环境的场景下。
  • Builder 主要用于将现有的 build 方法内部的上下文传递给其内部的 builder 函数,这样就可以在新的上下文中构建子 widget。这有助于隔离环境影响,尤其是在处理多个嵌套的 Consumer, StreamBuilder 或者 InheritedWidget 时。
Builder(builder: (BuildContext context) {// 这里可以使用新的BuildContext来构建子widgetreturn Container(...);},
)

简而言之:

  • StatefulBuilder 允许你在没有独立 StatefulWidget 的情况下,在 widget 树的任何位置动态地更新状态。
  • Builder 则是为了获取或创建一个新的构建上下文,以便于在不同的环境中正确构建和访问 widget。它本身不涉及状态管理,更多关注的是构建环境的控制与传递。

案例

上面那篇文章里有对应的例子。这里也只是对其记录和学习。

    Future<bool?> showDeleteDialog() {// 记录是否选中bool isChecked = true;return showDialog<bool>(context: context,builder: (context) {return AlertDialog(title: const Text("提示"),content: Column(crossAxisAlignment: CrossAxisAlignment.start,// 高度设置为最小mainAxisSize: MainAxisSize.min,children: [const Text("是否删除?"),Row(children: [const Text("同时删除子目录?"),Checkbox(value: isChecked,onChanged: (bool? value) {isChecked = value!;})],)],),actions: [TextButton(onPressed: () {Navigator.pop(context, false);},child: const Text("取消")),TextButton(onPressed: () {// 返回选中状态Navigator.pop(context, isChecked);},child: const Text("确定")),],);});}

在这里插入图片描述

可以看出,UI没有被更新,文章中也给出了解释:

对话框也是通过路由的方式来实现的,那么上面的代码实际上就等同于企图在父路由中调用setState来让子路由更新,这显然是不行的!简尔言之,根本原因就是context不对。

解决方法那就是使用 StatefulBuilderBuilder 获取到独立的context

Row(children: [const Text("同时删除子目录?"),StatefulBuilder(builder: (context, setState) {return Checkbox(value: isChecked,onChanged: (bool? value) {setState(() {isChecked = value!;});});})],
)
Row(children: [const Text("同时删除子目录?"),Builder(builder: (context) {return Checkbox(value: isChecked,onChanged: (bool? value) {(context as Element).markNeedsBuild();isChecked = value ?? false;});})],)

在这里插入图片描述
StatefulBuilder中会提供一个setState用来更新局部状态,触发UI更新。
Builder 则是为了获取或创建一个新的构建上下文,调用ElementmarkNeedsBuild()方法来进行局部状态更新。

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

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

相关文章

使用unplugin-auto-import页面不引入api飘红

解决方案&#xff1a;. tsconfig.json文件夹加上 {"compilerOptions": {"target": "ES2020","useDefineForClassFields": true,"module": "ESNext","lib": ["ES2020", "DOM", &q…

Mybatis别名 动态sql语句 分页查询

给Mybatis的实体类起别名 给Mybatis的xml文件注册mapper映射文件 动态sql语句 1 if 2 choose 3 where 4 foreach 一&#xff09;if 查询指定名称商品信息 语法&#xff1a; SELECT * FROM goods where 11 <if test "gName!null"> and g.g_name like co…

Intellij IDEA安装配置Spark与运行

目录 Scala配置教程 配置Spark运行环境 编写Spark程序 1、包和导入 2、定义对象 3、主函数 4、创建Spark配置和上下文 5、定义输入文件路径 6、单词计数逻辑 7、输出结果 8、完整代码&#xff1a; Scala配置教程 IDEA配置Scala&#xff1a;教程 配置Spark运行环境 …

Untiy 布局控制器Aspect Ratio Fitter

Aspect Ratio Fitter是Unity中的一种布局控制器组件&#xff0c;用于根据指定的宽高比来调整包含它的UI元素的大小。实际开发中&#xff0c;它可以确保UI元素保持特定的宽高比&#xff0c;无论UI元素的内容或父容器的大小如何变化。 如图为Aspect Ratio Fitter组件的基本属性&…

自然语言处理(NLP)全面指南

自然语言处理&#xff08;NLP&#xff09;是人工智能领域中最热门的技术之一&#xff0c;它通过构建能够理解和生成人类语言的机器&#xff0c;正在不断推动技术的发展。本文将为您提供NLP的全面介绍&#xff0c;包括其定义、重要性、应用场景、工作原理以及面临的挑战和争议。…

Python图像处理——计算机视觉中常用的图像预处理

概述 在计算机视觉项目中&#xff0c;使用样本时经常会遇到图像样本不统一的问题&#xff0c;比如图像质量&#xff0c;并非所有的图像都具有相同的质量水平。在开始训练模型或运行算法之前&#xff0c;通常需要对图像进行预处理&#xff0c;以确保获得最佳的结果。图像预处理…

typescript 实现RabbitMQ死信队列和延迟队列 订单10分钟未付归还库存

Manjaro安装RabbitMQ 安装 sudo pacman -S rabbitmq rabbitmqadmin启动管理模块 sudo rabbitmq-plugins enable rabbitmq_managementsudo rabbitmq-server管理界面 http://127.0.0.1:15672/ 默认用户名和密码都是guest。 要使用 rabbitmqctl 命令添加用户并分配权限&#xf…

怎样去保证 Redis 缓存与数据库双写一致性?

解决方案 那么我们这里列出来所有策略&#xff0c;并且讨论他们优劣性。 先更新数据库&#xff0c;后更新缓存先更新数据库&#xff0c;后删除缓存先更新缓存&#xff0c;后更新数据库先删除缓存&#xff0c;后更新数据库 先更新数据库&#xff0c;后更新缓存 这种方法是不推…

在scroll-view中使用input,input键盘弹出时,滚动页面,输入框内容会出现错位问题?

解决办法 <view classpages><view><scroll-view scroll-y"{{sysScroll}}" scroll-top"{{scrollTop}}" class"scroll-hei-2 bg-def">...<input bindfocus"onfocus" bindblur"onblur" placeholder&quo…

RestTemplate 请求响应数据出现乱码问题,RestTemplate 如何解压缩 gzip 数据

文章目录 1.问题描述2.问题分析3.问题解决3.1 Apache HttpClient 依赖3.2 RestTemplate 配置类3.3 测试 1.问题描述 直接通过浏览器访问请求没有问题&#xff0c;但是通过 RestTemplate 访问请求却会出现乱码问题。 2.问题分析 首先我认为是 SpringBoot 版本、JDK 版本、项目结…

HTTP——Cookie

HTTP——Cookie 什么是Cookie通过Cookie访问网站 我们之前了解了HTTP协议&#xff0c;如果还有小伙伴还不清楚HTTP协议&#xff0c;可以点击这里&#xff1a; https://blog.csdn.net/qq_67693066/article/details/136895597 我们今天来稍微了解一下HTTP里面一个很小的部分&…

OpenHarmony中的LLDB高性能调试器

概述 LLDB&#xff08;Low Lever Debugger&#xff09;是新一代高性能调试器。详细说明参考 LLDB官方文档 。 当前OpenHarmony中的LLDB工具是在 llvm15.0.4 基础上适配演进出来的工具&#xff0c;是HUAWEI DevEco Studio工具中默认的调试器&#xff0c;支持调试C和C应用。 工…

【直播课】2024年PostgreSQL CM认证实战培训课程于4月27日开课!

课程介绍 了解关注开源技术&#xff0c;学习PG以点带面 Linux/Andriod&#xff08;操作系统&#xff09;、Apache/Tomcat&#xff08;应用服务器&#xff09;、OpenStack/KVM&#xff08;虚拟化&#xff09;、Docker/K8S&#xff08;容器化&#xff09;、Hadoop&#xff08;大…

IoTeX(IOTX) 推出首个DEPIN数据平台,蓝筹项目合作进入新时代。

首先来了解一下什么是IoTeX(IOTX) 2024年1月25日&#xff0c;作为由IoTeX驱动的首个DEPIN类别优先数据平台&#xff0c;与蓝筹DePIN项目Helium、Akash、Theta、DIMO、Pocket、Drife、WiFi Map和Streamr合作推出。这一官方发布标志着DePIN&#xff08;去中心化物理基础设施网络&…

西门子 S7-200 SMART 系列十三:实例详解用s7-200 smart 向导配置PID回路参数设定

原文链接&#xff1a;西门子 S7-200 SMART 系列十三&#xff1a;实例详解用s7-200 smart 向导配置PID回路&参数设定 在往期文章中介绍了s7-200 smart的通讯应用&#xff0c;Modbus RTU&#xff0c;S7通信&#xff0c;Profinet通信&#xff0c;TCP通信等&#xff0c;基本包含…

代码学习记录29----贪心最后一天

随想录日记part29 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.03.28 主要内容&#xff1a;今天是学习贪心算法最后一天&#xff0c;接下来是针对题目的讲解&#xff1a;1.单调递增的数字;2.监控二叉树; 3. 总结 738.单调递增的数字 968.监控二叉树 总结 To…

通知中心架构:打造高效沟通平台,提升信息传递效率

随着信息技术的快速发展&#xff0c;通知中心架构作为一种关键的沟通工具&#xff0c;正逐渐成为各类应用和系统中必不可少的组成部分。本文将深入探讨通知中心架构的意义、设计原则以及在实际场景中的应用。 ### 什么是通知中心架构&#xff1f; 通知中心架构是指通过集中管…

Git_常用命令+代码冲突解决方案

文章目录 基本命令的使用查看git的当前版本初始化配置设置用户名及邮箱设置仓库的认证方式查看当前配置 创建仓库从远程服务器克隆仓库创建本地仓库 添加和提交文件工作区域和文件状态工作区域文件状态 查看文件状态及分支信息查看暂存区的内容添加文件提交文件查看提交日志回退…

verilog设计-cdc:多比特信号跨时钟域(DMUX)

一、前言 多比特一般为数据&#xff0c;其在跨时钟域传输的过程中有多种处理方式&#xff0c;比如DMUX&#xff0c;异步FIFO&#xff0c;双口RAM&#xff0c;握手处理。本文介绍通过DMUX的方式传输多比特信号。 二、DMUX同步跨时钟域数据 dmux表示数据分配器&#xff0c;该方…

ChatGLM3:AttributeError_ can‘t set attribute ‘eos_token‘

最近在微调 ChatGLM3-6b 时&#xff0c;训练好模型之后&#xff0c;调用inference_hf.py函数验证模型的时候报了如下错误&#xff0c;下面是解决方案。 我在训练时使用的是ptuning_v2.yaml配置文件&#xff0c;训练运行代码如下&#xff1a; CUDA_VISIBLE_DEVICES1 python fi…