Skip to content

Commit 889d65b

Browse files
committed
feat: refactor player handling in Home widget and update IrisPlayer to accept MediaPlayer directly
1 parent d40523a commit 889d65b

3 files changed

Lines changed: 62 additions & 22 deletions

File tree

lib/main.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import 'dart:io';
22
import 'package:app_links/app_links.dart';
33
import 'package:fvp/fvp.dart' as fvp;
44
import 'package:flutter/material.dart';
5-
import 'package:flutter/services.dart';
65
import 'package:flutter_hooks/flutter_hooks.dart';
76
import 'package:flutter_zustand/flutter_zustand.dart';
87
import 'package:iris/info.dart';

lib/pages/home/home.dart

Lines changed: 56 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'package:flutter_hooks/flutter_hooks.dart';
44
import 'package:flutter_zustand/flutter_zustand.dart';
55
import 'package:iris/hooks/use_fvp_player.dart';
66
import 'package:iris/hooks/use_media_kit_player.dart';
7+
import 'package:iris/models/player.dart';
78
import 'package:iris/models/store/app_state.dart';
89
import 'package:iris/pages/player/iris_player.dart';
910
import 'package:iris/store/use_app_store.dart';
@@ -16,28 +17,68 @@ class Home extends HookWidget {
1617
final playerBackend =
1718
useAppStore().select(context, (state) => state.playerBackend);
1819

19-
final player = () {
20-
switch (playerBackend) {
21-
case PlayerBackend.mediaKit:
22-
return IrisPlayer(
23-
key: const ValueKey('media-kit'),
24-
playerHooks: useMediaKitPlayer,
25-
);
26-
case PlayerBackend.fvp:
27-
return IrisPlayer(
28-
key: const ValueKey('fvp'),
29-
playerHooks: useFvpPlayer,
30-
);
31-
}
32-
}();
20+
final playerState = useState<MediaPlayer?>(null);
21+
22+
void handlePlayerCreated(MediaPlayer player) {
23+
WidgetsBinding.instance.addPostFrameCallback((_) {
24+
if (context.mounted) {
25+
playerState.value = player;
26+
}
27+
});
28+
}
29+
30+
final Widget playerHost;
31+
switch (playerBackend) {
32+
case PlayerBackend.mediaKit:
33+
playerHost = _MediaKitPlayerHost(onPlayerCreated: handlePlayerCreated);
34+
break;
35+
case PlayerBackend.fvp:
36+
playerHost = _FvpPlayerHost(onPlayerCreated: handlePlayerCreated);
37+
break;
38+
}
3339

3440
return AnnotatedRegion(
3541
value: const SystemUiOverlayStyle(
3642
statusBarIconBrightness: Brightness.light,
3743
statusBarColor: Colors.transparent,
3844
systemNavigationBarColor: Colors.transparent,
3945
),
40-
child: Scaffold(body: player),
46+
child: Scaffold(
47+
backgroundColor: Color(0xFF2f2f2f),
48+
body: Stack(
49+
children: [
50+
playerHost,
51+
if (playerState.value != null)
52+
IrisPlayer(player: playerState.value!)
53+
],
54+
),
55+
),
4156
);
4257
}
4358
}
59+
60+
class _MediaKitPlayerHost extends HookWidget {
61+
final ValueChanged<MediaPlayer> onPlayerCreated;
62+
63+
const _MediaKitPlayerHost({required this.onPlayerCreated});
64+
65+
@override
66+
Widget build(BuildContext context) {
67+
final player = useMediaKitPlayer(context);
68+
onPlayerCreated(player);
69+
return Container(); // Doesn't build any UI itself.
70+
}
71+
}
72+
73+
class _FvpPlayerHost extends HookWidget {
74+
final ValueChanged<MediaPlayer> onPlayerCreated;
75+
76+
const _FvpPlayerHost({required this.onPlayerCreated});
77+
78+
@override
79+
Widget build(BuildContext context) {
80+
final player = useFvpPlayer(context);
81+
onPlayerCreated(player);
82+
return Container(); // Doesn't build any UI itself.
83+
}
84+
}

lib/pages/player/iris_player.dart

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,12 @@ enum MediaType {
4848
}
4949

5050
class IrisPlayer extends HookWidget {
51-
const IrisPlayer({super.key, required this.playerHooks});
51+
const IrisPlayer({super.key, required this.player});
5252

53-
final MediaPlayer Function(BuildContext) playerHooks;
53+
final MediaPlayer player;
5454

5555
@override
5656
Widget build(BuildContext context) {
57-
final MediaPlayer player = playerHooks(context);
58-
5957
useAppLifecycle(player);
6058
useFullScreen(context);
6159
useOrientation(context, player);
@@ -796,13 +794,15 @@ class IrisPlayer extends HookWidget {
796794
child: SizedBox(
797795
width: player.width,
798796
height: player.height,
799-
child: VideoPlayer(player.controller),
797+
child: VideoPlayer(
798+
(player as FvpPlayer).controller),
800799
),
801800
)
802801
: player is MediaKitPlayer
803802
? Video(
804803
key: ValueKey(currentPlay?.file.uri),
805-
controller: player.controller,
804+
controller:
805+
(player as MediaKitPlayer).controller,
806806
controls: NoVideoControls,
807807
fit: fit == BoxFit.none
808808
? BoxFit.contain

0 commit comments

Comments
 (0)