Anonymous
Проигрыватель Flickvideo щелкните в полноэкранном режиме, затем на 1 секунду установите альбомную ориентацию и снова уст
Сообщение
Anonymous » 24 дек 2024, 13:04
Я хочу показывать видео в виде списка. Я использую видеоплеер Flick. В этом плеере, когда я нажимаю на иконку полноэкранного видео, VideoView переключается в альбомный режим, но через 1 секунду снова переключается в портретный режим. Я удаляю всю ориентацию экрана, а также проверяю и добавляю все проблемы с ориентацией, которые все еще существуют. Ниже приведена проверка кода, и, пожалуйста, прокомментируйте свое решение, я применил все решения из чата GPT, у меня это не работает.
Экран списка видео
Код: Выделить всё
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());
}
}
}
Менеджер Flickmulti
Код: Выделить всё
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
1735034669
Anonymous
Я хочу показывать видео в виде списка. Я использую видеоплеер Flick. В этом плеере, когда я нажимаю на иконку полноэкранного видео, VideoView переключается в альбомный режим, но через 1 секунду снова переключается в портретный режим. Я удаляю всю ориентацию экрана, а также проверяю и добавляю все проблемы с ориентацией, которые все еще существуют. Ниже приведена проверка кода, и, пожалуйста, прокомментируйте свое решение, я применил все решения из чата GPT, у меня это не работает. [b]Экран списка видео[/b] [code] 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, ), ), ), ); } } [/code] [b]Мультименеджер пролистывания[/b] [code]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()); } } } [/code] [b]Менеджер Flickmulti[/b] [code]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(), ), ), ); } } [/code] Пожалуйста, дайте мне решение этой проблемы или дайте мне альтернативный способ достижения этой функциональности. Заранее спасибо. Подробнее здесь: [url]https://stackoverflow.com/questions/79305301/flickvideo-player-click-on-full-screen-then-for-1-second-its-set-landscape-and-a[/url]