我需要一些帮助,了解如何从继承的小部件获取数据。
我通常直接从我的小部件的build方法中获取参数
@override
Widget build(BuildContext context) {
//THIS METHOD
var data = StateContainer.of(context).data;
return Container(child:Text("${data.parameter}"));
}
但是这个方法不能从initState调用,因为还没有buildContext。
我需要在initState方法中有这个参数(我在其中调用从服务器获取的数据,我需要将该数据传递给我的函数),那么,我应该怎么做呢?
@override
void initState() {
otherData = fetchData(data);
super.initState();
}
我尝试使用didChangeDipendencies(),但每次重建视图时都会调用它(从屏幕弹出等),所以它不是我想要使用的,也不是FutureBuilder小部件。
有什么建议吗?
5条答案
按热度按时间piah890a1#
首先,请注意,您可能确实想使用
didChangeDependencies
。但您不能在没有任何检查的情况下直接调用。您需要首先将其 Package 在if
中。典型的
didChangeDependencies
实现应该类似于:使用这样的代码,当
foo
发生变化时,doSomething
将仅执行。或者,如果你很懒,并且确信你的对象永远不会改变,还有另一种解决方案。
要获得InheritedWidget,通常使用的方法是:
并且在
initState
内部不能调用的就是这个方法。但还有另一种方法可以做同样的事情:
扭曲是:- 这个方法可以在
initState
内部调用-它不会处理值更改的情况。所以如果你的值永远不会改变,你可以用它来代替。
d4so4syb2#
1、如果只需要InheritedWidget作为Widget的参数Provider,可以在 initState 上使用如下:
2、如果您需要监听器在InheritedWidget数据发生变化时重新渲染widget,建议您将您的StatefulWidget内部封装一个StatelessWidget,StatefulWidget的参数是从StatelessWidget传入的,当InheritedWidget数据发生变化时,会通知StatelessWidget。在StatefulWidget上,我们会获取 didChangeDependencies 上的更改,您可以刷新数据。代码指南如下:
bjg7j2ky3#
我尝试了Remi的解决方案,但不知道
ancestorInheritedElementForWidgetOfExactType
方法现在是否已被弃用?但我可以找到它。用这个代替:
xqnpmsa84#
我更喜欢使用
didChangeDependencies
的解决方案,因为Future.delayed
解决方案有点黑客,看起来不专业和不健康。然而,它可以开箱即用。这是我更喜欢的解决方案:
w8ntj3qf5#
您也可以在initState中获取上下文,尝试使用持续时间为零的future。
我用它来使加载屏幕使用继承的小部件和避免一些全局变量