【问题标题】:How to access provider value in Init state如何在 Init 状态下访问提供者值
【发布时间】:2019-12-24 02:19:00
【问题描述】:

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

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

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

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

-- 我的主要功能

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

这是我的工作页面的 sn-p

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

这是显示此列表的列表页面 --- JobsHomePage()

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

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

我得到的错误是继承错误

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

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

【问题讨论】:

标签: flutter


【解决方案1】:

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

但是如果你需要在执行完任务后通知监听者,它就不起作用了。

上下文可在initState 中访问。 您需要将参数listen: false 添加到Provider。

docs

listen: false 是能够在[State.initState] 内调用Provider.of 或提供者的create 方法所必需的,如下所示:...

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

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

docs 中写着

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

因此,例如,当您使用ChangeNotifierProvider 时,当您调用notifyListeners() 时,将调用didChangeDependencies 方法。

因此,当您通过didChangeDependencies 调用notifyListeners 时,将导致无限循环。

或者即使你没有显式调用notifyListeners,每当调用didChangeDepencies方法时,代码都会被执行多次。

所以最好在initState中使用listen: false来保证代码只执行一次。

【讨论】:

  • 谢谢,我也遇到了同样的问题。我有存储应该在构造函数中采用单例依赖项并使用 didChangeDependencies 触发连续重建。使用listen: false 解决了问题
  • 这是一个很好的答案。这应该被标记为接受的答案。当我需要来自提供者的值时,我一直在以传统方式传递参数。那是多余的。这很好地解决了我的问题
  • 我收到一个空错误,因为 Provider 需要一个刻度来填充,并且在 initstate 中执行空检查不起作用...如何使用该值?
  • @PhaniRithvij 如果我们必须通知侦听器并且必须在 initState 中调用 provider,我们该怎么办?
  • @Patzu 我想你可以像往常一样做一个notifyListeners() 吗?
【解决方案2】:

您无法在initState 中访问context,但您可以在didChangeDependencies 中访问它。
根据offical docs,它在initState之后被调用,它可以使用context,所以它可以调用Provider.of&lt;T&gt;(context)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-15
    • 2015-08-02
    • 2016-04-16
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    相关资源
    最近更新 更多