Skip to content

Commit 5d6e48c

Browse files
authored
[video_player] Add a Uri-typed factory method (#3513)
This PR improves VideoPlayerController network constructor with the datasource type. The solution follows the comments on the issue [#121927](flutter/flutter#121927). Fixes [#121927](flutter/flutter#121927)
1 parent a0ea9a3 commit 5d6e48c

File tree

15 files changed

+251
-106
lines changed

15 files changed

+251
-106
lines changed

packages/camera/camera/example/lib/main.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -994,6 +994,10 @@ class _CameraExampleHomeState extends State<CameraExampleHome>
994994
}
995995

996996
final VideoPlayerController vController = kIsWeb
997+
// TODO(gabrielokura): remove the ignore once the following line can migrate to
998+
// use VideoPlayerController.networkUrl after the issue is resolved.
999+
// https://github.com/flutter/flutter/issues/121927
1000+
// ignore: deprecated_member_use
9971001
? VideoPlayerController.network(videoFile!.path)
9981002
: VideoPlayerController.file(File(videoFile!.path));
9991003

packages/camera/camera_android/example/lib/main.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1002,6 +1002,10 @@ class _CameraExampleHomeState extends State<CameraExampleHome>
10021002
}
10031003

10041004
final VideoPlayerController vController = kIsWeb
1005+
// TODO(gabrielokura): remove the ignore once the following line can migrate to
1006+
// use VideoPlayerController.networkUrl after the issue is resolved.
1007+
// https://github.com/flutter/flutter/issues/121927
1008+
// ignore: deprecated_member_use
10051009
? VideoPlayerController.network(videoFile!.path)
10061010
: VideoPlayerController.file(File(videoFile!.path));
10071011

packages/camera/camera_android_camerax/example/lib/main.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -979,6 +979,10 @@ class _CameraExampleHomeState extends State<CameraExampleHome>
979979
}
980980

981981
final VideoPlayerController vController = kIsWeb
982+
// TODO(gabrielokura): remove the ignore once the following line can migrate to
983+
// use VideoPlayerController.networkUrl after the issue is resolved.
984+
// https://github.com/flutter/flutter/issues/121927
985+
// ignore: deprecated_member_use
982986
? VideoPlayerController.network(videoFile!.path)
983987
: VideoPlayerController.file(File(videoFile!.path));
984988

packages/camera/camera_avfoundation/example/lib/main.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1002,6 +1002,10 @@ class _CameraExampleHomeState extends State<CameraExampleHome>
10021002
}
10031003

10041004
final VideoPlayerController vController = kIsWeb
1005+
// TODO(gabrielokura): remove the ignore once the following line can migrate to
1006+
// use VideoPlayerController.networkUrl after the issue is resolved.
1007+
// https://github.com/flutter/flutter/issues/121927
1008+
// ignore: deprecated_member_use
10051009
? VideoPlayerController.network(videoFile!.path)
10061010
: VideoPlayerController.file(File(videoFile!.path));
10071011

