如何在 Init 状态下访问提供者值

2024-04-12

如何从 init 函数或解决方法访问提供程序模型中的值?

基本上,当我的应用程序加载时,我会在提供程序模型中保存一些值。

一个值是一个搜索变量。然后我被重定向到加载页面,我需要该值来获取数据并呈现列表。

我正在 init 方法中检索数据。

-- 我的主要功能

void main() {
  runApp(
   Provider<UserModel>(
      builder: (_) => UserModel(),
      child: Jobs(),
    ),
  ); //added
}

这是我的“工作”页面的一个片段

case '/main':
   return MaterialPageRoute(
      builder: (_) => JobsHomePage(title: "jobs"));
   break;

这是显示此列表的列表页面 --- 工作主页()

void initState() {
    searchVal = Provider.of<UserModel>(context).searchVal;
    jb =load(searchVal);
}

然后我有一个构建器方法,它迭代“jb”并打印值

我收到的错误是继承错误

flutter:当继承的 widget 发生变化时,例如 Theme.of() 的值发生变化,它是依赖的

感谢您的帮助...我没有发布整个代码,因为它很长,并且我在堆栈中收到一些“所有代码”错误。


如果您在执行某些任务后不需要再次更新小部件,那么 Mikhail 接受的答案就很好。didChangeDependencies方法。 (大多数时候情况并非如此。)

但如果你需要在执行任务后通知监听者,那就不行了。

上下文is可访问于initState。 您需要添加参数listen: false给提供者。

The docs https://pub.dev/documentation/provider/latest/provider/Provider/of.html say

听:必须为 false 才能调用Provider.of inside [State.initState] or the create提供者的方法如下:...

  @override
  void initState() {
    super.initState();
    final _store = Provider.of<RecorderStore>(context, listen: false);
  }

现在说说为什么要覆盖didChangeDependencies这不是一个好主意:

In the docs https://api.flutter.dev/flutter/widgets/State/didChangeDependencies.html it says

例如,如果先前对 build 的调用引用了后来发生更改的 InheritedWidget,则框架将调用此方法来通知此对象有关更改的信息。

因此当你使用ChangeNotifierProvider例如,当你打电话时notifyListeners()这将调用didChangeDependencies method.

所以当你打电话时notifyListeners通过didChangeDependencies它将导致无限循环。

或者即使你不打电话notifyListeners明确地,每当didChangeDepencies方法被调用,代码被执行多次。

所以更好用listen: false在 initState 中确保代码只执行一次。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Init 状态下访问提供者值 的相关文章

