import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:url_launcher/url_launcher.dart'; import '../styles/colors.dart'; import 'dart:ui'; import '../plugins/ScreenStramPlugin.dart'; import '../net/HttpManager.dart'; import '../net/Result.dart'; import 'package:flutter_redux/flutter_redux.dart'; import '../redux/AppState.dart'; import '../model/HouseInfo.dart'; import '../styles/totast.dart'; import 'StartWindow.dart'; import '../model/PlayerInfo.dart'; import '../widget/VideoWidget.dart'; import 'dart:async'; import '../widget/Dialog.dart'; import 'CompetitionInformation.dart'; import 'SecondRoomInfo.dart'; import 'package:flutter/cupertino.dart'; import 'VideoPlayer.dart'; import '../model/UserInfo.dart'; class RoomInfo extends StatefulWidget { RoomInfo({Key key, this.roomId}) : super(key: key); final String roomId; // 用来储存传递过来的值 @override RoomInfoState createState() => RoomInfoState(); } class RoomInfoState extends State with SingleTickerProviderStateMixin { List tabList; TabController mController; Map roomInfo; HouseInfo houseInfo; Map colorInfo; bool isJoin = true; PlayerInfo playerInfo; bool isPop = false; bool showBack = false; Timer timer; List> roomTipsList = []; ScrollController _tipController; String _myUrl; int tabIndex = 0; UserInfo userInfo; int myRank = 0; //获取房间信息 Future getRoomInfo() async { Toast.show(context, '加载中', -1, 'loading'); Result res = await HttpManager.get('houseInfo/getOne', data: {'id': widget.roomId}); Toast.hide(); if (res.success) { setState(() { roomInfo = res.data; houseInfo = HouseInfo.fromJson(res.data); }); // showNotice(); if (houseInfo.statusFlag == 0) { showNotice(); } } else {} checkJoinInfo(); } //开始比赛 Future startGame() async { Toast.show(context, '加载中', -1, 'loading'); Result res = await HttpManager.post('houseInfo/handBegin', data: {'id': widget.roomId}); Toast.hide(); } //隔一秒检查是否开始 Future getNowStatus() async { Result res = await HttpManager.get('houseInfo/getPlayerNum', data: {'id': widget.roomId}); if (res.success) { if (houseInfo.statusFlag == 0 && res.data['statusFlag'] == 2) { showStart(); // timer.cancel(); } setState(() { houseInfo.playerNumber = res.data['playerNumber']; houseInfo.statusFlag = res.data['statusFlag']; houseInfo.bonus = res.data['bonus']; houseInfo.beginTime = res.data['beginTime']; }); } } //开始比赛确认按钮 Future showStart() async { if (!isJoin) { return; } bool result = await Navigator.of(context).push( PageRouteBuilder( opaque: false, transitionDuration: Duration(milliseconds: 300), transitionsBuilder: (BuildContext context, Animation animation, Animation secondaryAnimation, Widget child) { return FadeTransition( opacity: CurvedAnimation(parent: animation, curve: Curves.linear), child: child, ); }, pageBuilder: (BuildContext context, _, __) { return StartWindow(); }, ), ); Map data = {'id': playerInfo.id}; bool success = true; if (result) { success = await ScreenStreamPlugin.start(playerInfo.id.toString()); if (success) { data['statusFlag'] = 2; } else { data['statusFlag'] = 6; } } else { data['statusFlag'] = 6; } Toast.show(context, '加载中', -1, 'loading'); Result res = await HttpManager.post('playerInfo/update', data: data); Toast.hide(); // MyDialog.showDialog(context, '自动启动游戏失败,请手动切换到游戏app开始竞赛', submitText: '知道了'); // Timer(Duration(seconds: 10), () { // showSucessInfo(); // }); // return; if (res.success) { if (data['statusFlag'] == 2) { const url = 'pubgmhd1106467070://'; if (await canLaunch(url)) { Timer(Duration(seconds: 1), () async { await launch(url); showSucessInfo(); }); } else { MyDialog.showDialog(context, '自动启动游戏失败,请手动切换到游戏app开始竞赛', submitText: '知道了'); Timer(Duration(seconds: 10), () { showSucessInfo(); }); throw 'Could not launch $url'; } } else { showBackDialog(success ? 1 : 0); } } } //开始录屏提示框 void showSucessInfo() { MyDialog.showDialog(context, '您已经完成比赛了吗,确认完成,那就点击下方完成竞赛按钮,上传本次成绩,祝您赢取大奖', title: '完成比赛', submitText: '我已完成比赛', onsubmit: () async { HttpManager.post('playerInfo/update', data: {'id': playerInfo.id, 'statusFlag': 3}); bool success = await ScreenStreamPlugin.stop(); Timer(Duration(seconds: 1), () { getEndTips(); }); setState(() { playerInfo.statusFlag = 3; }); }); } Future getEndTips() async { Result res = await HttpManager.get('playerInfo/endNum', data: {'houseId': widget.roomId}); if (res.success) { int time = houseInfo.beginTime + 1 * 3600 * 1000 - DateTime.now().millisecondsSinceEpoch; var nowTime = (time ~/ 1000 ~/ 60) % 60; setState(() { roomTipsList.add([ '你已完成本次比赛,当前完成人数 ', res.data.toString(), '人,比赛需要等待所有人完成后方可结算奖励', '', ',你可以先去参加其他竞赛,稍后在“个人中心-我的战绩”中可以查看本次竞赛排名及领取奖励' ]); changeScroll(); }); } } //未确认比赛弹窗 void showBackDialog(type) { MyDialog.showDialog(context, (type == 1 ? '由于您未在十秒内点击开始按钮' : '由于您未授权录屏') + ',系统已经判定您放弃比赛,谢谢您的参与。', title: '很遗憾'); } //检查加入信息 Future checkJoinInfo() async { Result res = await HttpManager.get('playerInfo/getOne', data: { 'userId': StoreProvider.of(context).state.userInfo.id, 'houseId': widget.roomId }); if (res.success) { if (res.data == null) { setState(() { isJoin = false; }); if (houseInfo.statusFlag == 0) { if (houseInfo.scoreType == 0) { roomTipsList.add([ '上方奖金为当前本次竞赛的总奖金,根据当前人数的增加,奖金也就越多,竞赛的第一名获得${houseInfo.houseLevel.firstRatio}%,第二名获得${houseInfo.houseLevel.secondRatio}%,第三名获得${houseInfo.houseLevel.thirdRatio}%,其他名次算作失败没有奖励,祝你取得好成绩。注:奖金池的${houseInfo.houseLevel.feeRatio}%为平台方运营服务费, 奖金池的${houseInfo.houseLevel.poolRatio}%流入赛季总奖金。' ]); } else { roomTipsList.add([ '同房间内的玩家进行竞赛,所有吃上鸡的玩家均可获得奖金,即平分总奖金池的${houseInfo.houseLevel.avgRatio}%。注:奖金池的${houseInfo.houseLevel.feeRatio}%为平台方运营服务费, 奖金池的${houseInfo.houseLevel.poolRatio}%流入赛季总奖金。' ]); } changeScroll(); } } else { playerInfo = PlayerInfo.fromJson(res.data); if (houseInfo.statusFlag == 4) { _myUrl = await ScreenStreamPlugin.getVideo(playerInfo.id.toString()); print('本地视频' + playerInfo.id.toString()); print(_myUrl); Result rankRes = await HttpManager.get('playerInfo/userRank', data: {'id': playerInfo.id}); if (rankRes.success) { myRank = rankRes.data + 1; } } setState(() { isJoin = true; }); if (houseInfo.statusFlag == 0) { if (houseInfo.createUser == StoreProvider.of(context) .state .userInfo .id .toString()) { roomTipsList.add([ '房间创建成功,待人数满员时会自动开启比赛,请在此页面耐心等待其他人的加入,退出房间则视为自动放弃比赛,已支付金币概不退换,快快点击右上角分享给好友加入战局吧' ]); changeScroll(); } else { // roomTipsList.add([ // '请在此页面耐心等待,竞赛即将开始,届时玩家有10秒的时间进行确认,点击确认方可正式进入竞赛,若没有点击,则视为自动放弃此次竞赛,已支付金币概不退换' // ]); // changeScroll(); } // Timer(Duration(seconds: 1), () { // roomTipsList.add([ // '游戏开始后会有弹窗提示授权进行录屏的操作,', // '请一定点击“确定”或“允许”此操作', // ',系统会自动跳转打开游戏app,若长时间没有自动跳转,请手动打开游戏app进行比赛,在游戏比赛结束后,请', // '���定要点击查看游戏最后的��数名次结算页面', // ',返回游戏主页,最后再切换到我们竞赛app中,点击完成比赛,方可成功上传本次成绩。从游戏开始一小时之内必须返回全民App点击完成比赛,否则判定游戏失败,祝你取得好成绩。' // ]); // changeScroll(); // }); } else if (houseInfo.statusFlag != 4) { if (playerInfo.statusFlag == 3 || playerInfo.statusFlag == 8 || playerInfo.statusFlag == 9) { getEndTips(); } } } } if (isJoin && houseInfo.statusFlag != 4) { timer = Timer.periodic(Duration(seconds: 1), (timer) { getNowStatus(); }); } } //加入房间 Future joinRoom() async { Toast.show(context, '加载中', -1, 'loading'); Result res = await HttpManager.post('houseInfo/join', data: { 'houseId': widget.roomId, 'userId': StoreProvider.of(context).state.userInfo.id }); Toast.hide(); if (res.success) { Toast.show(context, '加入成功', 1500, 'success'); checkJoinInfo(); } else { Toast.show(context, res.error, 1500, 'info'); } } //展示通知 void showNotice() { Navigator.of(context).push(PageRouteBuilder( opaque: false, transitionDuration: Duration(milliseconds: 300), transitionsBuilder: (BuildContext context, Animation animation, Animation secondaryAnimation, Widget child) { return FadeTransition( opacity: CurvedAnimation(parent: animation, curve: Curves.linear), child: child, ); }, pageBuilder: (BuildContext context, _, __) { return CompetitionInformation(houseInfo); })); } //改变滚动条 void changeScroll() { Timer(Duration(seconds: 1), () { _tipController.animateTo(context.size.height, duration: Duration(milliseconds: 1500), curve: Curves.ease); }); } //获取分秒 String getSecondsMIn(int time) { if (time == null) { return ''; } else { return ((time ~/ 1000 ~/ 60) % 60).toString() + '分' + (time ~/ 1000 % 60).toString() + '秒'; } } @override void initState() { super.initState(); tabList = [ {'title': '房间信息', 'value': 1}, {'title': '人员列表', 'value': 2} ]; mController = TabController( length: tabList.length, vsync: this, ); mController.addListener(() { setState(() { tabIndex = mController.index; }); print(tabIndex); }); _tipController = ScrollController(); roomInfo = {}; colorInfo = { '黄金': Color(0xFFF9D881), '白银': Color(0xFFAFCAD8), '青铜': Color(0xFFE18D50), }; Future.delayed(Duration.zero, () { getRoomInfo(); userInfo = StoreProvider.of(context).state.userInfo; }); } @override void dispose() { super.dispose(); mController.dispose(); if (timer != null) { timer.cancel(); } } @override Widget build(BuildContext context) { ScreenUtil.instance = ScreenUtil(width: 375, height: 667)..init(context); int status = 0; if (houseInfo != null) { status = houseInfo.statusFlag; } return WillPopScope( child: Scaffold( appBar: AppBar( backgroundColor: PRIMARY_COLOR, title: Container( child: TabBar( controller: mController, labelColor: Colors.white, unselectedLabelColor: Colors.white.withOpacity(0.5), labelStyle: TextStyle(fontSize: 16.0), indicatorColor: Colors.white, indicatorWeight: 3, indicatorSize: TabBarIndicatorSize.label, tabs: tabList.map((item) { return Tab( text: item['title'], ); }).toList(), ), ), centerTitle: true, elevation: 0, actions: [ Container( padding: EdgeInsets.only(right: 30, left: 20), child: Image.asset( 'images/icon_fenxiang.png', width: 24, ), ) ], ), body: Container( color: BG_SUB_COLOR, child: TabBarView( controller: mController, children: [ _firstPage(), SecondPage(roomId: widget.roomId, status: status) ], )), floatingActionButton: _joinBtn(), floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, ), onWillPop: () { if (houseInfo == null || (houseInfo.statusFlag != 0) || !isJoin) { if (timer != null) { timer.cancel(); } isPop = true; Toast.hide(); Navigator.of(context).pop(); return Future.value(false); } else { Toast.show(context, '比赛即将开始,暂不能离开房间', 1500, 'info'); } return Future.value(false); }, ); } Widget _firstPage() { Map houseLevelInfo = roomInfo.isNotEmpty ? roomInfo['houseLevelInfo'] : {}; String levelName = houseLevelInfo.containsKey('levelName') ? houseLevelInfo['levelName'] : '黄金'; int joinMoney = houseLevelInfo.containsKey('feeRatio') && roomInfo.containsKey('bonus') ? houseLevelInfo['feeRatio'] * roomInfo['bonus'] : 0; String topImg = 'http://images.liqucn.com/img/h22/h70/img_localize_8e824debdd9ee29522690f36680e2d8e_600x337.png'; int statuFlag = 0; if (houseInfo != null) { if (houseInfo.video != null) { topImg = houseInfo.video; } if (houseInfo.statusFlag != null) { statuFlag = houseInfo.statusFlag; } } return LayoutBuilder( builder: (BuildContext context, BoxConstraints viewportConstraints) { return Container( child: RefreshIndicator( color: PRIMARY_COLOR, backgroundColor: Colors.white, displacement: 10, onRefresh: () async { await Future.delayed(const Duration(seconds: 1)); }, child: SingleChildScrollView( controller: _tipController, physics: AlwaysScrollableScrollPhysics(), child: Column( children: [ houseInfo != null ? VideoWidget(videoSrc: houseInfo.video) : Container(), // Image.network(topImg, width: double.infinity), Container( padding: EdgeInsets.only(top: 10), child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Container( margin: EdgeInsets.only(left: 30, right: 8), child: Text( roomInfo.containsKey('houseName') ? roomInfo['houseName'] : '', style: TextStyle( color: Colors.white, fontSize: 16, fontWeight: FontWeight.w500), ), ), Image.network( houseLevelInfo.containsKey('icon') ? houseLevelInfo['icon'] : '', width: 14, ), Text( houseLevelInfo.containsKey('levelName') ? houseLevelInfo['levelName'] : '', style: TextStyle(color: colorInfo[levelName]), ) ], )), Container( margin: EdgeInsets.only(top: 6), child: Text( roomInfo.containsKey('houseAbstract') ? roomInfo['houseAbstract'] : '', style: TextStyle(color: Color(0xFF9BA0AE), fontSize: 12), ), ), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Image.asset( 'images/icon_renshu.png', width: 20, ), Text( (houseInfo != null ? (houseInfo.playerNumber ?? 0).toString() : '0') + '/' + (houseInfo != null ? houseInfo.maxNumber.toString() : '0'), style: TextStyle( fontSize: 14, fontWeight: FontWeight.w500, color: Color(0xFFB1B2C0)), ) ], ), Container( margin: EdgeInsets.only(top: 14), width: 200, height: 40, decoration: BoxDecoration( border: Border.all( width: 1, color: PRIMARY_COLOR, style: BorderStyle.solid), borderRadius: BorderRadius.all(Radius.circular(2)), ), child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( '奖金', style: TextStyle( color: PRIMARY_COLOR, fontSize: 13, fontWeight: FontWeight.w500, ), ), Container( padding: EdgeInsets.only(left: 10, right: 6), child: Image.asset( 'images/icon_jinbi_da_hong.png', width: 20, ), ), Text( '×' + (houseInfo != null ? houseInfo.bonus.toString() : '0'), style: TextStyle( color: PRIMARY_COLOR, fontSize: 22, fontWeight: FontWeight.w900, ), ) ], ), ), statuFlag != 4 ? TipsListContent( tipsList: roomTipsList, houseInfo: houseInfo) : RankContent( roomId: widget.roomId, ), Container( width: double.infinity, height: 78, ) ], ))), ); }, ); } Widget _joinBtn() { int joinMoney = houseInfo != null ? houseInfo.houseLevel.entryCoin : 0; int statusFlag = houseInfo != null ? houseInfo.statusFlag : 1; int playerStatus = playerInfo != null ? playerInfo.statusFlag : 0; if (!isJoin && statusFlag == 0) { return Container( color: BG_SUB_COLOR, width: ScreenUtil().setWidth(375), height: 48 + ScreenUtil().setHeight(40), padding: EdgeInsets.only( top: ScreenUtil().setHeight(20), bottom: ScreenUtil().setHeight(20), left: 15, right: 15), child: RaisedButton( textColor: Colors.white, child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Image.asset( 'images/icon_jinbi_da_bai.png', width: 20, ), Container( margin: EdgeInsets.only(left: 6), child: Text( '×' + joinMoney.toString(), style: TextStyle( color: Colors.white, fontSize: 16, fontWeight: FontWeight.w500), ), ), Container( margin: EdgeInsets.only(left: 20), child: Text( '加入房间', style: TextStyle( color: Colors.white, fontSize: 16, fontWeight: FontWeight.w500), )) ], ), onPressed: () => joinRoom()), ); } else if (!isJoin && statusFlag == 2) { return Container( width: double.infinity, padding: EdgeInsets.symmetric(horizontal: 15, vertical: 20), height: 88, child: RaisedButton( disabledColor: Color(0xFF914244), disabledTextColor: Color(0xFF252532), child: Text( '房间已经开始,加入通道关闭', style: TextStyle(fontSize: 16), ), onPressed: null, ), ); } else if (isJoin && statusFlag == 0) { int _time; if (houseInfo != null) { _time = houseInfo.createTime + 600000 - DateTime.now().millisecondsSinceEpoch; } if (houseInfo != null && houseInfo.createUser == StoreProvider.of(context) .state .userInfo .id .toString()) { return Container( width: double.infinity, padding: EdgeInsets.symmetric(horizontal: 15, vertical: 20), height: 88, child: RaisedButton( child: Text.rich(TextSpan(children: [ TextSpan( text: '开始比赛', style: TextStyle(fontSize: 16), ), TextSpan( text: '(${getSecondsMIn(_time)}秒后将自动开始)', style: TextStyle(fontSize: 12), ) ])), onPressed: () { MyDialog.showDialog(context, '确认要开始比赛吗?', isCancel: true, onsubmit: () { print('开始'); startGame(); }); }, ), ); } else { return Container( width: double.infinity, padding: EdgeInsets.symmetric(horizontal: 15, vertical: 20), height: 88, child: RaisedButton( disabledColor: Color(0xFF914244), disabledTextColor: Color(0xFF252532), child: Text( '预计' + getSecondsMIn(_time) + '后开始', style: TextStyle(fontSize: 16), ), onPressed: null, ), ); } } else if (isJoin && statusFlag == 8) { return Container( width: double.infinity, padding: EdgeInsets.symmetric(horizontal: 15, vertical: 20), height: 88, child: RaisedButton( disabledColor: Color(0xFF914244), disabledTextColor: Color(0xFF252532), child: Text( '正在努力解析视频中', style: TextStyle(fontSize: 16), ), onPressed: null, ), ); } else if (isJoin && (statusFlag == 2 || statusFlag == 3)) { int _time; if (houseInfo != null) { _time = houseInfo.beginTime + 3600000 - DateTime.now().millisecondsSinceEpoch; } return Container( width: double.infinity, padding: EdgeInsets.symmetric(horizontal: 15, vertical: 20), height: 88, child: RaisedButton( disabledColor: Color(0xFF914244), disabledTextColor: Color(0xFF252532), child: Text( '最迟在' + getSecondsMIn(_time) + '后结算', style: TextStyle(fontSize: 16), ), onPressed: null, ), ); } else if (statusFlag == 4 && tabIndex == 0) { return Container( width: double.infinity, padding: EdgeInsets.symmetric(horizontal: 15, vertical: 20), height: 88, child: RaisedButton( disabledColor: Color(0xFF727785), disabledTextColor: Color(0xFF15151D), child: Text( '已结束', style: TextStyle(fontSize: 16), ), onPressed: null, ), ); } else if (statusFlag == 4 && tabIndex == 1) { return Container( height: 48, padding: EdgeInsets.symmetric(vertical: 9, horizontal: 20), color: Color(0xFFC2524D), child: Row( children: [ Container( width: 30, height: 30, margin: EdgeInsets.only(right: 10), child: CircleAvatar( backgroundImage: NetworkImage(userInfo.icon), ), ), Expanded( flex: 1, child: Text( userInfo.nickname, style: TextStyle( fontSize: 14, color: Color(0xFF252532), ), ), ), _myUrl != null ? Container( width: 68, height: 24, margin: EdgeInsets.only(right: 10), child: OutlineButton( textColor: BG_SUB_COLOR, borderSide: BorderSide(color: BG_SUB_COLOR), padding: EdgeInsets.all(0), highlightColor: PRIMARY_COLOR.withOpacity(0.8), highlightedBorderColor: BG_SUB_COLOR, child: Text( '查看回放', style: TextStyle(fontSize: 12), ), onPressed: () => { Navigator.push( context, CupertinoPageRoute( builder: (context) => VideoPlayerPage( videoUrl: _myUrl, fileType: 'file'))) }, ), ) : Container(), Text( myRank != 0 ? '第${myRank}名' : '未上榜', style: TextStyle( fontSize: 14, color: Color(0xFF252532), fontWeight: FontWeight.w500), ) ], ), ); } else { return Container(); } } } //房间的提示信息 class TipsListContent extends StatelessWidget { TipsListContent({Key key, this.tipsList, this.houseInfo}) : super(key: key); final List> tipsList; final HouseInfo houseInfo; @override Widget build(BuildContext context) { return Container( margin: EdgeInsets.only(top: 15), width: double.infinity, child: Column( children: _list(), ), ); } List _list() { List myList = []; for (int i = 0; i < tipsList.length; i++) { myList.add(Tips( content: tipsList[i], showTongzhi: (tipsList[i].length == 1 && i == 0) ? true : false, houseInfo: houseInfo)); } return myList; } } class Tips extends StatelessWidget { Tips({Key key, this.content, this.showTongzhi, this.houseInfo}) : super(key: key); final List content; final bool showTongzhi; final HouseInfo houseInfo; @override Widget build(BuildContext context) { return Container( padding: EdgeInsets.all(15), margin: EdgeInsets.fromLTRB(15, 10, 15, 0), decoration: BoxDecoration( gradient: LinearGradient( colors: [Color(0xFF464B6A), Color(0xFF35395E)], begin: Alignment.topCenter, end: Alignment.bottomCenter), borderRadius: BorderRadius.only( topRight: Radius.circular(8), bottomLeft: Radius.circular(8), bottomRight: Radius.circular(8))), child: Column( children: [ content.length == 1 ? Text( content[0], style: TextStyle(color: Colors.white, fontSize: 13), ) : _textList(), showTongzhi ? FlatButton( padding: EdgeInsets.all(0), textColor: PRIMARY_COLOR, highlightColor: Colors.transparent, splashColor: Colors.transparent, child: Text( '查看竞赛须知', style: TextStyle( decoration: TextDecoration.underline, ), ), onPressed: () => { Navigator.of(context).push(PageRouteBuilder( opaque: false, transitionDuration: Duration(milliseconds: 300), transitionsBuilder: (BuildContext context, Animation animation, Animation secondaryAnimation, Widget child) { return FadeTransition( opacity: CurvedAnimation( parent: animation, curve: Curves.linear), child: child, ); }, pageBuilder: (BuildContext context, _, __) { return CompetitionInformation(houseInfo); })) }, ) : Container() ], )); } Widget _textList() { return Text.rich(TextSpan(children: [ TextSpan( text: content[0], style: TextStyle(color: Colors.white, fontSize: 13), ), TextSpan( text: content[1], style: TextStyle( color: Color(0xFFC2524D), fontSize: 13, fontWeight: FontWeight.w500), ), TextSpan( text: content[2], style: TextStyle(color: Colors.white, fontSize: 13), ), TextSpan( text: content[3], style: TextStyle( color: Color(0xFFC2524D), fontSize: 13, fontWeight: FontWeight.w500), ), TextSpan( text: content[4], style: TextStyle(color: Colors.white, fontSize: 13), ) ])); } } //比赛结束排名 class RankContent extends StatefulWidget { RankContent({Key key, this.roomId}) : super(key: key); final String roomId; // 用来储存传递过来的值 @override RankContentState createState() => RankContentState(); } class RankContentState extends State { List topList = []; Future getTopList() async { Toast.show(context, '加载中', -1, 'loading'); Result res = await HttpManager.get('playerInfo/rankPage', data: {'houseId': widget.roomId, 'currentPage': 1, 'pageNumber': 3}); Toast.hide(); List list = []; if (res.success) { for (var item in res.data['pp']) { PlayerInfo jonPlayer = PlayerInfo.fromJson(item); list.add(jonPlayer); } } else {} setState(() { topList = list; }); } @override void initState() { super.initState(); Future.delayed(Duration.zero, () { getTopList(); }); } @override Widget build(BuildContext context) { return Container( width: double.infinity, height: 180, margin: EdgeInsets.only(top: 15), child: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.end, children: [_rankItem(2), _rankItem(1), _rankItem(3)], ), ); } Widget _rankItem(int _num) { if (_num > topList.length) { return Container( width: 107, height: 60, ); } List colorList = [ [Color(0xFFD48E00), Color(0xFFFECF01)], [Color(0xFFC5C5C5), Color(0xFFE3E3E3)], [Color(0xFFE77023), Color(0xFFF89E58)] ]; return Container( padding: EdgeInsets.only(left: 15, right: 15, top: _num == 1 ? 0 : 15), width: 107, child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ Container( child: Stack( children: [ Positioned( top: 0, left: _num == 1 ? 19 : 14, child: Center( child: Image.asset( 'images/icon_paihangbang_0' + '$_num.png', width: 32, ), ), ), Container( margin: EdgeInsets.only(top: 27, bottom: 20), width: _num == 1 ? 70 : 60, height: _num == 1 ? 70 : 60, decoration: BoxDecoration( gradient: LinearGradient( colors: colorList[_num - 1], begin: Alignment.topLeft, end: Alignment.bottomRight), borderRadius: BorderRadius.all(Radius.circular(100)), ), child: Center( child: Container( width: _num == 1 ? 60 : 50, height: _num == 1 ? 60 : 50, child: CircleAvatar( backgroundImage: NetworkImage(topList[_num - 1].userInfo.icon)), )), ), Positioned( bottom: 0, child: Center( child: Image.asset( 'images/ph_yinpai_no' + '$_num.png', width: 67, ), ), ), ], ), ), Text( topList[_num - 1].userInfo.nickname, style: TextStyle( color: Color(0xFFFDC372), fontSize: 12, ), overflow: TextOverflow.ellipsis, textAlign: TextAlign.center, ), SizedBox( height: 5, ), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Image.asset('images/icon_jinbi_xiao_hong.png', width: 20), Text( '×' + (topList[_num - 1].bonus != null ? topList[_num - 1].bonus.toString() : '0'), style: TextStyle(color: PRIMARY_COLOR, fontSize: 12)) ], ) ], ), ); } }