场景

void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {const MyApp({super.key});Widget build(BuildContext context) {return ChangeNotifierProvider(create: (context) => MyAppState(),child: MaterialApp(title: 'Namer App',theme: ThemeData(useMaterial3: true,colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepOrange),),home: MyHomePage(),),);}
}class MyAppState extends ChangeNotifier {var current = WordPair.random();void getNext() {current = WordPair.random();notifyListeners();}var favorites = <WordPair>[];void toggleFavorite() {if (favorites.contains(current)) {favorites.remove(current);} else {favorites.add(current);}notifyListeners();}
}

Analysis

在 Flutter 里,“一切皆 Widget”。
build 方法的声明:


Widget build(BuildContext context)

只要求“返回 某种 Widget”。并没有规定必须是 ContainerText 或者别的具体类型——只要最终返回值 实现Widget 抽象类即可。

ChangeNotifierProvider 本质上也是 Widget

ChangeNotifierProvider(来自 provider 包)继承自 InheritedNotifier<ChangeNotifier>,而 InheritedNotifier 又直接或间接继承自 StatelessWidget,最终实现了 Widget
所以从类型系统的角度看,它完全符合 Widget build(...) 的返回要求:

Widget               <-- 抽象基类└─ StatelessWidget└─ InheritedNotifier└─ ChangeNotifierProvider   ✓

类比到 iOS / UIKit

  • 在 UIKit 里,UIViewController.view 需要返回一个 UIView
    你既可以返回 UILabelUIButton,也可以返回自定义继承自 UIView 的子类;本质上它们都是 UIView
  • Flutter 里 build 需要返回 WidgetChangeNotifierProviderContainerText ……都继承自 Widget,所以都合法。

为什么要把 Provider 当根节点返回?

  1. 注入状态
    ChangeNotifierProvider 的职责是把 MyAppState(一个 ChangeNotifier)放进 widget tree 的上层,以便子树里的任何 widget 都能通过 context.watch<MyAppState>() 访问它。

  2. 组合而非继承
    Flutter 树形 UI 的推荐写法是“用 widget 组合功能”。把 Provider 放在最外层,可以在不修改下层页面的前提下,随时替换 / 拆分状态管理方案。

  3. 仍然可以嵌套真实 UI
    Provider 自己也有一个 child。在你的代码里,childMaterialApp(...)——这是实际渲染 UI 的根。Provider 只是一个透明的“功能包装器”。