packages/image_picker/image_picker/example/lib/main.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@ class _MyHomePageState extends State<MyHomePage> {
6262
await _disposeVideoController();
6363
late VideoPlayerController controller;
6464
if (kIsWeb) {
65+
// TODO(gabrielokura): remove the ignore once the following line can migrate to
66+
// use VideoPlayerController.networkUrl after the issue is resolved.
67+
// https://github.com/flutter/flutter/issues/121927
68+
// ignore: deprecated_member_use
6569
controller = VideoPlayerController.network(file.path);
6670
} else {
6771
controller = VideoPlayerController.file(File(file.path));

packages/video_player/video_player/AUTHORS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,6 @@ Anton Borries <[email protected]>
6565
6666
Rahul Raj <[email protected]>
6767
Koen Van Looveren <[email protected]>
68+
Gabriel Motelevicz Okura <[email protected]>
69+
Idowu Tomiwa <[email protected]>
6870
Márton Matuz <[email protected]>

packages/video_player/video_player/CHANGELOG.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
## NEXT
1+
## 2.7.0
22

3+
* Adds an `Uri` typed factory method `VideoPlayerController.networkUrl` to avoid common mistakes with `String` URIs. The method
4+
receives an`Uri` instead of a `String` url.
5+
* Deprecates `VideoPlayerController.network` factory method.
36
* Updates minimum supported SDK version to Flutter 3.3/Dart 2.18.
4-
57
## 2.6.1
68

79
* Synchronizes `VideoPlayerValue.isPlaying` with underlying video player.

packages/video_player/video_player/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ class _VideoAppState extends State<VideoApp> {
7373
@override
7474
void initState() {
7575
super.initState();
76-
_controller = VideoPlayerController.network(
77-
'https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4')
76+
_controller = VideoPlayerController.networkUrl(Uri.parse(
77+
'https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4'))
7878
..initialize().then((_) {
7979
// Ensure the first frame is shown after the video is initialized, even before the play button has been pressed.
8080
setState(() {});

packages/video_player/video_player/example/integration_test/video_player_test.dart

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,9 @@ void main() {
5757
'live stream duration != 0',
5858
(WidgetTester tester) async {
5959
final VideoPlayerController networkController =
60-
VideoPlayerController.network(
61-
'https://flutter.github.io/assets-for-api-docs/assets/videos/hls/bee.m3u8',
60+
VideoPlayerController.networkUrl(
61+
Uri.parse(
62+
'https://flutter.github.io/assets-for-api-docs/assets/videos/hls/bee.m3u8'),
6263
);
6364
await networkController.initialize();
6465

@@ -230,8 +231,8 @@ void main() {
230231

231232
group('network videos', () {
232233
setUp(() {
233-
controller = VideoPlayerController.network(
234-
getUrlForAssetAsNetworkSource(_videoAssetKey));
234+
controller = VideoPlayerController.networkUrl(
235+
Uri.parse(getUrlForAssetAsNetworkSource(_videoAssetKey)));
235236
});
236237

237238
testWidgets(

packages/video_player/video_player/example/lib/basic.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ class _VideoAppState extends State<VideoApp> {
2727
@override
2828
void initState() {
2929
super.initState();
30-
_controller = VideoPlayerController.network(
31-
'https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4')
30+
_controller = VideoPlayerController.networkUrl(Uri.parse(
31+
'https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4'))
3232
..initialize().then((_) {
3333
// Ensure the first frame is shown after the video is initialized, even before the play button has been pressed.
3434
setState(() {});

packages/video_player/video_player/example/lib/main.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,8 +217,9 @@ class _BumbleBeeRemoteVideoState extends State<_BumbleBeeRemoteVideo> {
217217
@override
218218
void initState() {
219219
super.initState();
220-
_controller = VideoPlayerController.network(
221-
'https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4',
220+
_controller = VideoPlayerController.networkUrl(
221+
Uri.parse(
222+
'https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4'),
222223
closedCaptionFile: _loadCaptions(),
223224
videoPlayerOptions: VideoPlayerOptions(mixWithOthers: true),
224225
);

packages/video_player/video_player/lib/video_player.dart

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -262,15 +262,16 @@ class VideoPlayerController extends ValueNotifier<VideoPlayerValue> {
262262
httpHeaders = const <String, String>{},
263263
super(const VideoPlayerValue(duration: Duration.zero));
264264

265-
/// Constructs a [VideoPlayerController] playing a video from obtained from
266-
/// the network.
265+
/// Constructs a [VideoPlayerController] playing a network video.
266+
///
267+
/// The URI for the video is given by the [dataSource] argument.
267268
///
268-
/// The URI for the video is given by the [dataSource] argument and must not be
269-
/// null.
270269
/// **Android only**: The [formatHint] option allows the caller to override
271270
/// the video format detection code.
272-
/// [httpHeaders] option allows to specify HTTP headers.
271+
///
272+
/// [httpHeaders] option allows to specify HTTP headers
273273
/// for the request to the [dataSource].
274+
@Deprecated('Use VideoPlayerController.networkUrl instead')
274275
VideoPlayerController.network(
275276
this.dataSource, {
276277
this.formatHint,
@@ -282,6 +283,27 @@ class VideoPlayerController extends ValueNotifier<VideoPlayerValue> {
282283
package = null,
283284
super(const VideoPlayerValue(duration: Duration.zero));
284285

286+
/// Constructs a [VideoPlayerController] playing a network video.
287+
///
288+
/// The URI for the video is given by the [dataSource] argument.
289+
///
290+
/// **Android only**: The [formatHint] option allows the caller to override
291+
/// the video format detection code.
292+
///
293+
/// [httpHeaders] option allows to specify HTTP headers
294+
/// for the request to the [dataSource].
295+
VideoPlayerController.networkUrl(
296+
Uri url, {
297+
this.formatHint,
298+
Future<ClosedCaptionFile>? closedCaptionFile,
299+
this.videoPlayerOptions,
300+
this.httpHeaders = const <String, String>{},
301+
}) : _closedCaptionFileFuture = closedCaptionFile,
302+
dataSource = url.toString(),
303+
dataSourceType = DataSourceType.network,
304+
package = null,
305+
super(const VideoPlayerValue(duration: Duration.zero));
306+
285307
/// Constructs a [VideoPlayerController] playing a video from a file.
286308
///
287309
/// This will load the file from a file:// URI constructed from [file]'s path.

packages/video_player/video_player/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ description: Flutter plugin for displaying inline video with other Flutter
33
widgets on Android, iOS, and web.
44
repository: https://github.com/flutter/packages/tree/main/packages/video_player/video_player
55
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+video_player%22
6-
version: 2.6.1
6+
version: 2.7.0
77

88
environment:
99
sdk: ">=2.18.0 <4.0.0"

packages/video_player/video_player/test/video_player_initialization_test.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ void main() {
1717
FakeVideoPlayerPlatform();
1818
VideoPlayerPlatform.instance = fakeVideoPlayerPlatform;
1919

20-
final VideoPlayerController controller = VideoPlayerController.network(
21-
'https://127.0.0.1',
20+
final VideoPlayerController controller = VideoPlayerController.networkUrl(
21+
Uri.parse('https://127.0.0.1'),
2222
);
2323
await controller.initialize();
2424
expect(fakeVideoPlayerPlatform.calls.first, 'init');

0 commit comments

Comments
 (0)