如何在 Init 状态下访问 provider 值

use*_*135 4 flutter

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

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

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

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

-- 我的主要功能

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

这是我的工作页面的片段

case '/main':
   return MaterialPageRoute(
      builder: (_) => JobsHomePage(title: "jobs"));
   break;
Run Code Online (Sandbox Code Playgroud)

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

void initState() {
    searchVal = Provider.of<UserModel>(context).searchVal;
    jb =load(searchVal);
}
Run Code Online (Sandbox Code Playgroud)

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

我得到的错误是继承错误

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

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

Pha*_*vij 28

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

但是如果您需要在执行任务后通知侦听器,它将不起作用。

上下文无障碍initState。您需要将参数添加listen: false到 Provider。

文件说,

听:假是必要的,以便能够像这样调用Provider.of内部[State.initState]create提供者的方法:...

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

Run Code Online (Sandbox Code Playgroud)

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

文档中它说

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

因此当你使用ChangeNotifierProvider时举例,当你调用notifyListeners()那个时就会调用该didChangeDependencies方法。

所以当你notifyListeners通过didChangeDependencies它调用时会导致无限循环。

或者即使您不notifyListeners显式调用,只要调用该didChangeDepencies方法,代码就会执行多次。

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

  • 谢谢,我也有同样的问题。我有一个商店,它应该在构造函数中采用单例依赖项,并使用 didChangeDependency 触发连续重建。使用“listen: false”解决了问题 (2认同)
  • 这是一个很好的答案。这应该标记为已接受的答案。当我需要来自提供者的值时,我一直以传统方式传递参数。那是多余的。这很大程度上解决了我的问题 (2认同)

Mik*_*kin 5

您无法context在 中访问initState,但可以在 中访问didChangeDependencies
根据官方文档,它是在之后调用的initState,并且可以使用context,因此它可以调用Provider.of<T>(context)