PostsView.dart
unknown
dart
3 years ago
72 kB
4
Indexable
import 'package:cached_network_image/cached_network_image.dart'; import 'package:carousel_slider/carousel_slider.dart'; import 'package:chewie/chewie.dart'; import 'package:dio/dio.dart'; import 'package:dots_indicator/dots_indicator.dart'; import 'package:fancy_shimmer_image/fancy_shimmer_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/services.dart'; import 'package:flutter_svg/svg.dart'; import 'package:get/get.dart'; import 'package:indexed_list_view/indexed_list_view.dart'; import 'package:lazy_loading_list/lazy_loading_list.dart'; import 'package:mobile/app/Dto/like_dto.dart'; import 'package:mobile/app/Dto/post_report_dto.dart'; import 'package:mobile/app/Dto/provider_comment_model.dart'; import 'package:mobile/app/Dto/provider_follow_dto.dart'; import 'package:mobile/app/Utilities/methods.dart'; import 'package:mobile/app/global_widgets/circular_block_button_widget.dart'; import 'package:mobile/app/global_widgets/favorite_button.dart'; import 'package:mobile/app/global_widgets/text_field_widget.dart'; import 'package:mobile/app/models/new/app_user_model.dart'; import 'package:mobile/app/models/one_signal_device.dart'; import 'package:mobile/app/models/responses/get_all_posts_response.dart'; import 'package:mobile/app/models/responses/get_all_provider_likes.dart'; import 'package:mobile/app/models/responses/get_all_provier_following.dart'; import 'package:mobile/app/models/responses/provider_posts_model.dart'; import 'package:mobile/app/modules/account/controllers/account_controller.dart'; import 'package:mobile/app/modules/account/controllers/posts_comments_controller.dart'; import 'package:mobile/app/modules/account/controllers/posts_likes_controller.dart'; import 'package:mobile/app/modules/account/widgets/post_comments.dart'; import 'package:mobile/app/modules/account/widgets/post_likes.dart'; // import 'package:mobile/app/modules/account/views/posts_view.dart'; import 'package:mobile/app/modules/account/views/comments_list.dart'; import 'package:mobile/app/modules/account/views/likes.dart'; import 'package:mobile/app/modules/root/controllers/root_controller.dart'; import 'package:mobile/app/modules/root/views/root_view.dart'; import 'package:mobile/app/other_provider_account/controller/other_provider_controller.dart'; import 'package:mobile/app/other_provider_account/views/another_provider_account_view.dart'; import 'package:mobile/app/providers/api_provider.dart'; import 'package:mobile/app/routes/app_pages.dart'; import 'package:mobile/app/services/auth_service.dart'; import 'package:onesignal_flutter/onesignal_flutter.dart'; import 'package:readmore/readmore.dart'; import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; import 'package:video_player/video_player.dart'; import 'package:mobile/common/ui.dart'; import 'package:visibility_detector/visibility_detector.dart'; import 'package:volume_watcher/volume_watcher.dart'; class PostsView extends GetView<AccountController>{ AppUser _currentUser = Get.find<AuthService>().appUser.value; Widget build (BuildContext context){ controller.itemScrollController = ItemScrollController(); return Scaffold( extendBodyBehindAppBar: false, body: Obx( () => controller.providerGridPosts.length <= 0 ? Center( child: CupertinoActivityIndicator( radius: 10, )) : Padding( padding: EdgeInsets.only(top: 25), child: Column( children: [ Expanded( flex: 1, child: Container( color: Get.theme.primaryColor, // margin: EdgeInsets.only(left: 8, right: 8, top: 35), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, children: [ IconButton( icon: new Icon(Icons.arrow_back_ios, color: Get.theme.hoverColor), onPressed: () { // controller.vController?.pause(); Get.back(); }, ), TextButton( onPressed: () async { controller.itemScrollController .scrollTo(index: 1, duration: Duration(milliseconds: 300)); }, child: Text( "Posts".tr, style: Get.theme.textTheme.headline5 .merge( TextStyle( color: context.theme.hoverColor, fontWeight: FontWeight.w600), ) .copyWith(fontSize: 21.0), ), ), IconButton( icon: _currentUser.id != null ? SvgPicture.asset( 'assets/svg/Icon-notifications.svg', ) : Icon( Icons.notifications_active, ), onPressed: () async { // await OneSignal.shared // .clearOneSignalNotifications(); Get.toNamed(Routes.NOTIFICATIONS); }, ), ], ), ), ), Expanded( flex: 9, child: Container( decoration: BoxDecoration(), child: IgnorePointer( ignoring: controller .commentsController.text.isNotEmpty, child: ScrollablePositionedList.builder( initialScrollIndex: Get.arguments, padding: EdgeInsets.zero, itemScrollController: controller.itemScrollController, // minCacheExtent: Get.height * 5, itemCount: controller.providerGridPosts .where( (p0) => p0.url != null, ) .length, // cacheExtent: Get.height, itemBuilder: (BuildContext context, int index) { if (index<0 || index >= controller.providerGridPosts.length) return null; else return listItem( controller.providerGridPosts .where((p0) => p0.url != null) .toList()[index], context); }, ), ), ), ), // Container( // height: controller.isLoading.value ? 50.0 : 0, // child: controller.isLoading.value ? Center( // child: CupertinoActivityIndicator( // radius: 8, // )):SizedBox() // ), ], ), ) )); } } Widget listItem(PostsItems e, BuildContext context) { AppUser _currentUser = Get.find<AuthService>().appUser.value; return PostItem( e: e, currentUser: _currentUser, rootController: Get.put(RootController()), accountController: Get.put(AccountController()), postLikesController: Get.put(PostsLikesController()), postCommentsController: Get.put(PostsCommentsController()), ); } class PostItem extends StatelessWidget { const PostItem({ Key key, @required AppUser currentUser, @required this.rootController, @required this.e, @required this.postLikesController, @required this.postCommentsController, this.accountController, }) : _currentUser = currentUser, super(key: key); final AccountController accountController; final PostsItems e; final RootController rootController; final PostsCommentsController postCommentsController; final PostsLikesController postLikesController; final AppUser _currentUser; @override Widget build(BuildContext context) { dynamic like = e.isLiked; RegExp regExp1 = new RegExp("[a-zA-Z]"); return e.url.isNotEmpty ? Container( color: Get.theme.primaryColor, width: Get.width, child: Column( children: [ Column( children: [ Container( decoration: BoxDecoration( color: Colors.white, ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ InkWell( onTap: () async { Get.back(); }, child: Container( margin: EdgeInsets.only(top: 10.0, bottom: 5.0), padding: EdgeInsets.all(5.0), child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: <Widget>[ Stack( children: [ e.providerProfileUrl != null ? ClipRRect( borderRadius: new BorderRadius.circular( 50.0), child: CircleAvatar( backgroundColor: Ui.parseColor( "#BEBEBE"), radius: 22, backgroundImage: CachedNetworkImageProvider( '${e.providerProfileUrl}', cacheKey: e.providerProfileUrl, ), ), ) : ClipRRect( borderRadius: new BorderRadius.circular( 50.0), child: Image.asset( 'assets/img/def_user.jpg', width: 60, height: 60, ), ), Positioned( top: e.providerProfileUrl == null ? 8 : 0, right: e.providerProfileUrl == null ? 8 : 0, child: InkWell( onTap: () {}, child: e.isLicenseActive == true ? CircleAvatar( backgroundColor: Get.theme.focusColor, radius: 8, child: Icon( Icons.check, size: 12, color: Get .theme.primaryColor, ), ) : SizedBox(), ), ), ], ), SizedBox( width: 5.0, ), Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: <Widget>[ Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ Text( e.providerName, textScaleFactor: 1.0, style: TextStyle( color: Colors.black, fontSize: 14.0, fontWeight: FontWeight.bold, ), ), SizedBox( height: 4, ), Directionality( textDirection: TextDirection.ltr, child: Text( "${e.providerUserName}", textScaleFactor: 1.0, style: TextStyle( color: Get.theme.hintColor, fontSize: 11.0, fontWeight: FontWeight.bold, ), ), ), ], ), ], ).marginOnly(top: 8, bottom: 8), ], ), ], ), ), ), IconButton( icon: SvgPicture.asset( 'assets/svg/options.svg', height: 20, ), onPressed: () { showModalBottomSheet( shape: RoundedRectangleBorder( borderRadius: BorderRadius.vertical( top: Radius.circular( 15)), ), context: context, builder: (context) { return Container( height: Get.height * 0.21, width: Get.width, decoration: BoxDecoration( borderRadius: BorderRadius.vertical( top: Radius .circular( 20))), child: Column( children: [ SvgPicture.asset( 'assets/svg/bottomSheetGrip.svg', height: 25, width: 50, color: Colors .grey[400], ).paddingOnly( bottom: 20), Column( children: [ InkWell( onTap: () async { Get.back(); showDialog( context: context, builder: (context) { TextEditingController newDescription = TextEditingController( text: accountController.postDescription == 'null' ? '' : accountController.postDescription, ); // TextEditingController()..text = "${controller.postDescription.toString().isEmpty ? ' ' : controller.postDescription.toString() }"; return new Scaffold( backgroundColor: Colors.transparent, body: Center( child: Container( decoration: BoxDecoration( color: Get.theme.primaryColor, borderRadius: BorderRadius.all( Radius.circular(25))), width: Get.width * 0.8, height: Get.height * 0.35, child: Padding( padding: const EdgeInsets.symmetric( vertical: 18.0), child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ Row( children: [ Expanded( child: Divider( color: Colors.grey, )), Text( "Edit my post".tr, style: Get.textTheme .headline5, ).paddingSymmetric( horizontal: 5), Expanded( child: Divider( color: Colors.grey, )), ], ), SizedBox( height: 15, ), TextFieldWidget( controller: newDescription, hintText: "enter new description" .tr, style: Get.textTheme.bodyText1, isFirst: true, ), SizedBox( height: 15, ), Row( mainAxisAlignment: MainAxisAlignment .spaceEvenly, crossAxisAlignment: CrossAxisAlignment .center, children: [ MaterialButton( color: Get .theme.focusColor, shape: RoundedRectangleBorder( borderRadius: BorderRadius .circular( 10)), onPressed: () { Get.back(); }, child: Text( "Cancel".tr, style: Get.textTheme .bodyText1 .copyWith( color: Get.theme .primaryColor, ), ), ), MaterialButton( color: Get .theme.focusColor, shape: RoundedRectangleBorder( borderRadius: BorderRadius .circular( 10)), onPressed: () async { ProviderPostsModel posts = ProviderPostsModel( providerId: _currentUser.id, description: newDescription .text, id: accountController .postId, IgnoreFile: true, ); await ApiProvider( httpClient: Dio()) .editProviderPosts( posts, null); // accountController.getAll(accountController.pageIndex.value); accountController.getAllGridPosts(); accountController.providerGridPosts.refresh(); // Get.to(RootView()); Get.back(); }, child: Text( "Save".tr, style: Get.textTheme .bodyText1 .copyWith( color: Get.theme .primaryColor, ), ), ), ], ), ], ), ), ), ), ); }, ); }, child: Container( width: Get.width, child: Text( "Edit post".tr, style: Get .textTheme .headline4 .copyWith( fontSize: 16, fontWeight: FontWeight.w600), ), ), ), Divider( color: Colors .black, ).paddingSymmetric( vertical: 5), InkWell( onTap: (){ ApiProvider(httpClient: Dio()) .deleteProviderPosts(accountController.postId); accountController.providerPosts.removeWhere( (element) => element.id == accountController.postId); ApiProvider(httpClient: Dio()) .deleteProviderPosts(accountController.postId); accountController.providerGridPosts.removeWhere( (element) => element.id == accountController.postId); accountController.changeAccountViewHeight(0); Get.back(); }, child: Container( width: Get.width, child: Text( "Delete post".tr, style: Get .textTheme .headline4 .copyWith( fontSize: 16, fontWeight: FontWeight.w600), ), ), ), ], ).paddingSymmetric( horizontal: 30) ], )); }); }, ) ], ), e.url.length <= 2 ? e.url.first.contains("mp4") || e.url.first.contains('MOV') || e.url.first.contains('m3u8') ? VideoWidget( url: e.url.first, ) : Column( mainAxisSize: MainAxisSize.min, children: [ CarouselSlider.builder( itemCount: e.url.length, itemBuilder: (context, index, realIndex) { return FancyShimmerImage( imageUrl: e.url[index], width: Get.width, boxFit: BoxFit.fitWidth ); }, options: CarouselOptions( viewportFraction: 1.0, enableInfiniteScroll: false, aspectRatio: 1 / 1, onPageChanged: (index, reason) { accountController.onPageChanged( index, reason, e.id); }, ), ), ], ) : CarouselSlider.builder( itemCount: e.url.length, itemBuilder: (context, index, realIndex) { return FancyShimmerImage( imageUrl: e.url[index], width: Get.width, boxFit: BoxFit.cover, ); }, options: CarouselOptions( viewportFraction: 1.0, enableInfiniteScroll: false, aspectRatio: 1 / 1, onPageChanged: (index, reason) { accountController.onPageChanged( index, reason, e.id); }), ), ], ), ), e.url.length >= 2 && !e.url.first.contains("mp4") && !e.url.first.contains('MOV') && !e.url.first.contains('m3u8') ? Row( mainAxisAlignment: MainAxisAlignment.center, children: [ DotsIndicator( dotsCount: e.url.length, position: e.index.toDouble(), decorator: DotsDecorator( color: Colors.grey[300], // Inactive color activeColor: Colors.grey[600], ), ), ], ).marginOnly(bottom: 10.0) : SizedBox(), SizedBox( height: 8, ), Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[ Icon( Icons.access_time, color: Colors.black.withOpacity(0.7), size: 15.0, ), SizedBox( width: 5.0, ), Text( AppMethodsAndUtilities() .getVerboseDateTimeRepresentation( e.createdDate), style: TextStyle( color: Colors.black.withOpacity(0.7), fontSize: 13), ), ]).paddingOnly(left: 6, right: 6), e.description != null ? Directionality( textDirection: TextDirection.ltr, child: Container( child: Row( mainAxisAlignment: e.description != null && !regExp1.hasMatch(e.description) ? MainAxisAlignment.end : MainAxisAlignment.start, children: [ Flexible( child: ReadMoreText( e.description, style: Get.textTheme.bodyText2.copyWith( fontWeight: FontWeight.w600, fontSize: 12, ), trimLines: 1, colorClickableText: Colors.black, trimMode: TrimMode.Line, textDirection: !regExp1.hasMatch(e.description) ? TextDirection.rtl : TextDirection.ltr, trimCollapsedText: 'more'.tr, trimExpandedText: 'less'.tr, lessStyle: TextStyle( color: Colors.grey[400], fontSize: 14, fontWeight: FontWeight.normal, ), moreStyle: TextStyle( color: Colors.grey[400], fontSize: 14, fontWeight: FontWeight.normal, ), ), ), ], )).paddingOnly( top: 10, left: 22, right: 22, bottom: 10), ) : SizedBox() ], ), // Don't Touch Pls... Container( margin: EdgeInsets.only(right: 5.0, left: 5.0), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Row( children: [ // love icon Row( mainAxisAlignment: MainAxisAlignment.center, children: [ FavoriteButton( iconDisabledColor: Colors.black87, isFavorite: like, iconSize: 35, valueChanged: (like) async { print('Is Favorite : $like'); if (!e.isLiked) { LikeDto likeDto = LikeDto( providerId: e.providerId, requesterId: _currentUser.id, isLike: true, postId: e.id, ); await ApiProvider(httpClient: Dio()) .providerAddLikes(likeDto) .then((value) { accountController.providerGridPosts .where( (element) => element.id == e.id) .first .likeCount++; }); accountController.isHeartAnimating.value = true; accountController.providerGridPosts.refresh(); accountController.likes.refresh(); e.isLiked = true; await ApiProvider(httpClient: Dio()) .getAllProviderLikes(e.id); } else { print('unlike'); await postLikesController .getAllProviderLikes(e.id); var likeId = postLikesController.likes.value .where((element) => element.requesterId == _currentUser.id) .last .id; await ApiProvider(httpClient: Dio()) .providerFeedDeleteLike(likeId) .then((value) { accountController.providerGridPosts .where( (element) => element.id == e.id) .first .likeCount--; }); accountController.isHeartAnimating.value = false; accountController.providerGridPosts.refresh(); postLikesController.likes.refresh(); e.isLiked = false; } }, ), SizedBox( width: 12.0, ), InkWell( child: Text( "${e.likeCount}", style: Get.textTheme.bodyText1 .copyWith(fontWeight: FontWeight.bold), ), onTap: () async { Get.lazyPut(() => PostsLikesController()); await postLikesController .getAllProviderLikes(e.id) .then((value) { Get.to( PostLikes(), ); }); }, ), ], ), SizedBox(width: 3.0), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ IconButton( icon: SvgPicture.asset( "assets/svg/instagram-comment.svg", width: 19, ), onPressed: () async { Get.lazyPut(() => PostsCommentsController()); await accountController .getAllComments(e.id) .then((value) { postCommentsController.setPostId(e.id); postCommentsController .setPostOwner(e.providerId); accountController.inFeed.value = false; Get.to( PostComments(), ).then( (value) => accountController.inFeed.value = true, ); }); }, ), Text( "${e.commentCount}", style: Get.textTheme.bodyText1 .copyWith(fontWeight: FontWeight.bold), ), ], ), ], ), e.postPrice != null ? Flexible( child: Ui.getPrice(e.postPrice) .paddingOnly(right: 20)) : SizedBox(), ], ), ), e.comments != null && e.comments.isNotEmpty ? Container( margin: EdgeInsets.only( left: 10, right: 10, ), child: Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ e.commentCount > 0 ? Container( margin: EdgeInsets.only(top: 10.0), child: InkWell( child: IgnorePointer( child: RichText( textAlign: TextAlign.start, overflow: TextOverflow.ellipsis, maxLines: 2, text: TextSpan( text: "See all ".tr, style: Get.textTheme.bodyText1 .copyWith( fontSize: 12, fontWeight: FontWeight.w500, color: Ui.parseColor("#949494"), ), children: <TextSpan>[ TextSpan( text: " (${e.commentCount}) ", style: Get.textTheme.bodyText1 .copyWith( fontSize: 12, fontWeight: FontWeight.w500, color: Ui.parseColor("#949494"), ), ), TextSpan( text: "comments".tr, style: Get.textTheme.bodyText1 .copyWith( fontSize: 12, fontWeight: FontWeight.w500, color: Ui.parseColor("#949494"), ), ), ], ), ), ), onTap: () async { Get.lazyPut( () => PostsCommentsController()); await postCommentsController .getAllComments(e.id) .then((value) { postCommentsController .setPostId(e.id); postCommentsController .setPostOwner(e.providerId); accountController.inFeed.value = false; Get.to( PostComments(), ).then( (value) => accountController .inFeed.value = true, ); }); }, ), ) : SizedBox(), ], ), ) : SizedBox(), SizedBox( height: 8, ), Container( margin: EdgeInsets.symmetric(horizontal: 10), decoration: BoxDecoration( borderRadius: BorderRadius.all( Radius.circular(30), ), ), height: Get.height * 0.06, width: Get.width, child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ InkWell( onTap: () async { accountController.commentsController.clear(); Get.log("trying to add comments on post "); Get.log('Current User=${_currentUser.name}'); showModalBottomSheet( backgroundColor: Get.theme.primaryColor, context: context, constraints: BoxConstraints( maxHeight: Get.height * 0.5, ), builder: (context) { return new Scaffold( body: Container( height: Get.height * 0.5, child: Row( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded( flex: 5, child: TextFormField( textAlign: TextAlign.start, autofocus: true, maxLines: 2, maxLength: 160, onEditingComplete: () {}, onFieldSubmitted: (value) async { // print("onFieldSubmitted"); ProviderCommentModel comments = ProviderCommentModel( providerId: e .providerId, // controller.postOwner, requesterId: _currentUser .id, //.appUser.value.id, comments: accountController .commentsController .text, postId: e.id // .postId ); await ApiProvider(httpClient: Dio()) .providerAddComments(comments) .then((value) { accountController.providerGridPosts .where((element) => element.id == comments.postId) .first .commentCount++; accountController.providerGridPosts.refresh(); }); Comments c = Comments( comments: accountController .commentsController.text, postId: e.id, providerId: e.providerId, requesterName: _currentUser.name, providerName: e.providerName); e.comments.add(c); accountController.commentsController .clear(); }, controller: accountController.commentsController, textInputAction: TextInputAction.done, cursorColor: Colors.black, keyboardType: TextInputType.multiline, style: TextStyle(color: Colors.black87), decoration: new InputDecoration( border: InputBorder.none, focusedBorder: InputBorder.none, enabledBorder: InputBorder.none, errorBorder: InputBorder.none, disabledBorder: InputBorder.none, contentPadding: EdgeInsets.only( left: 15, bottom: 4, top: 4, right: 15), hintText: "Add comment".tr, ), ), ), Expanded( child: TextButton( onPressed: () async { ProviderCommentModel comments = ProviderCommentModel( providerId: e .providerId, // controller.postOwner, requesterId: _currentUser .id, //.appUser.value.id, comments: accountController .commentsController .text, postId: e.id // .postId ); await ApiProvider(httpClient: Dio()) .providerAddComments(comments) .then((value) { accountController.providerGridPosts .where((element) => element.id == comments.postId) .first .commentCount++; accountController.providerGridPosts.refresh(); }); Comments c = Comments( comments: accountController .commentsController.text, postId: e.id, providerId: e.providerId, requesterName: _currentUser.name, providerName: e.providerName); e.comments.add(c); accountController.commentsController .clear(); Get.back(); }, child: Text( "Post".tr, style: Get.textTheme.bodyText2 .copyWith( color: Ui.parseColor("#4c68d7"), fontSize: 12, fontWeight: FontWeight.bold, ), ), ), ), ], ), ), ); }, ); }, child: Row( children: [ CircleAvatar( radius: 16, backgroundColor: Colors.grey[400], child: CircleAvatar( backgroundColor: Ui.parseColor("#BEBEBE"), radius: 16, backgroundImage: NetworkImage( '${_currentUser.profilePictureUrl}', ), ), ), SizedBox( width: 8, ), Text( "Add Comment...".tr, style: Get.textTheme.bodyText1.copyWith( color: Get.theme.hintColor, ), ), ], ), ), ], ), ), ], ), ) : SizedBox(); } } class PostVideoWidget extends StatefulWidget { const PostVideoWidget({Key key, this.videoUrl, this.autoPlay}) : super(key: key); final bool autoPlay; final String videoUrl; @override _PostVideoWidgetState createState() => _PostVideoWidgetState(); } class _PostVideoWidgetState extends State<PostVideoWidget> { VideoPlayerController _controller; @override void dispose() { super.dispose(); _controller?.dispose(); } @override void initState() { super.initState(); _controller = VideoPlayerController.network(widget.videoUrl) ..initialize().then((_) { _controller.setLooping(widget.autoPlay); Future.delayed( Duration( milliseconds: 500, ), () { if (widget.autoPlay) { _controller.play(); _controller.setVolume(0.0); } else { _controller.pause(); _controller.setVolume(0.0); } setState(() {}); }, ); }); } @override Widget build(BuildContext context) { return InkWell( onTap: () { if (_controller.value.volume == 0.0) { _controller.setVolume(1.0); } else { _controller.setVolume(0.0); } setState(() {}); }, child: _controller.value.isInitialized ? Center( child: Stack( children: [ AspectRatio( aspectRatio: 1, child: VideoPlayer(_controller), ), widget.autoPlay ? Container( margin: EdgeInsets.all(5.0), child: _controller.value.volume == 0.0 ? Icon( Icons.volume_off, color: Get.theme.primaryColor, size: 25, ) : Icon( Icons.volume_up, color: Get.theme.primaryColor, size: 25, ), ) : Icon( Icons.play_arrow, color: Get.theme.primaryColor, size: 25, ) ], ), ) : Container(), ); } } // Forbidden class VideoWidget extends StatefulWidget { const VideoWidget({ @required this.url, }); final String url; @override _VideoWidgetState createState() => _VideoWidgetState(); } class _VideoWidgetState extends State<VideoWidget> { double aRatio = 0.5; ChewieController chewieController; VideoPlayerController _controller; Future<void> _initializeVideoPlayerFuture; @override void dispose() { _controller?.dispose(); chewieController?.dispose(); super.dispose(); } @override void initState() { super.initState(); _controller = VideoPlayerController.network(widget.url); _initializeVideoPlayerFuture = _controller.initialize().then((_) { // Ensure the first frame is shown after the video is initialized, even before the play button has been pressed. setState( () { aRatio = _controller.value.aspectRatio < ((MediaQuery.of(context).size.width / MediaQuery.of(context).size.height) + 0.4) ? _controller.value.aspectRatio / 0.7 : _controller.value.aspectRatio; chewieController = ChewieController( cupertinoProgressColors: ChewieProgressColors( playedColor: Colors.transparent, bufferedColor: Colors.transparent, handleColor: Colors.transparent, ), materialProgressColors: ChewieProgressColors( playedColor: Colors.transparent, bufferedColor: Colors.transparent, handleColor: Colors.transparent, ), videoPlayerController: _controller, autoPlay: false, looping: false, autoInitialize: true, allowMuting: true, deviceOrientationsOnEnterFullScreen: [ DeviceOrientation.portraitUp, DeviceOrientation.landscapeLeft, DeviceOrientation.landscapeRight, ], deviceOrientationsAfterFullScreen: [DeviceOrientation.portraitUp], aspectRatio: aRatio, ); _controller.pause(); _controller.setLooping(false); }, ); }); } @override Widget build(BuildContext context) { return VisibilityDetector( key: ObjectKey(_controller), onVisibilityChanged: (visibility) { if (visibility.visibleFraction == 0 && this.mounted && !chewieController.isFullScreen) { _controller.pause(); } else if (chewieController.isFullScreen) { _controller.play(); } else { _controller.pause(); } }, child: FutureBuilder( future: _initializeVideoPlayerFuture, builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.done) { return _controller.value.isInitialized ? AspectRatio( aspectRatio: aRatio, child: Stack( children: [ VolumeWatcher( onVolumeChangeListener: (double volume) { chewieController.setVolume(volume); }, child: Chewie( controller: chewieController, ), ), Positioned.fill( child: GestureDetector( child: Container( color: Colors.transparent, ).marginSymmetric(vertical: 40), onTap: () { if (_controller.value.isPlaying) { _controller.pause(); } else { _controller.play(); } }, ), ), ], ), ) : Container(); } else { return Container( width: double.infinity, height: 400, color: Colors.black, child: Center( child: CircularProgressIndicator(), ), // child: FancyShimmerImage( // imageUrl: 'https://i.imgur.com/j57mwe4.jpg'), ); } }, ), ); } }
Editor is loading...