Flutter setState如何仅重建AppBar?
我有一个脚手架,其中AppBar有一个IconButton,我想像开关一样工作:按下它时会改变状态 尽管使用bool和setState很容易实现,但整个小部件在setState上重新绘制,如下所示: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
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