首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在flutter中使用provider时不执行类的构造函数?

在Flutter中使用Provider时,不会执行类的构造函数,是因为Provider是基于InheritedWidget实现的。InheritedWidget是Flutter中一种特殊的Widget,它可以在Widget树中共享数据,并且当数据发生变化时,可以自动通知依赖该数据的子Widget进行更新。

Provider通过InheritedWidget的方式将数据共享给子Widget,而不是通过类的构造函数传递数据。这样做的好处是可以避免在Widget树中频繁地传递数据,提高了代码的可读性和可维护性。

当使用Provider时,通常会创建一个继承自ChangeNotifier的数据模型类,并在该类中定义需要共享的数据和对数据进行操作的方法。然后,在Widget树中使用Provider提供该数据模型类的实例,子Widget可以通过Provider.of<T>(context)获取该实例,并监听数据的变化。

当数据发生变化时,Provider会通知依赖该数据的子Widget进行更新,而不会重新执行类的构造函数。这是因为Provider会在InheritedWidget的updateShouldNotify方法中判断数据是否发生变化,只有当数据发生变化时,才会触发子Widget的更新。

总结一下,在Flutter中使用Provider时不执行类的构造函数的原因是:

  1. Provider是基于InheritedWidget实现的,通过共享数据的方式传递数据给子Widget,而不是通过构造函数传递。
  2. Provider通过判断数据是否发生变化来触发子Widget的更新,而不是重新执行类的构造函数。

