在 initState 中获取 InheritedWidget 参数

cri*_*ant 5 state dart flutter inherited-widget

我需要一些帮助来理解如何从继承的小部件获取数据。

我通常使用直接从构建方法从我的小部件获取参数

  @override
  Widget build(BuildContext context) {    
   //THIS METHOD
   var data = StateContainer.of(context).data;

   return Container(child:Text("${data.parameter}"));
  }
Run Code Online (Sandbox Code Playgroud)

但是这个方法不能从 initState 调用,因为还没有 buildContext 。

我需要在 initState 方法中使用该参数(我在其中调用了从服务器获取的数据,并且需要将该数据传递给我的函数),那么,我该怎么做呢?

@override
void initState() {
 otherData = fetchData(data);
 super.initState();
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用 didChangeDipendencies() 但每次重建视图时都会调用它(从屏幕弹出等),所以它不是我想要使用的,也不是 FutureBuilder 小部件。

有什么建议吗?

Rém*_*let 9

首先,请注意您可能确实想要使用didChangeDependencies. 但是你不能在没有任何检查的情况下直接打电话到那里。你需要if先把它包装起来。

典型的didChangeDependencies实现应该类似于:

Foo foo;

@override
void didChangeDependencies() {
  super.didChangeDependencies();
  final foo = Foo.of(context);
  if (this.foo != foo) {
    this.foo = foo;
    foo.doSomething();
  }
}
Run Code Online (Sandbox Code Playgroud)

使用这样的代码,只有在发生变化时doSomething才会执行。foo


或者,如果您很懒惰并且确定您的对象永远不会改变,那么还有另一种解决方案。

获取InheritedWidget,通常使用的方法是:

BuildContext context;
InheritedWidget foo = context.inheritFromWidgetOfExactType(Foo);
Run Code Online (Sandbox Code Playgroud)

而正是这个方法不能在内部调用initState

但是还有另一种方法可以做同样的事情:

BuildContext context;
InheritedWidget foo = context.ancestorInheritedElementForWidgetOfExactType(Foo)?.widget;
Run Code Online (Sandbox Code Playgroud)

扭曲是: - 这个方法可以在内部调用initState - 它不会处理值改变的场景。

因此,如果您的价值永远不会改变,您可以改用它。