return ChangeNotifierProvider(create: (_) => MyAppState(),child: MaterialApp(// ...UI 层次从这里开始),
);

换句话说,ChangeNotifierProvider ≈ “带状态注入功能的空壳 View”,它把真正的 UI (MaterialApp) 装进去,再把整个结果返回给 Flutter 框架。对 build 而言,这依旧只是一个合法的 Widget


总结

  • build 只要求返回任何实现了 Widget 的对象。
  • ChangeNotifierProvider 继承自 Widget,当然可以直接返回。
  • 这样写的好处是:在最外层注入全局状态,子树里随时 context.watchcontext.read 即可使用;UI 结构保持纯粹,逻辑与表现分离。

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

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

相关文章

【软考高级系统架构论文】论负载均衡技术在Web系统中的应用

论文真题 负载均衡技术是提升Web系统性能的重要方法。利用负载均衡技术&#xff0c;可将负载(工作任务)进行平衡、分摊到多个操作单元上执行&#xff0c;从而协同完成工作任务&#xff0c;达到提升Web系统性能的目的。 请围绕“负载均衡技术在Web系统中的应用”论题&#xff…

pyqt5工具-串口调试工具

目录 功能界面代码功能 串口设置:支持选择串口、波特率、数据位、停止位和校验位 串口操作:扫描串口、打开 / 关闭串口连接 数据收发: 支持文本和 Hex 模式显示与发送 可设置自动添加换行符 接收区自动滚动 支持中文显示 辅助功能:清空接收区、状态栏显示连接状态 多串口管…

Mybatis-Plus支持多种数据库

使用Mybatis-Plus进行数据库的访问&#xff0c;但是由于不同的数据库有不同的方言&#xff0c;所以需要进行适配。 有2种实现方式&#xff1a; databaseId方式Mapper Location方式 指定databaseId方式 通过databaseId指定所使用的数据库&#xff0c;选择同步的SQL。 Mappe…

【系统分析师】2018年真题:综合知识-答案及详解

【第1题】 面向对象分析中&#xff0c;对象是类的实例。对象的构成成分包含了&#xff08;1&#xff09;&#xff0c;属性和方法&#xff08;或操作&#xff09;。 (1)A.标识 B.消息 C.规则 D.结构 【解析】本题考查的是面向对象的基本概念 对象的三要素为&#xff1a;属性…

从Git历史中删除大文件的完整解决方案

从Git历史中删除大文件的完整解决方案 当你意外提交了一个大文件导致无法推送到远程仓库时&#xff0c;可以按照以下步骤彻底从Git历史中删除这个大文件。 情况分析 首先确认你的问题属于以下哪种情况&#xff1a; 大文件在最近一次提交中&#xff1a;相对容易处理大文件在…

[xiaozhi-esp32] 应用层(9种state) | 音频编解码层 | 双循环架构

第三章&#xff1a;应用层 在第一章&#xff1a;开发板抽象层中&#xff0c;我们实现了硬件交互标准化&#xff1b;在第二章&#xff1a;通信协议层中&#xff0c;我们构建了云端通信桥梁。 现在需要将这些能力有机整合——这便是应用层的使命 应用层的本质 应用层是设备的…

Java 锁升级的过程详解

Java 锁升级的过程详解 Java 虚拟机(JVM)为了提高多线程并发的效率,对内置锁(synchronized 关键字)的实现进行了一系列优化。这些优化体现在锁的升级过程中,即当竞争程度从低到高变化时,锁的状态会从偏向锁逐渐升级为轻量级锁,最终升级为重量级锁。这个过程是不可逆的…

使用vitis tcl脚本构建vitis app工程

一&#xff1a;最近重新学习了zynq系列开发&#xff0c;想着使用tcl创建工程&#xff0c;因此分享一下脚本例子 #!/bin/bashsource /tools/Xilinx/Vitis/2022.2/settings64.sh cd ../../ . ./script/project.sh cd app/script #tcl脚本只能在虚拟机桌面执行 xsct build_vitis…

电脑商城--购物车

加入购物车 1 购物车-创建数据表 1.使用use命令先选中store数据库。 USE store; 2.在store数据库中创建t_cart用户数据表。 CREATE TABLE t_cart (cid INT AUTO_INCREMENT COMMENT 购物车数据id,uid INT NOT NULL COMMENT 用户id,pid INT NOT NULL COMMENT 商品id,price BIG…

2024-2025学年度下期《网页设计》期末模拟测试

一、 单选题 1. HTML文档的根标签是( ) A. <html> B. <head> C. <body> D. <!DOCTYPE> 2. 用于定义段落内容的标签是&#xff1a;( ) A. <div> B. <p> C. <span> D. <br> 3. 网以下哪个属性用于定义CSS内联样式…

搭建加解密网站遇到的问

本机向云服务器传输文件 用winscp 服务器在安装 SSH 服务时自动生成密钥对&#xff08;公钥私钥&#xff09; 为什么要有指纹验证&#xff1f; 防止中间人攻击&#xff08;Man-in-the-Middle&#xff09; 指纹验证打破这个攻击链&#xff1a; 小问题 安装python时 ./confi…

CSS 制作学成在线网页

1 项目结构 1.1 总结 2 网页制作思路 3 header 区域 - 布局 3.1 通栏 3.2 logo 3.3 导航 3.4 搜索区域 3.5 用户区域 4 banner 区域 4.1 左侧侧导航 4.2 右侧课程表 5 精品推荐 6 推荐课程区域 参考链接&#xff1a; 82-准备工作-项目目录与版心_哔哩哔哩_bilibili

图灵完备之路(数电学习三分钟)----门的多路化

上一章中我们学习了如何用与非门实现其他逻辑门&#xff0c;但上节中的输入信号始终为2&#xff0c;但在现实中&#xff0c;输入的信号数量是不确定的&#xff0c;所以我们需要设计多输入的门&#xff1a; 1.三路与非门&#xff08;卡诺图法&#xff09; 我们还是从与非门开始…

【前端】二进制文件流下载(get、post)再谈一次

最近二进制文件流下载可谓是又出幺蛾子&#xff0c;翻阅以前的文章也找不到解决方案&#xff0c;感觉还是没用完全理解&#xff0c;这次再整理一遍。 先说一个通用场景&#xff0c;就是无论get还是post在接口请求的时候设定好 headers: { Content-Type: application/json;cha…

uv功能介绍和完整使用示例总结

以下是关于 UV 工具的完整使用示例总结,结合其核心功能与典型场景,帮助用户快速上手并高效管理 Python 项目: 一、安装与配置 快速安装 macOS/Linux:curl -LsSf https://astral.sh/uv/install.sh | shWindows:powershell -ExecutionPolicy ByPass -c "irm https://as…

MySQL启动报错“mysqld_safe Directory ‘/var/lib/mysql‘ don‘t exists“终极解决方案!从入门到高阶全攻略

在MySQL的使用过程中&#xff0c;启动报错mysqld_safe Directory /var/lib/mysql dont exists是开发者经常遇到的问题。这个错误看似简单&#xff0c;实则可能涉及目录权限、系统配置、文件系统等多个方面。本文将结合官方文档与实际经验&#xff0c;从基础到高级&#xff0c;为…

python 常见数学公式函数使用详解

Python 数学公式与函数大全 Python 提供了丰富的数学计算支持&#xff0c;包括内置函数、标准库&#xff08;math、cmath、numpy&#xff09;和第三方库&#xff08;sympy、scipy&#xff09;。以下是常用数学公式和函数的分类整理&#xff1a; 1. 基本数学运算 1.1 算术运算…

阿里云服务器+宝塔面板发布网站

一、租用服务器 &#xff08;1&#xff09;、进入官网 阿里云-计算&#xff0c;为了无法计算的价值阿里云——阿里巴巴集团旗下公司&#xff0c;是全球领先的云计算及人工智能科技公司之一。提供免费试用、云服务器、云数据库、云安全、云企业应用等云计算服务&#xff0c;以…

langchain框架中各种Agent(LLMSingleAgent ReactAgent Plan-and-Execute Agent)原理方式对比

在LangChain框架中&#xff0c;LLMSingleActionAgent与ReAct Agent及其他Agent类型在内部原理上存在显著差异&#xff0c;主要体现在推理机制、行动策略、动态性等方面。以下结合实例进行详细说明&#xff1a; 1. LLMSingleActionAgent的内部原理 LLMSingleActionAgent是LangC…

AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年6月22日第116弹

从今天开始&#xff0c;咱们还是暂时基于旧的模型进行预测&#xff0c;好了&#xff0c;废话不多说&#xff0c;按照老办法&#xff0c;重点8-9码定位&#xff0c;配合三胆下1或下2&#xff0c;杀1-2个和尾&#xff0c;再杀4-5个和值&#xff0c;可以做到100-300注左右。 (1)定…