Skip to content

Commit cf22d4b

Browse files
committed
feat: full scrren state move to ui state
1 parent a519f8c commit cf22d4b

6 files changed

Lines changed: 66 additions & 52 deletions

File tree

lib/hooks/use_full_screen.dart

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:flutter_hooks/flutter_hooks.dart';
3+
import 'package:flutter_zustand/flutter_zustand.dart';
4+
import 'package:iris/store/use_ui_store.dart';
5+
import 'package:iris/utils/platform.dart';
6+
import 'package:window_manager/window_manager.dart';
7+
8+
void useFullScreen(BuildContext context) {
9+
final isFullScreen =
10+
useUiStore().select(context, (state) => state.isFullScreen);
11+
12+
useEffect(() {
13+
() async {
14+
if (isDesktop) {
15+
await windowManager.setFullScreen(isFullScreen);
16+
}
17+
}();
18+
return;
19+
}, [isFullScreen]);
20+
}

lib/models/store/ui_state.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ part 'ui_state.g.dart';
88
class UiState with _$UiState {
99
const factory UiState({
1010
@Default(false) bool isAlwaysOnTop,
11+
@Default(false) bool isFullScreen,
1112
}) = _UiState;
1213

1314
factory UiState.fromJson(Map<String, dynamic> json) =>

lib/pages/player/control_bar/control_bar.dart

Lines changed: 21 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:iris/globals.dart';
66
import 'package:iris/models/player.dart';
77
import 'package:iris/models/storages/local.dart';
88
import 'package:iris/models/store/app_state.dart';
9+
import 'package:iris/store/use_ui_store.dart';
910
import 'package:iris/widgets/dialogs/show_open_link_dialog.dart';
1011
import 'package:iris/widgets/dialogs/show_rate_dialog.dart';
1112
import 'package:iris/pages/player/control_bar/control_bar_slider.dart';
@@ -22,7 +23,6 @@ import 'package:iris/utils/platform.dart';
2223
import 'package:iris/utils/resize_window.dart';
2324
import 'package:iris/widgets/popup.dart';
2425
import 'package:iris/pages/storages/storages.dart';
25-
import 'package:window_manager/window_manager.dart';
2626

2727
class ControlBar extends HookWidget {
2828
const ControlBar({
@@ -47,6 +47,8 @@ class ControlBar extends HookWidget {
4747
final rate = useAppStore().select(context, (state) => state.rate);
4848
final volume = useAppStore().select(context, (state) => state.volume);
4949
final isMuted = useAppStore().select(context, (state) => state.isMuted);
50+
final isFullScreen =
51+
useUiStore().select(context, (state) => state.isFullScreen);
5052
final int playQueueLength =
5153
usePlayQueueStore().select(context, (state) => state.playQueue.length);
5254
final playQueue =
@@ -379,36 +381,25 @@ class ControlBar extends HookWidget {
379381
),
380382
Visibility(
381383
visible: isDesktop,
382-
child: FutureBuilder<bool>(
383-
future: () async {
384-
return (isDesktop && await windowManager.isFullScreen());
385-
}(),
386-
builder:
387-
(BuildContext context, AsyncSnapshot<bool> snapshot) {
388-
final isFullScreen = snapshot.data ?? false;
389-
return IconButton(
390-
tooltip: isFullScreen
391-
? '${t.exit_fullscreen} ( Escape, F11, Enter )'
392-
: '${t.enter_fullscreen} ( F11, Enter )',
393-
icon: Icon(
394-
isFullScreen
395-
? Icons.close_fullscreen_rounded
396-
: Icons.open_in_full_rounded,
397-
size: 19,
398-
color: color,
399-
),
400-
onPressed: () async {
401-
showControl();
402-
if (isFullScreen) {
403-
await windowManager.setFullScreen(false);
404-
await resizeWindow(player.aspect);
405-
} else {
406-
await windowManager.setFullScreen(true);
407-
}
408-
},
409-
style: ButtonStyle(overlayColor: overlayColor),
410-
);
384+
child: IconButton(
385+
tooltip: isFullScreen
386+
? '${t.exit_fullscreen} ( Escape, F11, Enter )'
387+
: '${t.enter_fullscreen} ( F11, Enter )',
388+
icon: Icon(
389+
isFullScreen
390+
? Icons.close_fullscreen_rounded
391+
: Icons.open_in_full_rounded,
392+
size: 19,
393+
color: color,
394+
),
395+
onPressed: () async {
396+
showControl();
397+
if (isFullScreen) {
398+
await resizeWindow(player.aspect);
399+
}
400+
useUiStore().updateFullScreen(!isFullScreen);
411401
},
402+
style: ButtonStyle(overlayColor: overlayColor),
412403
),
413404
),
414405
PopupMenuButton(

lib/pages/player/iris_player.dart

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import 'package:iris/globals.dart';
1010
import 'package:iris/hooks/use_app_lifecycle.dart';
1111
import 'package:iris/hooks/use_brightness.dart';
1212
import 'package:iris/hooks/use_cover.dart';
13+
import 'package:iris/hooks/use_full_screen.dart';
1314
import 'package:iris/hooks/use_orientation.dart';
1415
import 'package:iris/hooks/use_volume.dart';
1516
import 'package:iris/info.dart';
@@ -56,6 +57,7 @@ class IrisPlayer extends HookWidget {
5657
final MediaPlayer player = playerHooks(context);
5758

5859
useAppLifecycle(player);
60+
useFullScreen(context);
5961
useOrientation(context, player);
6062
final cover = useCover(context, player);
6163

@@ -84,6 +86,9 @@ class IrisPlayer extends HookWidget {
8486
final autoResize =
8587
useAppStore().select(context, (state) => state.autoResize);
8688

89+
final isFullScreen =
90+
useUiStore().select(context, (state) => state.isFullScreen);
91+
8792
final playQueue =
8893
usePlayQueueStore().select(context, (state) => state.playQueue);
8994
final currentIndex =
@@ -406,15 +411,15 @@ class IrisPlayer extends HookWidget {
406411
break;
407412
// 退出全屏
408413
case LogicalKeyboardKey.escape:
409-
if (await windowManager.isFullScreen()) {
410-
windowManager.setFullScreen(false);
414+
if (isDesktop && isFullScreen) {
415+
useUiStore().updateFullScreen(false);
411416
}
412417
break;
413418
// 全屏
414419
case LogicalKeyboardKey.enter:
415420
case LogicalKeyboardKey.f11:
416421
if (isDesktop) {
417-
windowManager.setFullScreen(!await windowManager.isFullScreen());
422+
useUiStore().updateFullScreen(!isFullScreen);
418423
}
419424
break;
420425
case LogicalKeyboardKey.tab:
@@ -611,12 +616,10 @@ class IrisPlayer extends HookWidget {
611616
}
612617
} else {
613618
if (isDesktop) {
614-
if (await windowManager.isFullScreen()) {
615-
await windowManager.setFullScreen(false);
619+
if (isFullScreen) {
616620
await resizeWindow(player.aspect);
617-
} else {
618-
await windowManager.setFullScreen(true);
619621
}
622+
useUiStore().updateFullScreen(!isFullScreen);
620623
}
621624
}
622625
},

lib/store/use_ui_store.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,13 @@ class UiStore extends Store<UiState> {
1212
set(state.copyWith(isAlwaysOnTop: !state.isAlwaysOnTop));
1313
}
1414
}
15+
16+
Future<void> updateFullScreen(bool bool) async {
17+
if (isDesktop) {
18+
windowManager.setFullScreen(!state.isFullScreen);
19+
set(state.copyWith(isFullScreen: !state.isFullScreen));
20+
}
21+
}
1522
}
1623

1724
UiStore useUiStore() => create(() => UiStore());

lib/widgets/title_bar.dart

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ class TitleBar extends HookWidget {
3030
final t = getLocalizations(context);
3131
final isAlwaysOnTop =
3232
useUiStore().select(context, (state) => state.isAlwaysOnTop);
33+
final isFullScreen =
34+
useUiStore().select(context, (state) => state.isFullScreen);
3335

3436
return Container(
3537
padding: isDesktop
@@ -69,26 +71,18 @@ class TitleBar extends HookWidget {
6971
children: [
7072
...actions ?? [],
7173
if (isDesktop) ...[
72-
FutureBuilder<Map<String, bool>>(
74+
FutureBuilder<bool>(
7375
future: () async {
74-
final isFullScreen =
75-
isDesktop && await windowManager.isFullScreen();
7676
final isMaximized =
7777
isDesktop && await windowManager.isMaximized();
7878

79-
return {
80-
'isFullScreen': isFullScreen,
81-
'isMaximized': isMaximized,
82-
};
79+
return isMaximized;
8380
}(),
8481
builder: (
8582
BuildContext context,
86-
AsyncSnapshot<Map<String, bool>> snapshot,
83+
AsyncSnapshot<bool> snapshot,
8784
) {
88-
final isFullScreen =
89-
snapshot.data?['isFullScreen'] ?? false;
90-
final isMaximized =
91-
snapshot.data?['isMaximized'] ?? false;
85+
final isMaximized = snapshot.data ?? false;
9286

9387
return Row(
9488
children: [
@@ -124,11 +118,9 @@ class TitleBar extends HookWidget {
124118
),
125119
onPressed: () async {
126120
if (isFullScreen) {
127-
await windowManager.setFullScreen(false);
128121
await resizeWindow(player.aspect);
129-
} else {
130-
await windowManager.setFullScreen(true);
131122
}
123+
useUiStore().updateFullScreen(!isFullScreen);
132124
},
133125
style: ButtonStyle(overlayColor: overlayColor),
134126
),

0 commit comments

Comments
 (0)