我不止一次读到不建议使用 statefullWidget。BottomNavigationBar
在中切换页面的示例body
。没有statefullWidget
这个例子怎么办?使用块?还是仅适用于业务逻辑?
class HomeScreenTest extends StatefulWidget {
@override
_HomeScreenTestState createState() => _HomeScreenTestState();
}
class _HomeScreenTestState extends State<HomeScreenTest> {
int _currentIndex = 0;
final pages = [
Page1(),
Page2(),
Page3(),
];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: pages[_currentIndex],
bottomNavigationBar: BottomNavigationBar(
onTap: (index) {
setState(() {
_currentIndex = index;
});
},
currentIndex: _currentIndex,
items: [
BottomNavigationBarItem(
title: Text('pag1'),
),
BottomNavigationBarItem(
title: Text('page'),
),
BottomNavigationBarItem(
title: Text('page3'),
),
],
),
);
}
}
StatefulWidget确实不能到处使用,但首先让我们弄清楚为什么。
当我们调用State.setState时,它
StatefulWidget
开始重建。重建时,它会删除树中它下面的元素(嵌套的 chlid),从而导致所有内容都被重建到小部件树的末尾。由于这种重建,isolate被阻塞,其中 UI 工作并且设备的资源被消耗。StatefulWidget
没有State.setState
. _ _ 或者在小部件树的末尾,当它不会强制重建较低的小部件时。但是我们不能拒绝
State.setState
,我们需要动态改变UI,这有什么用呢?状态管理- UI 重建优化。有很多,它们都有不同的方法:
更改通知器- 通知小部件有关状态更改的通知,适用于少数侦听器。
Persist Widget - UI 缓存,我们可以从缓存中显示它,而不是重建小部件。
那么用于什么
BottomNavigationBar
和类似的小任务呢?答案:使用更改通知器(+ Persist Widget,如果它适合任务)。对于此类任务,使用状态管理将是多余的。这是如何完成此操作的示例(提供程序用于方便使用
Change Notifier
):