setState如何仅重建AppBar?

时间:2019-06-16 19:09:28

标签: flutter

我有一个脚手架,其中的AppBar中有一个我想像开关一样工作的IconButton:按下时它会更改其状态。

尽管易于使用bool和setState实现,但整个小部件在setState上重绘,如下所示:

actions: <Widget>[
    IconButton(icon:Icon(Icons.favorite, 
        color: estaMarcada ? K.color_highlight : K.color_background),
        onPressed: () { setState(() 
            {estaMarcada = not estaMarcada;});},
     ),

我只想重绘Icon(或AppBar),而不是整个支架。

有什么想法吗?

谢谢。

3 个答案:

答案 0 :(得分:2)

我怀疑您的脚手架的build()方法具有副作用或进行网络调用。您应该始终将自己的build()方法构造为好像它们每秒被调用60次一样,因此它们应该快速且幂等。

答案 1 :(得分:1)

感谢@DivinePaul,我做到了:

class MyAppBar extends StatefulWidget {

  MyAppBar() : super();

  @override
  _MyAppBarState createState() => _MyAppBarState();
}

class _MyAppBarState extends State<MyAppBar> {
  @override
  Widget build(BuildContext context) {
    return AppBar(
      title: Row(
        children: <Widget> [
          Icon(K.icon),
          Text(K.title), 
        ]),
      actions: <Widget>[
        IconButton(
          icon:Icon(Icons.favorite, 
            color: appData.getMark() ? K.color_highlight : K.color_background),
          onPressed: () { 
            setState(() {
              appData.setMark();
            });
          },
        ),
      ]
    );
  }
}

答案 2 :(得分:0)

将您的AppBar提取到单独的 StatefulWidget 并在那里string_view