import 'package:flutter/cupertino.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_easyrefresh/easy_refresh.dart'; import 'package:ysairplane/tools/YSNetWorking.dart'; import 'package:ysairplane/tools/YSTools.dart'; import 'package:video_player/video_player.dart'; class YSSquareVideo extends StatefulWidget { final squareId,typeId; const YSSquareVideo({Key key, this.squareId, this.typeId}) : super(key: key); @override _YSSquareVideoState createState() => _YSSquareVideoState(); } class _YSSquareVideoState extends State { VideoPlayerController _controller; bool _isPlaying = false; Map _dict; int page = 1; List comments = []; var ysState; @override void initState() { Future.delayed(Duration(seconds: 0)).then((value){ _getSquareDetailData(); }); super.initState(); } @override void dispose() { _controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return CupertinoPageScaffold( child: SingleChildScrollView( child: Column( children: [ Container( height: MediaQuery.of(context).size.height-50, width: MediaQuery.of(context).size.width, color: Color(0xFF1D1D1D), child: SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( child: GestureDetector( child: Icon(Icons.arrow_back_ios,size: 20,color: Colors.white,), onTap: (){ Navigator.pop(context); }, ), margin: EdgeInsets.only(top: MediaQuery.of(context).padding.top+15,left: 15,bottom: 65), ), if (_controller==null) Container( height: 200, color: Colors.black12, ) else Container( height: 200, child: Stack( alignment: Alignment.bottomCenter, children: [ VideoPlayer(_controller), _PlayPauseOverlay(controller: _controller), Container( height:6.5, child: VideoProgressIndicator( _controller, allowScrubbing: true, colors: VideoProgressColors(playedColor: Color(0xFF1961E3),backgroundColor: Colors.white), ) ), ], ), ), _dict==null?Container():Container( margin: EdgeInsets.only(top: 50), height: 60, padding: EdgeInsets.only(left: 15,right: 15,top: 10,bottom: 10), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Container( height: 40, width: 40, decoration: BoxDecoration( borderRadius: BorderRadius.all(Radius.circular(20)), image: DecorationImage(image: NetworkImage('${_dict['user']['avatar']}'),fit: BoxFit.fill) ), margin: EdgeInsets.only(right: 6), ), Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ Container( width: MediaQuery.of(context).size.width-170, child: Text('${_dict['user']['nickname']}',style: TextStyle(fontSize: 14,color: Colors.white,decoration: TextDecoration.none),), ), Container( width: MediaQuery.of(context).size.width-170, child: Text('旅游达人',style: TextStyle(fontSize: 10,color: Colors.white,decoration: TextDecoration.none,fontWeight: FontWeight.normal),), ) ], ), Container( height: 30, width: 65, child: Image.asset('lib/images/look.png',color: Colors.white,), ), ], ), ), _dict==null?Container():Container( width: MediaQuery.of(context).size.width, padding: EdgeInsets.only(top: 15,left: 10,right: 10,bottom: 15), child: Text('${_dict['videoTitle']}',style: TextStyle(fontSize: 17,color: Colors.white,decoration: TextDecoration.none),), ), _dict==null?Container():Container( width: MediaQuery.of(context).size.width, height: 100, padding: EdgeInsets.only(left: 10,right: 10,bottom: 15), child: SingleChildScrollView( child: Text('${_dict['videoContent']}', style: TextStyle(fontSize: 14,color: Colors.white,decoration: TextDecoration.none,fontWeight: FontWeight.normal),), ), ), ], ), ), ), Container( height: 50, padding: EdgeInsets.only(left: 15,right: 15), color: Color(0xFF000000), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Container( width: MediaQuery.of(context).size.width-120, padding: EdgeInsets.only(left: 15,right: 15), height: 30, decoration: BoxDecoration( color: Color(0xFF3B3B3B), borderRadius: BorderRadius.all(Radius.circular(15)) ), child: Row( children: [ GestureDetector( onTap: (){ _createCommentView(); }, child: Container( width: MediaQuery.of(context).size.width-175, child: Text('我来说两句',style: TextStyle(fontSize: 14,color: Color(0xFF9A9A9A),decoration: TextDecoration.none,fontWeight: FontWeight.normal),), ), ), Icon(Icons.tag_faces,size: 25,color: Color(0xFFA1A1A2),), ], ), ), GestureDetector( onTap: (){ _postAgreementData(1); }, child: Container( height: 20, width: 20, child: Image.asset(_dict==null?'lib/images/love.png':_dict['likeStatus']==1?'lib/images/love2.png':'lib/images/love.png',color: Colors.white,), ), ), GestureDetector( child: Icon(_dict==null?Icons.star_border:_dict['collectStatus']==1?Icons.star:Icons.star_border,size: 20,color: Colors.white,), onTap: (){ _postAgreementData(0); }, ), Icon(Icons.share,size: 20,color: Colors.white,), ], ), ) ], ), ), ); } _createCommentView() async{ page = 1; Map dict = await ysRequestHttp(context,type: requestType.get,api: '/app/piazza/SquareCommunity/comment/list',parameter: {'pageNo':page,'pageSize':10,'id':widget.squareId,'type':widget.typeId}); if(dict!=null){ comments = dict['data']['resultList']; showModalBottomSheet( backgroundColor: Colors.transparent, isScrollControlled: true, context: context, builder: (context){ return StatefulBuilder( builder: (context,stateSub){ ysState = stateSub; return Container( height: MediaQuery.of(context).size.height*0.6, color: Color(0xFF2A2628), child: Column( children: [ Container( height: 40, padding: EdgeInsets.only(left: 15,right: 15), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Container(), Text('335210条评论',style: TextStyle(fontSize: 14,color: Colors.white,decoration: TextDecoration.none),), Icon(Icons.close,size: 20,color: Colors.white,) ], ), ), Container( height: MediaQuery.of(context).size.height*0.6-90, child: EasyRefresh( onRefresh: _refreshData, onLoad: _loadMore, header: MaterialHeader( ), footer: BezierBounceFooter( backgroundColor: Colors.transparent, color: Colors.transparent, ), child: ListView.separated( padding: EdgeInsets.only(top: 15), shrinkWrap: true, itemBuilder: (context,index){ return Container( child: Column( children: [ Container( padding: EdgeInsets.only(left: 10,right: 10,bottom: 10), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( height: 40, width: 40, decoration: BoxDecoration( borderRadius: BorderRadius.all(Radius.circular(20)), image: DecorationImage(image: NetworkImage('${comments[index]['avatar']}'),fit: BoxFit.fill) ), ), Container( margin: EdgeInsets.only(left: 10), width: MediaQuery.of(context).size.width-70, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ GestureDetector( child: Text('${comments[index]['nickname']}',style: TextStyle(fontSize: 14,color: Color(0xFF929293),decoration: TextDecoration.none,fontWeight: FontWeight.bold),), onTap: (){ _showInputView(type: 1,toUserid: int.parse('${comments[index]['fromUserId']}'), fatherCommentId: int.parse('${comments[index]['id']}'),fromUserId: int.parse('${comments[index]['fromUserId']}')); }, ), Text('${comments[index]['comment']}',style: TextStyle(fontSize: 15,color: Colors.white,decoration: TextDecoration.none,fontWeight: FontWeight.normal)), ], ), ) ], ), ), Container( child: ListView.separated( itemBuilder: (context,indexSub){ return Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( height: 20, width: 20, decoration: BoxDecoration( borderRadius: BorderRadius.all(Radius.circular(20)), image: DecorationImage(image: NetworkImage('${comments[index]['dtSquareCommentsList'][indexSub]['avatar']}'),fit: BoxFit.fill) ), ), Container( margin: EdgeInsets.only(left: 10), width: MediaQuery.of(context).size.width-130, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ GestureDetector( child: Text('${comments[index]['dtSquareCommentsList'][indexSub]['nickname']}', style: TextStyle(fontSize: 14,color: Color(0xFF929293),decoration: TextDecoration.none,fontWeight: FontWeight.bold),), onTap: (){ _showInputView(type: 1,toUserid: comments[index]['dtSquareCommentsList'][indexSub]['toUserId'], fatherCommentId: comments[index]['dtSquareCommentsList'][indexSub]['fatherCommentId'],fromUserId: comments[index]['dtSquareCommentsList'][indexSub]['fromUserId']); }, ), RichText( text: TextSpan( style: TextStyle(fontSize: 14,color: Colors.white,decoration: TextDecoration.none,fontWeight: FontWeight.normal), text: '回复', children: [ TextSpan( text: ' ${comments[index]['dtSquareCommentsList'][indexSub]['otherNickname']}:', style: TextStyle(color: Color(0xFF929293),fontWeight: FontWeight.bold), recognizer: TapGestureRecognizer()..onTap = (){ _showInputView(type: 1,toUserid: comments[index]['dtSquareCommentsList'][indexSub]['toUserId'], fatherCommentId: comments[index]['dtSquareCommentsList'][indexSub]['fatherCommentId'],fromUserId: comments[index]['dtSquareCommentsList'][indexSub]['fromUserId']); } ), TextSpan( text: '${comments[index]['dtSquareCommentsList'][indexSub]['comment']}', style: TextStyle(color: Colors.white) ), TextSpan( text: ' ${comments[index]['dtSquareCommentsList'][indexSub]['timeNode']}', style: TextStyle(color: Color(0xFF929293),fontSize: 12) ) ] ), ) ], ), ) ], ); }, separatorBuilder: (context,index){ return Container( height: 5, ); }, itemCount: (comments[index]['dtSquareCommentsList']).length, shrinkWrap: true, padding: EdgeInsets.only(left: 60,right: 40), physics: NeverScrollableScrollPhysics(), ), ) ], ), ); }, separatorBuilder: (context,index){ return Container( height: 5, ); }, itemCount: comments.length, ), ), ), Container( height: 50, padding: EdgeInsets.only(left: 15,right: 15), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ GestureDetector( child: Text('有爱评论,说点儿好听的~',style: TextStyle(fontSize: 15,color: Color(0xFF5A5A5A),decoration: TextDecoration.none,fontWeight: FontWeight.normal),), onTap: (){ _showInputView(type: 0); } ), Icon(Icons.tag_faces,size: 25,color: Color(0xFFA1A1A2),), ], ), ) ], ), ); }, ); } ); } } _showInputView({int type,int toUserid,int fatherCommentId,int fromUserId}){ TextEditingController _text = TextEditingController(); Navigator.push(context, PopRoute(child: BottomInputDialog( height: 140, inputView: Column( children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text('评论',style: TextStyle(fontSize: 15,color: Color(0xFF424242),decoration: TextDecoration.none,fontWeight: FontWeight.bold),), GestureDetector( child: Text('发布',style: TextStyle(fontSize: 15,color: Color(0xFF4187D9),decoration: TextDecoration.none,fontWeight: FontWeight.bold),), onTap: (){ if(type==0){ _postCommentData({'comment':_text.text,'squareId':widget.squareId,'fatherCommentId':0,'fromUserId':0}); }else{ _postCommentData({'comment':_text.text,'squareId':widget.squareId,'fatherCommentId':fatherCommentId,'toUserId':toUserid,'fromUserId':fromUserId}); } }, ), ], ), Container( height: 50, decoration: BoxDecoration( color: Color(0xFFF7F7F7), borderRadius: BorderRadius.all(Radius.circular(10)) ), margin: EdgeInsets.only(top: 10,bottom: 10), child: CupertinoTextField( placeholder: '友善发言,理性讨论,阳光你我', style: TextStyle(fontSize: 14,color: Color(0xFF999999),decoration: TextDecoration.none,fontWeight: FontWeight.normal), placeholderStyle: TextStyle(fontSize: 14,color: Color(0xFF999999),decoration: TextDecoration.none,fontWeight: FontWeight.normal), decoration: BoxDecoration(), maxLines: 50, autofocus: true, controller: _text, ), ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Container(), Icon(Icons.tag_faces,size: 25,color: Color(0xFF5C5C5C),), ], ) ], ), ))); } Future _refreshData() async{ page = 1; Map dict = await ysRequestHttp(context,type: requestType.get,api: '/app/piazza/SquareCommunity/comment/list',parameter: {'pageNo':page,'pageSize':10,'id':widget.squareId,'type':widget.typeId}); if(dict!=null){ ysState(() { comments = dict['data']['resultList']; }); } } Future _loadMore() async{ page++; Map dict = await ysRequestHttp(context,type: requestType.get,api: '/app/piazza/SquareCommunity/comment/list',parameter: {'pageNo':page,'pageSize':10,'id':widget.squareId,'type':widget.typeId}); if(dict!=null){ ysState(() { comments.addAll(dict['data']['resultList']); }); } } _postCommentData(Map parma) async{ Map dict = await ysRequestHttp(context,type: requestType.post,api: '/app/piazza/SquareCommunity/comment/add',parameter: parma,isLoading: false,isToken: true); if(dict!=null){ FocusScope.of(context).requestFocus(FocusNode()); _refreshData(); } } Future _getSquareDetailData() async{ Map dict = await ysRequestHttp(context,type: requestType.get,api: '/app/piazza/SquareCommunity/details',parameter: {'id':widget.squareId,'type':widget.typeId},isLoading: true,isToken: true,refresh: (){ _getSquareDetailData(); }); if(dict!=null){ _controller = VideoPlayerController.network('${dict['data']['videoPath']}') // 播放状态 ..addListener(() { final bool isPlaying = _controller.value.isPlaying; if (isPlaying != _isPlaying) { setState(() { _isPlaying = isPlaying; }); } }) // 在初始化完成后必须更新界面 ..initialize().then((_) { _controller.setLooping(true); _controller.play(); setState(() {}); }); setState(() { _dict = dict['data']; }); } } _postAgreementData(int type) async{ Map request = {'type':type}; request['topicId'] = widget.squareId; Map dict = await ysRequestHttp(context,type: requestType.post,api: '/app/piazza/SquareCommunity/likeAndCollect',parameter: request,isLoading: false,isToken: true,refresh: (){ }); if(dict!=null){ setState(() { if(type==1){ _dict['likeStatus'] = dict['data']; }else{ _dict['collectStatus'] = dict['data']; } }); } } } class _PlayPauseOverlay extends StatelessWidget { const _PlayPauseOverlay({Key key, this.controller}) : super(key: key); final VideoPlayerController controller; @override Widget build(BuildContext context) { return Stack( children: [ AnimatedSwitcher( duration: Duration(milliseconds: 50), reverseDuration: Duration(milliseconds: 200), child: controller.value.isPlaying? SizedBox.shrink():Container( color: Colors.black26, child: Center( child: Icon( Icons.play_circle_filled, color: Colors.white, size: 50, ), ), ), ), GestureDetector( onTap: () { controller.value.isPlaying ? controller.pause() : controller.play(); }, ), ], ); } }