Skip to content

Commit 045ff4c

Browse files
committed
暗色模式联动功能区分平台引入
1 parent 3182a8e commit 045ff4c

File tree

4 files changed

+56
-33
lines changed

4 files changed

+56
-33
lines changed

tdesign-component/example/lib/main.dart

Lines changed: 6 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
// 仅在 Web 平台导入
2-
import 'dart:html' as html if (dart.library.html) 'dart:html';
3-
41
import 'package:flutter/foundation.dart' show kIsWeb;
52
import 'package:flutter/material.dart';
63
import 'package:flutter/services.dart';
@@ -15,6 +12,7 @@ import 'home.dart';
1512
import 'l10n/app_localizations.dart';
1613
import 'provider/locale_provider.dart';
1714
import 'provider/theme_mode_provider.dart';
15+
import 'util/web_theme_listener.dart';
1816

1917
Future<void> main() async {
2018
WidgetsFlutterBinding.ensureInitialized();
@@ -89,7 +87,11 @@ class _MyAppState extends State<MyApp> {
8987
// 在 Web 平台设置 postMessage 监听
9088
if (PlatformUtil.isWeb) {
9189
WidgetsBinding.instance.addPostFrameCallback((_) {
92-
_setupThemeModeListener(context, themeModeProvider);
90+
// 仅在 Web 平台执行
91+
if (!kIsWeb) {
92+
return;
93+
}
94+
setupThemeModeListener(themeModeProvider);
9395
});
9496
}
9597

@@ -140,33 +142,4 @@ class _MyAppState extends State<MyApp> {
140142
return const {};
141143
}
142144
}
143-
144-
static bool _listenerSetup = false;
145-
146-
void _setupThemeModeListener(
147-
BuildContext context, ThemeModeProvider themeModeProvider) {
148-
// 只设置一次监听器
149-
if (_listenerSetup) return;
150-
_listenerSetup = true;
151-
152-
// 仅在 Web 平台执行
153-
if (!PlatformUtil.isWeb) return;
154-
155-
// ignore: undefined_prefixed_name, avoid_web_libraries_in_flutter
156-
if (kIsWeb) {
157-
html.window.onMessage.listen((event) {
158-
if (event.data is Map) {
159-
final data = event.data as Map;
160-
if (data['type'] == 'theme-mode-change') {
161-
final themeMode = data['themeMode'] as String?;
162-
if (themeMode == 'dark') {
163-
themeModeProvider.themeMode = ThemeMode.dark;
164-
} else if (themeMode == 'light') {
165-
themeModeProvider.themeMode = ThemeMode.light;
166-
}
167-
}
168-
}
169-
});
170-
}
171-
}
172145
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// Web 平台主题模式监听器
2+
// 使用条件导入,避免在非 Web 平台编译时出错
3+
// 条件导入:Web 平台使用 dart:html,非 Web 平台使用 stub
4+
export 'web_theme_listener_stub.dart'
5+
if (dart.library.html) 'web_theme_listener_web.dart';
6+
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// 非 Web 平台的 stub 实现
2+
3+
import 'package:flutter/material.dart';
4+
5+
import '../provider/theme_mode_provider.dart';
6+
7+
/// 非 Web 平台的 stub 实现(空操作)
8+
void setupThemeModeListener(ThemeModeProvider themeModeProvider) {
9+
// 非 Web 平台不需要实现,空操作即可
10+
}
11+
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Web 平台实现:使用 dart:html 监听 postMessage
2+
3+
import 'dart:html' as html;
4+
5+
import 'package:flutter/material.dart';
6+
7+
import '../provider/theme_mode_provider.dart';
8+
9+
// 静态变量,用于确保只设置一次监听器
10+
bool _listenerSetup = false;
11+
12+
/// Web 平台的主题模式监听器实现
13+
void setupThemeModeListener(ThemeModeProvider themeModeProvider) {
14+
// 只设置一次监听器
15+
if (_listenerSetup) return;
16+
_listenerSetup = true;
17+
18+
// 监听来自父窗口的 postMessage
19+
html.window.onMessage.listen((event) {
20+
if (event.data is Map) {
21+
final data = event.data as Map;
22+
if (data['type'] == 'theme-mode-change') {
23+
final themeMode = data['themeMode'] as String?;
24+
if (themeMode == 'dark') {
25+
themeModeProvider.themeMode = ThemeMode.dark;
26+
} else if (themeMode == 'light') {
27+
themeModeProvider.themeMode = ThemeMode.light;
28+
}
29+
}
30+
}
31+
});
32+
}
33+

0 commit comments

Comments
 (0)