是否StatefulWidget不重建状态,每次它有新的数据?



小部件trainpage被添加到main中的构建图中。单击相应的菜单按钮时显示。当_routes为空时,第二次当_routes为满时,会执行两次。

Widget pageSelector() {
if (_selectedIndex == 2) {
return new TrainsPage(routes: _routes);
} else
return Text("");
}

在TrainsPage。飞镖,我的代码有状态部件TrainsPage。

class TrainsPage extends StatefulWidget {
const TrainsPage({Key? key, required this.routes}) : super(key: key);
final List<RSRoute> routes;
@override
_TrainsPageState createState() => _TrainsPageState();
}
class _TrainsPageState extends State<TrainsPage> {
List<RSRoute> _routes = List.empty();
@override
void initState() {
super.initState();
this._routes = new List<RSRoute>.from(widget.routes);

现在,第二次,trainpage在main中被调用。dart(现在填充了routes),则不调用_TrainsPageStateinitState(),它负责读取routes中的数据。由于routes第一次是空的,所以火车页面上没有显示任何内容。

为什么trainpage不重建_TrainsPageState,当它明显在构造函数中获得新数据时?

这正是State存在的原因:即使在重建小部件时,也要保持当前上下文的状态。

如果每次重新构建有状态的小部件时都重新创建它,它就不能保留自己变量的状态。

class MyWidget extends StatelessWidget {
var _someStateVariable = 0;
@override
void build(BuildContext context){
// here an action that increment _someStateVariable
}
}

这里_somestatvariable将在每次重建时重置为0。或者,如果我们首先需要StateFullWidget,那是因为我们稍后将更新该变量,并希望在多个小部件重建中保持其更新值。如果你没有这样的状态变量需要维护,也许你不需要在这里使用StateFullWidget。

现在来解决你的问题:你可以覆盖didUpdateWidget而不是initstate,因为它将在每个小部件重建时被调用:

@override
void didUpdateWidget() {
didUpdateWidget();
_routes = new List<RSRoute>.from(widget.routes);
}

最新更新