随机推荐

  • 代表和活动之间有什么区别?

    代表和活动之间有什么区别 两者不都包含对可以执行的函数的引用吗 An Event声明增加了一层抽象和保护delegate实例 此保护可防止委托的客户端重置委托及其调用列表 并且仅允许在调用列表中添加或删除目标
  • WCF 中未返回 DateTime.Kind

    当处理DateTime具有 WCF 的对象 返回DateTime对象丢失了Kind财产 永远是DateTimeKind Unspecified即使我在退货之前手动更改它 我在 WCF 端这样做了 dateFrom DateTime Spec
  • 根据用户 ID 限制下拉选项

    我问这个问题是因为我不确定解决问题的最佳方法 问题 我有一个预先填充的下拉列表 其中包含 1 000 个左右的数字 我需要根据使用下拉列表的用户来限制下拉列表中显示的数字 我想到的解决方案 使用 jQuery 隐藏所有数字 使用 jQuer
  • Firebase:如何检查电子邮件是否在运行时经过验证

    所以流程将是这样的 用户通过 firebase 使用电子邮件和密码登录 如果电子邮件经过验证 他们将转到主要活动 否则他们将进入验证电子邮件活动 我想做的是 当他们处于验证电子邮件活动时 我将在 onCreate 方法中发送验证电子邮件 然
  • 有没有办法用#define 代替长命名空间?

    假设我有一个很长的命名空间 我不想一直输入它 但我不想使用using namespace 任何一个 我可以为此使用 define 吗 Example define glm quat glm gtc quaternion class Came
  • Javascript 网络摄像头捕获并使用 PHP 上传到服务器

    我有一个页面 使用 javascript 和 PHP 上传文件成功上传图像表单画布 第二页已成功将网络摄像头捕获到画布并正确显示 我正在尝试使用摄像头捕获实时CSS对象来调整图像上传脚本 但什么也不做 html是 折断 div div cl
  • Laravel Passport tokensExpireIn 似乎不起作用

    我正在使用 Laravel 5 4 Passport 来创建 SPA 应用程序 但是 我能够使身份验证工作 但访问令牌始终是短期令牌 过期时间为 600 秒 我无法通过以下方式增加过期时间 Passport tokensExpireIn C
  • 如何在 pandas groupby 直方图中显示标签名称

    我可以使用 pandas 在单个图中绘制多个直方图 但缺少一些东西 如何给出标签 我只能绘制一个图形 如何将其更改为layout 3 1 或其他内容 另外 在图1中 所有的垃圾箱都填充了纯色 很难知道哪个是哪个 那么如何用不同的标记 例如十
  • 有没有有效的方法来禁用 HTML 表单中的自动完成功能?

    当使用xhtml1 transitional dtddoctype 使用以下 HTML 收集信用卡号
  • Play2 如何从服务层而不是动作层管理事务?

    我正在使用 Play2 1 1 Java 和 JPA2 0 以及 hibernate 实现 通过代码控制事务而不是像下面那样使用 transactional 是正常的 JPA 代码风格 有没有办法在 Play 上像下面这样工作 或者如何使用
  • 在 p5js 中将画布导出为 GIF/PNG

    I use 原子编辑器 我要实现20 秒 GIF用我的画布 saveFrames 有一个限制 我猜 即使我输入 它也可以将 png 文件保存为短 gif 3 5 秒 saveFrames aa png 15 22 我发现了 CCapture
  • 如何组织大型代码文件?

    我越来越意识到 任何单个文件中的代码通常可以很容易地跨越数百行 尽管我知道实现可能是合理的 但它仍然感觉混乱和无组织 我知道在某些情况下需要大量代码 但是组织所有代码的最佳方法是什么 我考虑过将变量与方法分开 privates from p
  • Dart 中的函数类型定义/函数类型别名是什么?

    我已经阅读了描述 我明白它是一个函数类型别名 typedef 或函数类型别名为函数类型提供一个名称 您可以在声明字段和返回类型时使用该名称 当将函数类型分配给变量时 typedef 会保留类型信息 http www dartlang org
  • 如何知道两个线程中哪个线程首先完成执行

    我有两个线程 A 和 B 如果 A 先完成 那么我必须执行 function1 否则如果 B 先完成 我需要执行 function 2 我如何知道两个线程中哪一个先完成执行 您可以使用以下内容 仅当先前的值为空时才会设置该内容 即使只有一个
  • 未收到 ACTION_MY_PACKAGE_REPLACED

    我正在使用 ACTION MY PACKAGE REPLACED 来接收我的应用程序更新或重新安装的信息 我的问题是该事件永远不会被触发 我尝试了 Eclipse 和真实设备 这就是我所做的 显现
  • Python:将原始字符串转换为字节字符串而不添加转义字符

    我有一个字符串 BZh91AY SYA xaf x82 r x00 x00 x01 x01 x80 x02 xc0 x02 x00 x00 x9ah3M x07 lt xc9 x14 xe1BA x06 xbe x084 而且我要 b BZ
  • Android EditText 具有固定的最大行数且无滚动

    我想创建一个文本输入 1 始终显示3行 2 不允许用户输入超过 3 行可用空间的文本 3 如果用户输入的文本超过 3 行 则不可滚动 从技术上讲 我允许用户输入最多 500 个字符以保存到数据库 但我并不期望输入的文本量接近这个数量 因此
  • 在Java 8中以静态方式获取类名[重复]

    这个问题在这里已经有答案了 这是后续更一般和类似的问题 答案 https stackoverflow com questions 1696551 how to get the name of the calling class in jav
  • java中的计算器[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 最近我在研究可以加 减 乘 除的简单计算器 public static void main String arr double num1
  • 如何在 Init 状态下访问提供者值

    如何从 init 函数或解决方法访问提供程序模型中的值 基本上 当我的应用程序加载时 我会在提供程序模型中保存一些值 一个值是一个搜索变量 然后我被重定向到加载页面 我需要该值来获取数据并呈现列表 我正在 init 方法中检索数据 我的主要