diff --git a/packages/video_player/example/.flutter-plugins-dependencies b/packages/video_player/example/.flutter-plugins-dependencies new file mode 100644 index 000000000000..8a7aae9aa95f --- /dev/null +++ b/packages/video_player/example/.flutter-plugins-dependencies @@ -0,0 +1 @@ +{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"video_player","path":"/home/joe/Work/somus/plugins/packages/video_player/","dependencies":[]}],"android":[{"name":"video_player","path":"/home/joe/Work/somus/plugins/packages/video_player/","dependencies":[]}],"macos":[],"linux":[],"windows":[],"web":[]},"dependencyGraph":[{"name":"video_player","dependencies":[]}],"date_created":"2021-05-30 18:50:55.437501","version":"2.0.6"} \ No newline at end of file diff --git a/packages/video_player/example/lib/main.dart b/packages/video_player/example/lib/main.dart index dea1086593df..73075849f09b 100644 --- a/packages/video_player/example/lib/main.dart +++ b/packages/video_player/example/lib/main.dart @@ -34,7 +34,7 @@ class _VideoPlayPauseState extends State { FadeAnimation imageFadeAnim = FadeAnimation(child: const Icon(Icons.play_arrow, size: 100.0)); - VoidCallback listener; + late VoidCallback listener; VideoPlayerController get controller => widget.controller; @@ -98,7 +98,7 @@ class FadeAnimation extends StatefulWidget { FadeAnimation( {this.child, this.duration = const Duration(milliseconds: 500)}); - final Widget child; + final Widget? child; final Duration duration; @override @@ -107,7 +107,7 @@ class FadeAnimation extends StatefulWidget { class _FadeAnimationState extends State with SingleTickerProviderStateMixin { - AnimationController animationController; + late AnimationController animationController; @override void initState() { @@ -184,7 +184,7 @@ class AssetPlayerLifeCycle extends PlayerLifeCycle { } abstract class _PlayerLifeCycleState extends State { - VideoPlayerController controller; + late VideoPlayerController controller; @override @@ -246,26 +246,6 @@ Widget buildCard(String title) { leading: const Icon(Icons.airline_seat_flat_angled), title: Text(title), ), - // TODO(jackson): Remove when deprecation is on stable branch - // ignore: deprecated_member_use - ButtonTheme.bar( - child: ButtonBar( - children: [ - FlatButton( - child: const Text('BUY TICKETS'), - onPressed: () { - /* ... */ - }, - ), - FlatButton( - child: const Text('SELL TICKETS'), - onPressed: () { - /* ... */ - }, - ), - ], - ), - ), ], ), ); @@ -328,7 +308,7 @@ class AspectRatioVideoState extends State { VideoPlayerController get controller => widget.controller; bool initialized = false; - VoidCallback listener; + late VoidCallback listener; @override void initState() { diff --git a/packages/video_player/example/pubspec.yaml b/packages/video_player/example/pubspec.yaml index da48f06f0796..6502d327a20b 100644 --- a/packages/video_player/example/pubspec.yaml +++ b/packages/video_player/example/pubspec.yaml @@ -17,3 +17,6 @@ flutter: assets: - assets/flutter-mark-square-64.png - assets/Butterfly-209.mp4 + +environment: + sdk: '>=2.12.0 <3.0.0' diff --git a/packages/video_player/lib/video_player.dart b/packages/video_player/lib/video_player.dart index 4eed241b1106..935a4bcb6b77 100644 --- a/packages/video_player/lib/video_player.dart +++ b/packages/video_player/lib/video_player.dart @@ -60,7 +60,7 @@ class VideoPlayerValue { /// The total duration of the video. /// /// Is null when [initialized] is false. - final Duration duration; + final Duration? duration; /// The start position when clipped. /// @@ -93,12 +93,12 @@ class VideoPlayerValue { /// A description of the error if present. /// /// If [hasError] is false this is [null]. - final String errorDescription; + final String? errorDescription; /// The [size] of the currently loaded video. /// /// Is null when [initialized] is false. - final Size size; + final Size? size; ///The Current speed of the playback. final double speed; @@ -107,21 +107,21 @@ class VideoPlayerValue { bool get hasError => errorDescription != null; - double get aspectRatio => size != null ? size.width / size.height : 1.0; + double get aspectRatio => size != null ? size!.width / size!.height : 1.0; VideoPlayerValue copyWith({ - Duration duration, - Size size, - Duration position, - Duration startPosition, - Duration endPosition, - List buffered, - bool isPlaying, - bool isLooping, - bool isBuffering, - double volume, - String errorDescription, - double speed, + Duration? duration, + Size? size, + Duration? position, + Duration? startPosition, + Duration? endPosition, + List? buffered, + bool? isPlaying, + bool? isLooping, + bool? isBuffering, + double? volume, + String? errorDescription, + double? speed, }) { return VideoPlayerValue( duration: duration ?? this.duration, @@ -214,20 +214,20 @@ class VideoPlayerController extends ValueNotifier { formatHint = null, super(VideoPlayerValue(duration: null)); - int _textureId; - final String dataSource; - final VideoFormat formatHint; + late int _textureId; + final String? dataSource; + final VideoFormat? formatHint; /// Describes the type of data source this [VideoPlayerController] /// is constructed with. final DataSourceType dataSourceType; - final String package; - Timer _timer; + final String? package; + Timer? _timer; bool _isDisposed = false; - Completer _creatingCompleter; - StreamSubscription _eventSubscription; - _VideoAppLifeCycleObserver _lifeCycleObserver; + Completer? _creatingCompleter; + StreamSubscription? _eventSubscription; + late _VideoAppLifeCycleObserver _lifeCycleObserver; @visibleForTesting int get textureId => _textureId; @@ -256,13 +256,13 @@ class VideoPlayerController extends ValueNotifier { dataSourceDescription = {'uri': dataSource}; break; } - final Map response = + final Map? response = await _channel.invokeMapMethod( 'create', dataSourceDescription, ); - _textureId = response['textureId']; - _creatingCompleter.complete(null); + _textureId = response!['textureId']; + _creatingCompleter!.complete(null); final Completer initializingCompleter = Completer(); DurationRange toDurationRange(dynamic value) { @@ -313,8 +313,9 @@ class VideoPlayerController extends ValueNotifier { } void errorListener(Object obj) { - final PlatformException e = obj; - value = VideoPlayerValue.erroneous(e.message); + // ignore: avoid_as + final PlatformException e = obj as PlatformException; + value = VideoPlayerValue.erroneous(e.message!); _timer?.cancel(); } @@ -331,7 +332,7 @@ class VideoPlayerController extends ValueNotifier { @override Future dispose() async { if (_creatingCompleter != null) { - await _creatingCompleter.future; + await _creatingCompleter!.future; if (!_isDisposed) { _isDisposed = true; _timer?.cancel(); @@ -387,7 +388,7 @@ class VideoPlayerController extends ValueNotifier { if (_isDisposed) { return; } - final Duration newPosition = await position; + final Duration? newPosition = await position; if (_isDisposed) { return; } @@ -417,15 +418,15 @@ class VideoPlayerController extends ValueNotifier { } /// The position in the current video. - Future get position async { + Future get position async { if (_isDisposed) { return null; } return Duration( - milliseconds: await _channel.invokeMethod( + milliseconds: (await _channel.invokeMethod( 'position', {'textureId': _textureId}, - ), + ))!, ); } @@ -524,7 +525,7 @@ class _VideoAppLifeCycleObserver extends Object with WidgetsBindingObserver { final VideoPlayerController _controller; void initialize() { - WidgetsBinding.instance.addObserver(this); + WidgetsBinding.instance?.addObserver(this); } @override @@ -544,7 +545,7 @@ class _VideoAppLifeCycleObserver extends Object with WidgetsBindingObserver { } void dispose() { - WidgetsBinding.instance.removeObserver(this); + WidgetsBinding.instance?.removeObserver(this); } } @@ -570,8 +571,8 @@ class _VideoPlayerState extends State { }; } - VoidCallback _listener; - int _textureId; + late VoidCallback _listener; + late int _textureId; @override void initState() { @@ -585,7 +586,7 @@ class _VideoPlayerState extends State { @override void didUpdateWidget(VideoPlayer oldWidget) { super.didUpdateWidget(oldWidget); - if (!oldWidget.controller._isDisposed) { + if (!oldWidget.controller.isDisposed) { oldWidget.controller.removeListener(_listener); } _textureId = widget.controller.textureId; @@ -595,7 +596,7 @@ class _VideoPlayerState extends State { @override void deactivate() { super.deactivate(); - if (!widget.controller._isDisposed) { + if (!widget.controller.isDisposed) { widget.controller.removeListener(_listener); } } @@ -620,8 +621,8 @@ class VideoProgressColors { class _VideoScrubber extends StatefulWidget { _VideoScrubber({ - @required this.child, - @required this.controller, + required this.child, + required this.controller, }); final Widget child; @@ -639,10 +640,11 @@ class _VideoScrubberState extends State<_VideoScrubber> { @override Widget build(BuildContext context) { void seekToRelativePosition(Offset globalPosition) { - final RenderBox box = context.findRenderObject(); - final Offset tapPos = box.globalToLocal(globalPosition); + // ignore: avoid_as + final RenderBox? box = context.findRenderObject() as RenderBox; + final Offset tapPos = box!.globalToLocal(globalPosition); final double relative = tapPos.dx / box.size.width; - final Duration position = controller.value.duration * relative; + final Duration position = controller.value.duration! * relative; controller.seekTo(position); } @@ -689,14 +691,14 @@ class _VideoScrubberState extends State<_VideoScrubber> { class VideoProgressIndicator extends StatefulWidget { VideoProgressIndicator( this.controller, { - VideoProgressColors colors, + VideoProgressColors? colors, this.allowScrubbing, this.padding = const EdgeInsets.only(top: 5.0), }) : colors = colors ?? VideoProgressColors(); final VideoPlayerController controller; final VideoProgressColors colors; - final bool allowScrubbing; + final bool? allowScrubbing; final EdgeInsets padding; @override @@ -713,7 +715,7 @@ class _VideoProgressIndicatorState extends State { }; } - VoidCallback listener; + late VoidCallback listener; VideoPlayerController get controller => widget.controller; @@ -735,7 +737,7 @@ class _VideoProgressIndicatorState extends State { Widget build(BuildContext context) { Widget progressIndicator; if (controller.value.initialized) { - final int duration = controller.value.duration.inMilliseconds; + final int duration = controller.value.duration!.inMilliseconds; final int position = controller.value.position.inMilliseconds; int maxBuffering = 0; @@ -772,7 +774,9 @@ class _VideoProgressIndicatorState extends State { padding: widget.padding, child: progressIndicator, ); - if (widget.allowScrubbing) { + + final bool allowScrubbing = widget.allowScrubbing ?? false; + if (allowScrubbing) { return _VideoScrubber( child: paddedProgressIndicator, controller: controller, diff --git a/packages/video_player/pubspec.yaml b/packages/video_player/pubspec.yaml index 5abebd4b1ef5..e7d8b925ed6e 100644 --- a/packages/video_player/pubspec.yaml +++ b/packages/video_player/pubspec.yaml @@ -2,7 +2,7 @@ name: video_player description: Flutter plugin for displaying inline video with other Flutter widgets on Android and iOS. author: Flutter Team -version: 0.11.0 +version: 0.12.0 homepage: https://github.com/flutter/plugins/tree/master/packages/video_player flutter: @@ -21,5 +21,5 @@ dev_dependencies: sdk: flutter environment: - sdk: ">=2.0.0-dev.28.0 <3.0.0" - flutter: ">=1.5.0 <2.0.0" + sdk: ">=2.10.0 <3.0.0" + flutter: ">=2.0.0 <3.0.0" diff --git a/packages/video_player/test/video_player_test.dart b/packages/video_player/test/video_player_test.dart index ea3361311006..2db32b8bd7ee 100644 --- a/packages/video_player/test/video_player_test.dart +++ b/packages/video_player/test/video_player_test.dart @@ -20,14 +20,14 @@ class FakeController extends ValueNotifier } @override - int textureId; + late int textureId; @override String get dataSource => ''; @override DataSourceType get dataSourceType => DataSourceType.file; @override - String get package => null; + String? get package => null; @override Future get position async => value.position; @@ -49,19 +49,25 @@ class FakeController extends ValueNotifier } @override - VideoFormat get formatHint => null; + VideoFormat? get formatHint => null; + + @override + Future clip(int startMs, int endMs) async {} + + @override + bool get isDisposed => false; } void main() { testWidgets('update texture', (WidgetTester tester) async { final FakeController controller = FakeController(); - await tester.pumpWidget(VideoPlayer(controller)); expect(find.byType(Texture), findsNothing); controller.textureId = 123; controller.value = controller.value.copyWith( duration: const Duration(milliseconds: 100), ); + await tester.pumpWidget(VideoPlayer(controller)); await tester.pump(); expect(find.byType(Texture), findsOneWidget); @@ -88,7 +94,7 @@ void main() { }); group('VideoPlayerController', () { - FakeVideoPlayerPlatform fakeVideoPlayerPlatform; + late FakeVideoPlayerPlatform fakeVideoPlayerPlatform; setUp(() { fakeVideoPlayerPlatform = FakeVideoPlayerPlatform(); @@ -144,6 +150,21 @@ void main() { }); }); }); + + testWidgets('default playback speed', (WidgetTester tester) async { + final FakeController controller = FakeController(); + controller.textureId = 101; + await tester.pumpWidget(VideoPlayer(controller)); + expect(controller.value.speed, 1.0); + }); + + testWidgets('Changed playback speed', (WidgetTester tester) async { + final FakeController controller = FakeController(); + controller.textureId = 101; + controller.setSpeed(1.5); + await tester.pumpWidget(VideoPlayer(controller)); + expect(controller.value.speed, 1.5); + }); } class FakeVideoPlayerPlatform { @@ -172,7 +193,6 @@ class FakeVideoPlayerPlatform { 'textureId': nextTextureId++, }; }); - break; case 'setLooping': break; case 'setVolume': @@ -193,16 +213,16 @@ class FakeVideoEventStream { 'flutter.io/videoPlayer/videoEvents$textureId', onListen); } - int textureId; - int width; - int height; - Duration duration; - FakeEventsChannel eventsChannel; + int? textureId; + int? width; + int? height; + Duration? duration; + late FakeEventsChannel eventsChannel; void onListen() { final Map initializedEvent = { 'event': 'initialized', - 'duration': duration.inMilliseconds, + 'duration': duration?.inMilliseconds, 'width': width, 'height': height, }; @@ -216,7 +236,7 @@ class FakeEventsChannel { eventsMethodChannel.setMockMethodCallHandler(onMethodCall); } - MethodChannel eventsMethodChannel; + late MethodChannel eventsMethodChannel; VoidCallback onListen; Future onMethodCall(MethodCall call) { @@ -229,24 +249,9 @@ class FakeEventsChannel { } void sendEvent(dynamic event) { - ServicesBinding.instance.defaultBinaryMessenger.handlePlatformMessage( + ServicesBinding.instance!.defaultBinaryMessenger.handlePlatformMessage( eventsMethodChannel.name, const StandardMethodCodec().encodeSuccessEnvelope(event), - (ByteData data) {}); + (ByteData? data) {}); } - - testWidgets('default playback speed', (WidgetTester tester) async { - final FakeController controller = FakeController(); - controller.textureId = 101; - await tester.pumpWidget(VideoPlayer(controller)); - expect(controller.value.speed, 1.0); - }); - - testWidgets('Changed playback speed', (WidgetTester tester) async { - final FakeController controller = FakeController(); - controller.textureId = 101; - controller.setSpeed(1.5); - await tester.pumpWidget(VideoPlayer(controller)); - expect(controller.value.speed, 1.5); - }); }