You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用animated_theme_switcher切换主题后图标未更新,求正确实现代码

问题原因

  • 图标切换的判断逻辑存在类型不匹配错误:你在Icon的判断条件中直接将主题对象ThemeModelInheritedNotifier.of(context).theme和Brightness枚举值做相等比较,二者类型完全不同,判断逻辑永远返回false,因此图标不会随主题切换变化。
  • 若你主动修改了ThemeModelInheritedNotifier.of(context)的listen参数为false,也会导致组件无法监听到主题更新,保持默认的listen: true即可。

修复方案

将Icon的判断条件调整为读取主题的brightness属性再和Brightness枚举比较即可,修复后的完整代码如下:

Container(
  margin: const EdgeInsets.only(),
  child: ThemeSwitcher(
    clipper: const ThemeSwitcherCircleClipper(),
    builder: (context) {
      return IconButton(
        onPressed: () async {
          var themeName =
              ThemeModelInheritedNotifier.of(context).theme.brightness ==
                      Brightness.light
                  ? 'dark'
                  : 'light';
          var service = await ThemeService.instance..save(themeName);
          var theme = service.getByName(themeName);
          ThemeSwitcher.of(context).changeTheme(theme: theme);
        },
        icon: Icon(ThemeModelInheritedNotifier.of(context)
                    .theme
                    .brightness == Brightness.light
            ? Icons.light_mode_outlined
            : Icons.dark_mode_outlined),
      );
    },
  ),
),

内容的提问来源于stack exchange,提问作者Anatoly Kuznetsov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 14:24:00