Skip to content

Commit 078c5c9

Browse files
committed
fix: 通过启用蚂蚁设计CSS变量和定义暗模式覆盖来解决暗模式闪烁
1 parent d9e3ebd commit 078c5c9

File tree

3 files changed

+18
-11
lines changed

3 files changed

+18
-11
lines changed

app/globals.css

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,12 @@
7171
/* 卡片阴影 */
7272
--card-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.3);
7373
--card-shadow-hover: 0 4px 12px 0 rgba(0, 0, 0, 0.5);
74+
75+
/* Ant Design 变量覆盖 - 解决暗黑模式闪烁问题 */
76+
--ant-color-bg-container: #141414;
77+
--ant-color-bg-layout: #000000;
78+
--ant-color-text: rgba(255, 255, 255, 0.85);
79+
--ant-color-text-base: #fff;
7480
}
7581

7682
/* 基础样式 */

components/Providers.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ function AntdThemeProvider({ children }: { children: React.ReactNode }) {
3030
locale={zhCN}
3131
theme={{
3232
algorithm: isDark ? antdTheme.darkAlgorithm : antdTheme.defaultAlgorithm,
33+
cssVar: true,
3334
token: {
3435
colorPrimary: '#1890ff',
3536
borderRadius: 8,

components/layout/ThemeToggle.tsx

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,15 @@ export default function ThemeToggle() {
2323
setMounted(true);
2424
}, []);
2525

26-
// 同步 Redux 主题到 next-themes
26+
// 同步 next-themes 主题到 Redux
27+
// next-themes 是单一事实来源,Redux 只是为了保持状态一致性以便其他组件使用
2728
useEffect(() => {
28-
if (reduxTheme && nextTheme !== reduxTheme) {
29-
setNextTheme(reduxTheme);
29+
if (nextTheme && (nextTheme === 'light' || nextTheme === 'dark' || nextTheme === 'system')) {
30+
if (reduxTheme !== nextTheme) {
31+
dispatch(setTheme(nextTheme as ThemeMode));
32+
}
3033
}
31-
}, [reduxTheme, nextTheme, setNextTheme]);
34+
}, [nextTheme, reduxTheme, dispatch]);
3235

3336
// 确定当前实际显示的主题
3437
const currentTheme = nextTheme === 'system' ? systemTheme : nextTheme;
@@ -55,13 +58,10 @@ export default function ThemeToggle() {
5558
*/
5659
const toggleTheme = () => {
5760
// 在 light 和 dark 之间切换
58-
const newTheme: ThemeMode = isDark ? 'light' : 'dark';
59-
60-
// 更新 next-themes
61+
const newTheme = isDark ? 'light' : 'dark';
62+
63+
// 只更新 next-themes,useEffect 会自动同步到 Redux
6164
setNextTheme(newTheme);
62-
63-
// 更新 Redux store(会自动保存到 LocalStorage)
64-
dispatch(setTheme(newTheme));
6565
};
6666

6767
/**
@@ -76,7 +76,7 @@ export default function ThemeToggle() {
7676
<Button
7777
type="text"
7878
icon={isDark ? <SunOutlined aria-hidden="true" /> : <MoonOutlined aria-hidden="true" />}
79-
size='large'
79+
size="large"
8080
onClick={toggleTheme}
8181
className="transition-theme flex items-center justify-center"
8282
aria-label={getTooltipTitle()}

0 commit comments

Comments
 (0)