Flutter中点击IconButton无法切换图标问题求解
问题原因
iconData 变量被定义在 build 方法内部,每次调用 setState 触发组件重建时,build 方法会重新执行,直接将 iconData 重置为初始值 Icons.grid_view,因此图标永远无法完成切换。
同时你把状态更新方法 _toggleViewIcon 也定义在 build 方法内部,不符合Flutter状态类的常规写法规范。
修复方案
- 将存储图标状态的
iconData变量移动到_AppsScreenState类的成员属性位置,作为类级别的状态变量存储,避免每次组件重建时被重置。 - 将
_toggleViewIcon切换方法也移动到类成员位置,不要嵌套在build方法内。
注意:Flutter中所有需要跨重建保留的状态变量,都必须定义在State类的成员层级,不能放在build方法内部。build方法每次触发重建都会重新执行内部的所有变量声明和初始化逻辑,放在内部的变量无法持久保留状态。
修复后完整代码
class _AppsScreenState extends State<AppsScreen> { late Future<AllApps> activateApps; // 图标状态作为类成员变量,仅在State初始化时赋值一次 IconData iconData = Icons.grid_view; @override void initState() { super.initState(); activateApps = getActivatedApps(); } // 状态切换方法作为类成员方法 void _toggleViewIcon() { setState(() { iconData = iconData == Icons.grid_view ? Icons.list : Icons.grid_view; }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Apps'), primary: false, toolbarHeight: 50, leading: IconButton( tooltip: 'Toggle view', icon: Icon(iconData), onPressed: _toggleViewIcon, ), actions: <Widget>[ Padding( padding: const EdgeInsets.only(right: 20.0), child: IconButton( tooltip: 'Refresh', icon: const Icon(Icons.refresh), onPressed: () { setState(() { activateApps = getActivatedApps(); }); }, )), Padding( padding: const EdgeInsets.only(right: 20.0), child: IconButton( tooltip: 'Add or remove apps', icon: const Icon(Icons.add), onPressed: () { setState(() { activateApps = getActivatedApps(); }); }, )), ], ), primary: false, body: Column(children: [])); } }
内容的提问来源于stack exchange,提问作者Akshay
相关产品推荐
相关产品推荐