推荐的腾讯云相关产品:腾讯云云开发(https://cloud.tencent.com/product/tcb)是一款无服务器云开发平台,提供了丰富的后端服务和开发工具,可以帮助开发者快速构建和部署云端应用。腾讯云云开发可以与Flutter中的Provider结合使用,实现数据的共享和更新。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

创建子类对象,父构造函数调用被子类重写方法为什么调用是子类方法?

A对象时候父会调用子类方法?...但是:创建B对象父会调用父方法? 答案: 当子类被加载到内存方法区后,会继续加载父到内存。...如果,子类重写了父方法,子类方法引用会指向子类方法,否则子类方法引用会指向父方法引用。 如果子类重载了父方法,则子类重载方法引用还指向子类方法。...如果子类方法没有重写也没有重载父方法,则方法引用会指向父方法。 当子类对象创建,会先行调用父构造方法(构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。...其结果是当编译时候,父构造方法调用方法参数已经强制转换为符合父方法参数了。 上边代码在编译前已经转换为下面这个样子了。

6.1K10

最全面的c++构造函数高级使用方法及禁忌

说明一下,我用是gcc7.1.0编译器,标准库源代码也是这个版本。 本篇文章讲解c++构造函数高级用法以及特殊使用情况。 1....,我们执行一下程序,结果如下: call constructors throw something 可以看到没有执行析构函数,那如果构造函数申请动态内存以后抛出异常,就会出现内存泄露问题,那么为什么没有执行析构函数呢...,存在动态内存class里面使用移动构造就要小心了,一不小心就会出现问题哦,具体移动构造怎么实现可以参考上面第一点代码。...,那根据多态规则,父构造函数将不会被执行,这也是不成立。...,那就很清晰了,main函数执行以前,全局变量和静态变量构造函数会先执行

1.5K30

【Java 虚拟机原理】Java 加载初始化细节 ( 只使用常量加载不会执行到 ‘初始化‘ 阶段 )

, 解析 ) -> 初始化 这个完整流程 ; 如 : 如果是 public final static 修饰常量值 , 在编译阶段 , 就会将该值放到常量池中 ; 加载过程 , 只要执行到...加载 -> 连接 ( 验证 , 准备 , 解析 ) 阶段 , 就可以完成常量池初始化 , 即使没有执行 初始化 这个步骤 , 也不影响使用常量值 ; 连接 准备 阶段 , 为 普通 ...字节码文件 , 然后使用 javap -v -Student.class 查看该字节码文件附加信息 ; " 常量表 " , 发现了常量值 18 , 这个常量值是在编译阶段就编译到了字节码...; " 连接 " " 准备 " 阶段 , 该常量值就设置完毕 ; 出于最大限度性能优化考虑 , 如果不使用该类其它值 , 就不会执行 " 初始化 " 阶段 ; 因此这里不会调用 静态代码块..., 只会为其在内存分配空间 ; 创建数组 , 触发是 Student[] 数组类型 加载初始化 , 但是不会触发 Student 初始化操作 ; 如果调用数组元素 , 就需要初始化

3.6K20

React useEffect中使用事件监听回调函数state更新问题

很多React开发者都遇到过useEffect中使用事件监听回调函数获取到旧state值问题,也都知道如何去解决。...// 再次点击addEventListenerShowCount按钮 eventListener事件回调函数打印state值控制台打印结果如下图片手动实现简易useEffect,事件监听回调函数也会有获取不到...对象类似于按钮btn refApp函数类似React App纯函数组件每次state变化,React 函数会重新执行,所以我们可以进行如下模拟操作图片这个示例运行过程就比较好理解,第一次执行App函数...React函数也是一样情况,某一个对象监听事件回调函数,这个对象相当于全局作用域变量(或者与函数同一层作用域链),回调函数获取到state值,为第一次运行时内存state值。...而组件函数普通函数,每次运行组件函数,普通函数与state作用域链为同一层,所以会拿到最新state值。

10.4K60

Flutter 中文文档:简单应用状态管理

这里我们出现了第一个问题:我们把当前购物车状态放在哪合适呢? 2. 提高状态层级 Flutter ,有必要将存储状态对象置于 widget 树对应 widget 上层。 为什么呢?...但是这样方式很难避免出现 bug。 Flutter ,每次当 widget 内容发生改变时候,你就需要构造一个新。...然而当购物车 widget 树,处于 MyListItem 层级之上,又该如何访问状态呢? 一个简单实现方法是提供一个回调函数,当 MyListItem 被点击时候可以调用。...相对复杂应用,由于会有多个模型,所以可能会有多个 ChangeNotifier。(不是必须得把 ChangeNotifier 和 provider 结合起来用,不过它确实是一个特别简单)。...ChangeNotifier 是 flutter:foundation 一部分,而且不依赖 Flutter 任何高级别。测试起来非常简单(你都不需要使用 widget 测试)。

2K10

nextline函数_JAVAScannernext()和nextLine()为什么不能一起使用

回车符 “\r” 它被丢弃缓冲区,现在缓冲区,只有一个 \r ,于是 下一次 nextLine 扫描时候就又扫描到了 \r,返回它之前内容,也是啥都没有 “” ,然后再把 \r 去掉, 对于...,而我们控制台中输入数据也都是被先存入缓冲区中等待扫描器扫描读取。...这个扫描器扫描过程判断停止依据就是“结束符”,空格,回车,tab 都算做是结束符 而坑点在于 next 系列,也就是下面这些函数:next nextInt nextDouble nextFloat...这些函数与 nextLine 连用都会有坑 坑点就是 next 系列函数返回了数据后,会把回车符留在缓冲区,因此我们下一次使用 nextLine 时候会碰到读取空字符串情况 解决方案:输入都用...nextLine ,做格式转换 输入 next 系列函数调用后,中间调用一次 nextLine 调用去掉了回车符后,再调用一次 nextLine 调用真正输入我们数据 都使用 nextLine: class

2.6K10

使用Provider来进行状态管理

第二步,lib目录下新增一个provider文件夹,然后该文件夹内放我们各个状态管理。(本例我们新建了一个Counter.dart) ?..._count++; //表示更新状态.它会重新触发所有监听了该Providerbuild方法 //本例,当notifyListeners方法执行时候,购物车页面与我页面的build...上例状态管理Counter状态值_count,初始化该值时候,如果该初始值不需要计算,我们声明_count时候进行初始赋值即可,如下: class Counter with ChangeNotifier..._count++; notifyListeners();//表示更新状态 } } 但是如果该初始值需要计算得到,那么我们可以Counter构造函数中进行该计算。...因为我们需要在main.dart配置全局监听(这里是Counter),配置时候需要实例化该类(Counter),也就是会触发Counter构造函数

2K30

记住,永远都不要在 Flutter使用全局变量

以上所有原因都说明了为什么 Flutter 永远不应该使用全局变量。...全局变量导致“面条”代码 由于程序每个函数都可以修改全局变量,因此很难跟踪更改。如果你正在构建一个大型应用程序, Flutter使用全局变量情况会升级。...但是,有些开发人员会使用全局变量,因为他们一个小团队,并且某些情况下不利于更改。 但是,无论应用程序大小如何,当需要维护代码,全局变量都会带来挑战。...使用以下代码片段添加和使用 Provider 包插件: dependencies: flutter: sdk: flutter provider: ^3.1.0 Provider 程序包还允许你与多个共享小部件状态...要在 Flutter 应用程序启动开始使用 GetX,请将 get 添加到你 pubspec.yaml 文件: dependencies: get: 接下来,导入使用 GetX 库函数和组件需要

3.4K30

2021 年值得期待 Flutter 数据流管理方案

不像 Redux React 独占鳌头,Flutter 数据流管理方案层出穷,本文旨在介绍2021年值得使用 Flutter 数据流管理方案,除了大家都比较熟悉 InheritedWidget...ViewModel 和 Model 层界限,使得 ViewModel 持有 Model 层,这样可以规避 VM 重建 Model 层重建,结构如下所示: ?...封装中用到几个如下: ChangeNotifier:是 Flutter 实现一个监听-订阅 NormalPageState:页面状态枚举值 NormalPageController:负责页面状态变化...方法1:flutter_riverpod 提供了一个 ConsumerWidget,它会在 build 函数多提供了一个 ScopedReader 函数来从 provider 获取值并使 state...若非在 build 函数,可以使用 context.read 获得 provider class IncrementNotifier extends ChangeNotifier { int _

1.9K20

Flutter中网络图片加载和缓存实现

重温小部件Image 常用小部件Image实现了几种构造函数,已经足够我们日常开发各种场景下创建Image对象使用了。...final ImageProvider image; 首先,使用Image.network命名构造函数创建Image对象,会同时初始化实例变量image,image是一个ImageProvider对象...我们重点来_ImageState函数执行。...思路很简单,就是获取网络图片之前先检查一下本地文件缓存目录是否有缓存文件,如果有则不用再去下载,否则去下载图片,下载完成后立即将下载到图片缓存到文件供下次需要使用。...Widget使用带参数非命名构造函数,指定image参数为自定义ImageProvider对象即可,代码示例如下 import 'imageloader/network_image.dart' as

3.1K30

【C++】构造函数分类 ② ( 不同内存创建实例对象 | 栈内存创建实例对象 | new 关键字创建对象 )

一、不同内存创建实例对象 1、栈内存创建实例对象 在上一篇博客 【C++】构造函数分类 ① ( 构造函数分类简介 | 无参构造函数 | 有参构造函数 | 拷贝构造函数 | 代码示例 - 三种类型构造函数定义与调用..., 会自动将栈内存实例对象销毁 ; 栈内存 调用 构造函数 创建 实例对象 , 不需要关注其内存占用 ; 2、堆内存创建实例对象 栈内存 声明 实例对象 方式是 : 该 s1...; Student* s2; C++ 语言中 , 可以使用 new 关键字 , 调用有参构造函数 , 创建 实例对象 ; 在下面的 C++ 代码 , 声明并定义了 MyClass , 该类定义了一个有参构造函数..., 接受两个整数作为 构造函数参数 ; main 函数 , 使用 使用 new 关键字 来调用 有参构造函数 创建 MyClass 实例对象 ; class MyClass { public...实例对象 , 则不需要关心 该对象 内存占用情况 , 在这块代码块作用域结束 , ( 一般是函数大括号内代码执行完毕 ) , 该 栈内存 MyClass 对象会被系统自动销毁 ; MyClass

14820

Flutter】Image 组件 ( 加载网络图片 | 加载静态图片 | 加载本地图片 | path_provider 插件 )

构造函数 | Image.network 构造函数 | Image.asset 构造函数 ) 三、Image.network 构造函数 代码示例 : // 图片组件 , 从网络中加载一张图片 Image.network...width: 200, ), 二、加载静态图片 ---- 加载静态图片步骤 : 先声明图片 , 再使用图片 ; ① 声明图片资源 : pubspec.yaml 声明图片资源路径 ; ② 访问图片...: dart 文件中使用 AssetImage 访问图片 ; 配置静态图片 : 注册层次 , assets 按在 flutter 二级层次配置 ; flutter: uses-material-design...插件 : 搜索插件 : https://pub.dev/packages 搜索 path_provider 插件 ; 插件地址 : https://pub.dev/packages/path_provider...配置插件 : pubspec.yaml 配置插件 ; dependencies: path_provider: ^2.0.1 获取插件 : 点击 pubspec.yaml 右上角 Pub

1.7K30

Flutter技术与实战(5)

动画结束,反向执行动画反向执行完毕,重新启动执行。...异步函数 对于一个异步函数来说,其返回内部执行动作并未结束,因此需要返回一个 Future 对象,供调用者使用。...使用 Provider 之前,我们首先需要在 pubspec.yaml 文件添加 Provider 依赖. dependencies: flutter: sdk: flutter... Flutter ,测试用例声明包含定义、执行和验证三个部分:定义和执行决定了被测试对象提供、需要验证最小可测单元;而验证则需要使用 expect 函数,将最小可测单元执行结果与预期进行比较...运行测试用例,可以看到,Flutter 执行完计数器递增方法后,发现其结果 1 与预期 2 匹配,于是报错。

15.6K30

Flutter完整开发实战详解(十五、全面理解State与Provider)

这就涉及 Flutter Widget 实现原理,之前篇章我们介绍过,这里我们说两个涉及概念: Flutter Widget 在一般情况下,是需要通过 Element 转化为 RenderObject...但是当我们点击 4 setState ,却发现 3 Text 没有发现改变, 这是为什么呢? ?...,只是执行了 _state.widget = newWidget,而我们通过 _DemoPageState(this.data) 传入 data ,传入后执行setState 并没有改变。...而当 InheritedWidget 被更新,如下代码所示,_dependents Element 会被逐个执行 notifyDependent ,最后触发 markNeedsBuild ,这也是为什么当...Provider 使用指南上,更详细 Vadaski Flutter | 状态管理指南篇——Provider》 已经写过,我就不重复写轮子了,感兴趣可以过去看看。

3.5K21

重走Flutter状态管理之路—Riverpod入门篇

其实Provider使用上已经非常不错了,只不过随着Flutter更加深入,大家对它需求也就越来越高,特别是对Provider因为InheritedWidget层次问题导致异常和BuildContext...这个对象允许我们读取其他Provider我们Provider状态将被销毁执行一些操作,以及其它一些事情 传递给Provider函数返回对象类型,取决于所使用Provider。...这对于某个变化发生执行某些操作是很有用,比如在发生错误时显示一个snackbar。 ref.listen方法需要2个参数,第一个是Provider,第二个是当状态改变我们要执行回调函数。...也不应该在initState和其他State生命周期内使用它。 ❞ 通过ref.read来读取Provider状态 ref.read方法是一种监听情况下获取Provider状态方法。...它通常用于由用户交互触发函数。例如,当用户点击一个按钮,我们可以使用ref.read来增加一个计数器值。

2.6K20

Flutter Provider状态管理---八种提供者使用分析

前言 我们上一篇文章Provider进行了介绍以及结构说明,最后还写了一个简单示例,通过上一章节我们对Provider有了一个基本了解,这一章节我们来说说Provider8种提供者以及他们使用区别...Provider Provider是最基本Provider组件,可以使用它为组件树任何位置提供值,但是当该值更改时候,它并不会更新UI,下面我们给出一个示例 第一步:创建模型 class UserModel...], ), ), ); } } 复制代码 运行结果 FutureProvider 简单来说,FutureProvider用于提供在组件树准备好使用其值可能尚未准备好值...注意: FutureProvider只会重建一次 默认显示初始值 然后显示Future值 最后不会再次重建 第一步:创建模型 这里和Provider不同是增加了构造函数,以及changeName变成了...方法时会改变UserModel5里面的name,当然我们实际开发过程并不是这么简单,这里只是演示模型依赖如果使用ProxyProvider import 'package:flutter/material.dart

4.1K00

【技术创作101训练营】Flutter Routes 路由应用与封装小结

,重点是介绍 Flutter Navigator 应用与封装; 个人简介:  (Page 3)首先和尚做一个简单自我介绍;本人 ID 为 阿策小和尚,为什么叫 和尚 呢?...,防止栈内没有元素强制 pop 出栈引起异常;而 maybePop 不仅可以判断还可以执行 Pop 出栈操作,可以实际场景灵活应用;       (Page 20)和尚再以静态方式和动态方式为维度再次回顾一下...ARouter 朋友一定会非常了解; 注意:一般采用 home Widget ,路由表设置 / 名称 root 路由; 3. initialRoute initialRoute...为重要构造函数使用未在 routes 中注册命名路由均会在此回调,通过 onGenerateRoute 构造函数进行具体业务操作或路由守卫等; 5. onUnknownRoute...: 不要为了封装而封装,合适位置调用合适方法;不要盲从; 多学习参考源码和优秀三方库实践,多观察生命周期函数进行深入理解; 多动手多尝试,注意异常情况判空处理等; 三方库很香,依旧建议先学习基本系统方法

1.3K102
领券