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 小部件。
有什么建议吗?
首先,请注意您可能确实想要使用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
- 它不会处理值改变的场景。
因此,如果您的价值永远不会改变,您可以改用它。
| 归档时间: |
|
| 查看次数: |
2872 次 |
| 最近记录: |