如何解决为什么人们把 TabController 放在 initState 里面,而把它放在 Widget build 里面工作就好了?
我看到的很多教程总是像这样将 TabController 放在 initState 中:
(示例教程:TabBar Widget in flutter)
TabController _tabController;
void initState() {
super.initState();
_tabController = TabController(length: 3,vsync: this);
}
但没有人解释为什么,当下面的例子工作得很好时:
TabController _tabController;
Widget build(BuildContext context) {
_tabController = TabController(length: 3,vsync: this);
...
}
把它放在 initState 里面而不是放在 Widget build 里面有什么好处吗?
我问这个是因为我想使用提供程序作为 TabController 长度,如果我把 TabController 放在 initState 中就不能这样做, 所以现在我正在做的是:
TabController _tabController;
Widget build(BuildContext context) {
_tabController = TabController(length: Provider.of<List>(context).listLength,vsync: this);
...
}
我想知道是否存在已知错误或人们将 TabController 放入 initState 的任何原因。
解决方法
因为initState
只运行一次,组件创建时,每次渲染组件时build
都会运行,所以如果你在build里面初始化state,每次都会初始化state。
这里有一个例子,BuildWidget
会在每次渲染时改变它的值,而 StateWidget
只会在初始化时改变它的值。
class BuildWidget extends StatefulWidget {
const BuildWidget({Key? key}) : super(key: key);
@override
_BuildWidgetState createState() => _BuildWidgetState();
}
class _BuildWidgetState extends State<BuildWidget> {
final Random _random = Random();
int _value = 0;
@override
Widget build(BuildContext context) {
_value = _random.nextInt(100);
return Center(
child: Text('My value is $_value'),);
}
}
class StateWidget extends StatefulWidget {
const StateWidget({Key? key}) : super(key: key);
@override
_StateWidgetState createState() => _StateWidgetState();
}
class _StateWidgetState extends State<StateWidget> {
final Random _random = Random();
int _value = 0;
@override
void initState() {
_value = _random.nextInt(100);
super.initState();
}
@override
Widget build(BuildContext context) {
return Center(
child: Text('My value is $_value'),);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。