@@ -35,6 +35,8 @@ class _ImagePageBuilderState extends State<ImagePageBuilder> {
35
35
bool _isLocallyAvailable = false ;
36
36
VideoPlayerController ? _controller;
37
37
38
+ bool get _isOriginal => widget.previewThumbnailSize == null ;
39
+
38
40
bool get _isLivePhoto => widget.asset.isLivePhoto;
39
41
40
42
@override
@@ -44,12 +46,17 @@ class _ImagePageBuilderState extends State<ImagePageBuilder> {
44
46
}
45
47
46
48
Future <void > _initializeLivePhoto () async {
47
- final String ? url = await widget.asset.getMediaUrl ();
48
- if (! mounted || url == null ) {
49
+ final File ? file;
50
+ if (_isOriginal) {
51
+ file = await widget.asset.originFileWithSubtype;
52
+ } else {
53
+ file = await widget.asset.fileWithSubtype;
54
+ }
55
+ if (! mounted || file == null ) {
49
56
return ;
50
57
}
51
- final VideoPlayerController c = VideoPlayerController .network (
52
- url ,
58
+ final VideoPlayerController c = VideoPlayerController .file (
59
+ file ,
53
60
videoPlayerOptions: VideoPlayerOptions (mixWithOthers: true ),
54
61
);
55
62
setState (() => _controller = c);
@@ -80,7 +87,7 @@ class _ImagePageBuilderState extends State<ImagePageBuilder> {
80
87
return ExtendedImage (
81
88
image: AssetEntityImageProvider (
82
89
asset,
83
- isOriginal: widget.previewThumbnailSize == null ,
90
+ isOriginal: _isOriginal ,
84
91
thumbnailSize: widget.previewThumbnailSize,
85
92
),
86
93
fit: BoxFit .contain,
@@ -107,11 +114,49 @@ class _ImagePageBuilderState extends State<ImagePageBuilder> {
107
114
);
108
115
}
109
116
117
+ Widget _buildLivePhotosWrapper (BuildContext context, AssetEntity asset) {
118
+ return Stack (
119
+ children: < Widget > [
120
+ if (_controller? .value.isInitialized == true )
121
+ Center (
122
+ child: AspectRatio (
123
+ aspectRatio: _controller! .value.aspectRatio,
124
+ child: ValueListenableBuilder <VideoPlayerValue >(
125
+ valueListenable: _controller! ,
126
+ builder: (_, VideoPlayerValue value, Widget ? child) {
127
+ return Opacity (
128
+ opacity: value.isPlaying ? 1 : 0 ,
129
+ child: child,
130
+ );
131
+ },
132
+ child: VideoPlayer (_controller! ),
133
+ ),
134
+ ),
135
+ ),
136
+ if (_controller == null )
137
+ Positioned .fill (child: _imageBuilder (context, asset))
138
+ else
139
+ Positioned .fill (
140
+ child: ValueListenableBuilder <VideoPlayerValue >(
141
+ valueListenable: _controller! ,
142
+ builder: (_, VideoPlayerValue value, Widget ? child) {
143
+ return Opacity (
144
+ opacity: value.isPlaying ? 0 : 1 ,
145
+ child: child,
146
+ );
147
+ },
148
+ child: _imageBuilder (context, asset),
149
+ ),
150
+ ),
151
+ ],
152
+ );
153
+ }
154
+
110
155
@override
111
156
Widget build (BuildContext context) {
112
157
return LocallyAvailableBuilder (
113
158
asset: widget.asset,
114
- isOriginal: widget.previewThumbnailSize == null ,
159
+ isOriginal: _isOriginal ,
115
160
builder: (BuildContext context, AssetEntity asset) {
116
161
// Initialize the video controller when the asset is a Live photo
117
162
// and available for further use.
@@ -130,43 +175,7 @@ class _ImagePageBuilderState extends State<ImagePageBuilder> {
130
175
if (! _isLivePhoto) {
131
176
return _imageBuilder (context, asset);
132
177
}
133
- return Stack (
134
- children: < Widget > [
135
- if (_controller == null )
136
- _imageBuilder (context, asset)
137
- else ...< Widget > [
138
- if (_controller! .value.isInitialized)
139
- Center (
140
- child: AspectRatio (
141
- aspectRatio: _controller! .value.aspectRatio,
142
- child: ValueListenableBuilder <VideoPlayerValue >(
143
- valueListenable: _controller! ,
144
- builder:
145
- (_, VideoPlayerValue value, Widget ? child) {
146
- return Opacity (
147
- opacity: value.isPlaying ? 1 : 0 ,
148
- child: child,
149
- );
150
- },
151
- child: VideoPlayer (_controller! ),
152
- ),
153
- ),
154
- ),
155
- Positioned .fill (
156
- child: ValueListenableBuilder <VideoPlayerValue >(
157
- valueListenable: _controller! ,
158
- builder: (_, VideoPlayerValue value, Widget ? child) {
159
- return Opacity (
160
- opacity: value.isPlaying ? 0 : 1 ,
161
- child: child,
162
- );
163
- },
164
- child: _imageBuilder (context, asset),
165
- ),
166
- ),
167
- ],
168
- ],
169
- );
178
+ return _buildLivePhotosWrapper (context, asset);
170
179
},
171
180
),
172
181
);
0 commit comments