Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter setState如何仅重建AppBar?_Flutter - Fatal编程技术网

Flutter setState如何仅重建AppBar?

Flutter setState如何仅重建AppBar?,flutter,Flutter,我有一个脚手架,其中AppBar有一个IconButton,我想像开关一样工作:按下它时会改变状态 尽管使用bool和setState很容易实现,但整个小部件在setState上重新绘制,如下所示: actions: <Widget>[ IconButton(icon:Icon(Icons.favorite, color: estaMarcada ? K.color_highlight : K.color_background), onPre

我有一个脚手架,其中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;});},
     ),
操作:[
图标按钮(图标:图标,
颜色:estaMarcada?K.颜色\u突出显示:K.颜色\u背景),
onPressed:(){setState()
{estaMarcada=不是estaMarcada;});},
),
我只想重新绘制图标(或AppBar),而不是整个脚手架

有什么想法吗


提前感谢。

将应用程序栏提取到一个单独的StatefulWidget
setState()

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();
            });
          },
        ),
      ]
    );
  }
}
类MyAppBar扩展StatefulWidget{
MyAppBar():super();
@凌驾
_MyAppBarState createState()=>\u MyAppBarState();
}
类_MyAppBarState扩展状态{
@凌驾
小部件构建(构建上下文){
返回AppBar(
标题:世界其他地区(
儿童:[
图标(K.Icon),
文本(K.标题),
]),
行动:[
图标按钮(
图标:图标(Icons.favorite,
颜色:appData.getMark()?K.color\u突出显示:K.color\u背景),
onPressed:(){
设置状态(){
appData.setMark();
});
},
),
]
);
}
}

我怀疑你的脚手架的build()方法有副作用或进行网络调用。你应该始终构造build()方法,就像它们每秒可能被调用60次一样,因此它们应该是快速且幂等的。

多亏了@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();
            });
          },
        ),
      ]
    );
  }
}
类MyAppBar扩展StatefulWidget{
MyAppBar():super();
@凌驾
_MyAppBarState createState()=>\u MyAppBarState();
}
类_MyAppBarState扩展状态{
@凌驾
小部件构建(构建上下文){
返回AppBar(
标题:世界其他地区(
儿童:[
图标(K.Icon),
文本(K.标题),
]),
行动:[
图标按钮(
图标:图标(Icons.favorite,
颜色:appData.getMark()?K.color\u突出显示:K.color\u背景),
onPressed:(){
设置状态(){
appData.setMark();
});
},
),
]
);
}
}

在Widget类型的变量内设置IconButton并切换其值(Widget类型)在你的SetState函数中。为什么?你这样做的目的是什么?因为那可能不会像你期望的那样工作。@Houssem,尝试过,但所有页面仍然被重新绘制。你有任何代码示例吗?Rémi,我希望按钮颜色代表它的状态。如果我的setMark进行任何同步保存,则为True