@@ -34,7 +34,8 @@ class VideoPageBuilder extends StatefulWidget {
34
34
class _VideoPageBuilderState extends State <VideoPageBuilder > {
35
35
/// Controller for the video player.
36
36
/// 视频播放的控制器
37
- late final VideoPlayerController _controller;
37
+ VideoPlayerController get controller => _controller! ;
38
+ VideoPlayerController ? _controller;
38
39
39
40
/// Whether the controller has initialized.
40
41
/// 控制器是否已初始化
@@ -50,27 +51,27 @@ class _VideoPageBuilderState extends State<VideoPageBuilder> {
50
51
51
52
/// Whether the controller is playing.
52
53
/// 播放控制器是否在播放
53
- bool get isControllerPlaying => _controller.value.isPlaying;
54
+ bool get isControllerPlaying => _controller? .value.isPlaying ?? false ;
54
55
55
- @override
56
- void initState () {
57
- super .initState ();
58
- initializeVideoPlayerController ();
59
- }
56
+ bool _isInitializing = false ;
57
+ bool _isLocallyAvailable = false ;
60
58
61
59
@override
62
60
void dispose () {
63
61
/// Remove listener from the controller and dispose it when widget dispose.
64
62
/// 部件销毁时移除控制器的监听并销毁控制器。
65
- _controller.removeListener (videoPlayerListener);
66
- _controller.pause ();
67
- _controller.dispose ();
63
+ _controller
64
+ ? ..removeListener (videoPlayerListener)
65
+ ..pause ()
66
+ ..dispose ();
68
67
super .dispose ();
69
68
}
70
69
71
70
/// Get media url from the asset, then initialize the controller and add with a listener.
72
71
/// 从资源获取媒体url后初始化,并添加监听。
73
72
Future <void > initializeVideoPlayerController () async {
73
+ _isInitializing = true ;
74
+ _isLocallyAvailable = true ;
74
75
final String ? url = await widget.asset.getMediaUrl ();
75
76
if (url == null ) {
76
77
hasErrorWhenInitializing = true ;
@@ -81,13 +82,13 @@ class _VideoPageBuilderState extends State<VideoPageBuilder> {
81
82
}
82
83
_controller = VideoPlayerController .network (Uri .parse (url).toString ());
83
84
try {
84
- await _controller .initialize ();
85
+ await controller .initialize ();
85
86
hasLoaded = true ;
86
- _controller
87
+ controller
87
88
..addListener (videoPlayerListener)
88
89
..setLooping (widget.hasOnlyOneVideoAndMoment);
89
90
if (widget.hasOnlyOneVideoAndMoment) {
90
- _controller .play ();
91
+ controller .play ();
91
92
}
92
93
} catch (e) {
93
94
realDebugPrint ('Error when initialize video controller: $e ' );
@@ -115,19 +116,19 @@ class _VideoPageBuilderState extends State<VideoPageBuilder> {
115
116
/// 一般来说按钮只切换播放暂停。当视频播放结束时,点击按钮将从头开始播放。
116
117
Future <void > playButtonCallback () async {
117
118
if (isPlaying.value) {
118
- _controller.pause ();
119
- } else {
120
- if (widget.delegate.isDisplayingDetail.value) {
121
- widget.delegate.switchDisplayingDetail (value: false );
122
- }
123
- if (_controller.value.duration == _controller.value.position) {
124
- _controller
125
- ..seekTo (Duration .zero)
126
- ..play ();
127
- } else {
128
- _controller.play ();
129
- }
119
+ controller.pause ();
120
+ return ;
130
121
}
122
+ if (widget.delegate.isDisplayingDetail.value) {
123
+ widget.delegate.switchDisplayingDetail (value: false );
124
+ }
125
+ if (controller.value.duration == controller.value.position) {
126
+ controller
127
+ ..seekTo (Duration .zero)
128
+ ..play ();
129
+ return ;
130
+ }
131
+ controller.play ();
131
132
}
132
133
133
134
@override
@@ -138,6 +139,9 @@ class _VideoPageBuilderState extends State<VideoPageBuilder> {
138
139
if (hasErrorWhenInitializing) {
139
140
return Center (child: ScaleText (Constants .textDelegate.loadFailed));
140
141
}
142
+ if (! _isLocallyAvailable && ! _isInitializing) {
143
+ initializeVideoPlayerController ();
144
+ }
141
145
if (! hasLoaded) {
142
146
return const SizedBox .shrink ();
143
147
}
@@ -147,8 +151,8 @@ class _VideoPageBuilderState extends State<VideoPageBuilder> {
147
151
Positioned .fill (
148
152
child: Center (
149
153
child: AspectRatio (
150
- aspectRatio: _controller .value.aspectRatio,
151
- child: VideoPlayer (_controller ),
154
+ aspectRatio: controller .value.aspectRatio,
155
+ child: VideoPlayer (controller ),
152
156
),
153
157
),
154
158
),
0 commit comments