-
Notifications
You must be signed in to change notification settings - Fork 1
Description
import 'package:theoplayer/theoplayer.dart';
import 'package:flutter/material.dart';
class QualitySelector extends StatefulWidget {
final List tracks;
const QualitySelector({super.key, required this.tracks});
@OverRide
_QualitySelectorState createState() => _QualitySelectorState();
}
class _QualitySelectorState extends State {
VideoQuality? activeQuality;
@OverRide
void initState() {
super.initState();
// Initialize the active quality to the first quality in the first track
if (widget.tracks.isNotEmpty && widget.tracks.first.qualities.isNotEmpty) {
activeQuality = widget.tracks.first.activeQuality ?? widget.tracks.first.qualities.first;
print("Active Quality ${activeQuality?.bandwidth}");
}
}
void changeTargetQuality(VideoTrack videoTrack, VideoQuality targetQuality) {
// Use TheoPlayer's method to change the video quality
try {
videoTrack.targetQuality=targetQuality; // This is a TheoPlayer API call
print("Changed target quality to: ${targetQuality.width}x${targetQuality.height} (${targetQuality.bandwidth / 1000} kbps)");
} catch (e) {
print("Error changing quality: $e");
}
}
@OverRide
Widget build(BuildContext context) {
return ListView(
children: [
const Padding(
padding: EdgeInsets.all(8.0),
child: ListTile(
title: Text(
"Select Video Quality",
style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
),
),
),
// List for the qualities of the first track
ListView.builder(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
padding: EdgeInsets.zero,
itemCount: widget.tracks.first.qualities.length, // Display qualities of the first track
itemBuilder: (context, trackIndex) {
final videoQuality = widget.tracks.first.qualities[trackIndex];
return ListTile(
title: Text(
"${videoQuality.width}x${videoQuality.height}p (${videoQuality.bandwidth / 1000} kbps)",
),
trailing: Icon(
// Show checkmark icon if this quality is the active one
videoQuality.bandwidth == activeQuality?.bandwidth ? Icons.check : null,
),
onTap: () {
// Update the active quality
changeTargetQuality(widget.tracks.first, videoQuality); // Change target quality
Navigator.pop(context); // Close the modal
},
);
},
),
],
);
}
}
void showQualitySelector(BuildContext context, List tracks) {
showModalBottomSheet(
showDragHandle: true,
isDismissible: true,
context: context,
builder: (BuildContext context) {
return QualitySelector(tracks: tracks); // Use StatefulWidget here
},
);
}