Экран списка видео
Код: Выделить всё
class VideoListScreen extends GetWidget {
final VideoListController vidListController = Get.put(VideoListController());
@override
Widget build(BuildContext context) {
return SafeArea(
child: GetBuilder(
builder: (VideoListController rtc) {
return Scaffold(
body: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(height: 20.h),
Container(
margin: EdgeInsets.symmetric(horizontal: 15.h),
height: 30.h,
child: ListView.separated(
padding: EdgeInsets.zero,
shrinkWrap: true,
scrollDirection: Axis.horizontal,
separatorBuilder: (context, index) => SizedBox(width: 15.w),
itemCount: rtc.authorName.length,
itemBuilder: (context, index) {
final String feeling = rtc.authorName[index];
return GestureDetector(
onTap: () => rtc.toggleAuthorSelection(feeling),
child: _buildTabRow(
feeling: feeling,
isSelected: rtc.isAuthorSelected(feeling),
),
);
},
),
),
SizedBox(height: 5.h),
Expanded(
child: ListView.builder(
padding: EdgeInsets.symmetric(
horizontal: 12.h, vertical: 10.h),
itemCount: rtc.displayedVideos.length,
itemBuilder: (context, index) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
margin: EdgeInsets.all(2),
child: ClipRRect(
borderRadius: BorderRadius.circular(10),
child: FlickMultiPlayer(
url: vidListController
.displayedVideos[index].videoUrl,
flickMultiManager: vidListController
.flickMultiManager,
),
),
),
SizedBox(height: 10.h),
Padding(
padding: EdgeInsets.only(left: 4.h),
child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
mainAxisAlignment:
MainAxisAlignment.start,
children: [
Text(
rtc.displayedVideos[index].title,
style: CustomTextStyles
.bodyLargeGray5000122,
),
],
),
),
SizedBox(height: 15.h),
],
);
},
),
),
Visibility(
visible: rtc.displayedVideos.length == 0,
child: Container(
height: MediaQuery.of(context).size.height / 1.5,
child: Center(
child: Text(
"No Data Found",
style: CustomTextStyles.titleLargeBluegray80024,
),
),
),
)
],
),
);
},
),
);
}
Widget _buildTabRow({
required String feeling,
required bool isSelected,
}) {
return Container(
padding: EdgeInsets.symmetric(horizontal: 5.h, vertical: 8.h),
decoration: AppDecoration.outlineBlueGray.copyWith(
borderRadius: BorderRadiusStyle.circleBorder30,
color: isSelected ? appTheme.pink50 : Colors.transparent,
),
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 15.h),
child: Text(
feeling.tr,
style: theme.textTheme.titleLarge!.copyWith(
color: appTheme.blueGray90001,
fontSize: 12.fSize,
fontWeight: isSelected ? FontWeight.w600 : FontWeight.w400,
),
),
),
);
}
}
Код: Выделить всё
import 'package:flick_video_player/flick_video_player.dart';
class FlickMultiManager {
List _flickManagers = [];
FlickManager? _activeManager;
bool _isMute = false;
List get flickManagers => _flickManagers;
init(FlickManager flickManager) {
_flickManagers.add(flickManager);
if (_isMute) {
flickManager.flickControlManager?.mute();
} else {
flickManager.flickControlManager?.unmute();
}
if (_flickManagers.length == 1) {
play(flickManager);
}
}
remove(FlickManager flickManager) {
if (_activeManager == flickManager) {
_activeManager = null;
}
flickManager.dispose();
_flickManagers.remove(flickManager);
}
togglePlay(FlickManager flickManager) {
if (_activeManager?.flickVideoManager?.isPlaying == true &&
flickManager == _activeManager) {
pause();
} else {
play(flickManager);
}
}
pause() {
_activeManager?.flickControlManager?.pause();
}
play([FlickManager? flickManager]) {
if (flickManager != null) {
_activeManager?.flickControlManager?.pause();
_activeManager = flickManager;
}
if (_isMute) {
_activeManager?.flickControlManager?.mute();
} else {
_activeManager?.flickControlManager?.unmute();
}
_activeManager?.flickControlManager?.play();
}
toggleMute() {
_activeManager?.flickControlManager?.toggleMute();
_isMute = _activeManager?.flickControlManager?.isMute ?? false;
if (_isMute) {
_flickManagers.forEach((manager) => manager.flickControlManager?.mute());
} else {
_flickManagers
.forEach((manager) => manager.flickControlManager?.unmute());
}
}
}
Код: Выделить всё
class FlickMultiPlayer extends StatefulWidget {
const FlickMultiPlayer(
{Key? key,
required this.url,
required this.flickMultiManager})
: super(key: key);
final String url;
final FlickMultiManager flickMultiManager;
@override
_FlickMultiPlayerState createState() => _FlickMultiPlayerState();
}
class _FlickMultiPlayerState extends State {
late FlickManager flickManager;
@override
void initState() {
flickManager = FlickManager(
videoPlayerController:
VideoPlayerController.networkUrl(Uri.parse(widget.url))
..setLooping(false),
autoPlay: false,
);
widget.flickMultiManager.init(flickManager);
super.initState();
}
void _initializeVideo() {
/*setState(() {
hasError = false;
});*/
}
@override
void dispose() {
widget.flickMultiManager.remove(flickManager);
//flickManager.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Container(
child: FlickVideoPlayer(
flickManager: flickManager,
flickVideoWithControls: FlickVideoWithControls(
controls: FlickPortraitControls(),
),
flickVideoWithControlsFullscreen: FlickVideoWithControls(
controls: FlickLandscapeControls(),
),
),
);
}
}
Заранее спасибо.
Подробнее здесь: https://stackoverflow.com/questions/793 ... cape-and-a