Skip to content

Commit

Permalink
feat: add VideoPlayerWidget
Browse files Browse the repository at this point in the history
  • Loading branch information
adar2378 committed Jan 3, 2024
1 parent 28cf673 commit 0634504
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 22 deletions.
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
library djangoflow_video_player;

export 'src/video_player_widget_builder.dart';
export 'src/video_player_widget.dart';
Original file line number Diff line number Diff line change
Expand Up @@ -7,63 +7,89 @@ typedef VideoPlayerWidgetBuilderFunction = Widget Function(
bool isInitialized,
);

class VideoPlayerWidgetBuilder extends StatelessWidget {
typedef VideoPlayerErrorWidgetBuilder = Widget Function(
BuildContext context,
Object error,
);

class VideoPlayerWidgetBuilder extends StatefulWidget {
const VideoPlayerWidgetBuilder({
required this.builder,
super.key,
this.url,
this.errorBuilder,
this.onInitialize,
});
final String? url;
final VideoPlayerWidgetBuilderFunction builder;

@override
Widget build(BuildContext context) => _VideoPlayerWidgetInternal(
url: url,
builder: builder,
);
}

class _VideoPlayerWidgetInternal extends StatefulWidget {
const _VideoPlayerWidgetInternal({
required this.builder,
this.url,
});
final String? url;
final VideoPlayerWidgetBuilderFunction builder;
final VideoPlayerErrorWidgetBuilder? errorBuilder;
final Future Function(VideoPlayerController controller)? onInitialize;

@override
__VideoPlayerWidgetInternalState createState() =>
__VideoPlayerWidgetInternalState();
State<VideoPlayerWidgetBuilder> createState() =>
_VideoPlayerWidgetBuilderState();
}

class __VideoPlayerWidgetInternalState
extends State<_VideoPlayerWidgetInternal> {
class _VideoPlayerWidgetBuilderState extends State<VideoPlayerWidgetBuilder> {
VideoPlayerController? _controller;
bool _isInitialized = false;
Object? _error;

@override
void initState() {
super.initState();
_initializeAndListen();
}

Future<void> _initializeAndListen() async {
if (widget.url != null) {
final uri = Uri.tryParse(widget.url!);
if (uri != null) {
_controller = VideoPlayerController.networkUrl(uri)
..initialize().then((_) {
..initialize().then((_) async {
if (widget.onInitialize != null) {
await widget.onInitialize!(_controller!);
}
setState(() {
_isInitialized = true;
});
}).catchError((error) {
setState(() {
_error = error;
});
debugPrint('Error initializing video player: $error');
});

_controller?.addListener(_listener);
}
}
}

void _listener() {
setState(() {});
}

@override
void dispose() {
_controller?.removeListener(_listener);
_controller?.dispose();
super.dispose();
}

@override
Widget build(BuildContext context) =>
widget.builder(context, _controller, _isInitialized);
Widget build(BuildContext context) {
if (_error != null) {
if (widget.errorBuilder != null) {
return widget.errorBuilder!(context, _error!);
} else {
return const Center(
child: Icon(
Icons.error,
),
);
}
}
return widget.builder(context, _controller, _isInitialized);
}
}
1 change: 1 addition & 0 deletions packages/djangoflow_video_player/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ environment:
flutter: ">=1.17.0"

dependencies:
cached_network_image: ^3.3.1
flutter:
sdk: flutter
video_player: ^2.8.1
Expand Down

0 comments on commit 0634504

Please sign in to comment.