panhui 6 лет назад
Родитель
Сommit
e98b8fe174

+ 2 - 1
lib/model/PlayerInfo.dart

@@ -8,7 +8,7 @@ part 'PlayerInfo.g.dart';
 @JsonSerializable()
 class PlayerInfo {
   PlayerInfo(
-      this.id, this.houseId, this.userId, this.statusFlag, this.userInfo,this.bonus,this.gameInfo,this.houseInfo,this.rank);
+      this.id, this.houseId, this.userId, this.statusFlag, this.userInfo,this.bonus,this.gameInfo,this.houseInfo,this.rank,this.houseRank);
   int id;
   int houseId; //房间id
   int userId; //用户id
@@ -18,6 +18,7 @@ class PlayerInfo {
   GameInfo gameInfo;
   HouseInfo houseInfo;
   int rank;//名次
+  int houseRank;//房间比赛名次
   
   factory PlayerInfo.fromJson(Map<String, dynamic> json) =>
       _$PlayerInfoFromJson(json);

+ 4 - 2
lib/model/PlayerInfo.g.dart

@@ -16,7 +16,8 @@ PlayerInfo _$PlayerInfoFromJson(Map<String, dynamic> json) {
       json['bonus'] as int,
       json['gameInfo'] != null ? GameInfo.fromJson(json['gameInfo']) : null,
       json['houseInfo'] != null ? HouseInfo.fromJson(json['houseInfo']) : null,
-      json['rank']??null);
+      json['rank'] ?? null,
+      json['houseRank'] ?? null);
 }
 
 //  int id;
@@ -34,5 +35,6 @@ Map<String, dynamic> _$PlayerInfoToJson(PlayerInfo instance) =>
       'bonus': instance.bonus,
       'gameInfo': instance.gameInfo,
       'houseInfo': instance.houseInfo,
-      'rank':instance.rank
+      'rank': instance.rank,
+      'houseRank': instance.houseRank
     };

+ 17 - 6
lib/pages/RecordList.dart

@@ -133,15 +133,23 @@ class houseItem extends StatelessWidget {
       'images/zhanji_icon_04.png'
     ];
     String imageSrc = '';
-     print('****');
-    print(playerInfo.rank);
-    if (playerInfo.rank != null && playerInfo.rank != 0) {
-      if (playerInfo.rank < 4) {
-        imageSrc = imageList[playerInfo.rank - 1];
+    if (playerInfo.houseRank != null) {
+      if (playerInfo.houseRank < 4) {
+        imageSrc = imageList[playerInfo.houseRank - 1];
       } else {
         imageSrc = imageList[3];
       }
     }
+    String tishiStr = '';
+    if (playerInfo.statusFlag != null) {
+      if (playerInfo.statusFlag == 6) {
+        tishiStr = '未参加';
+      } else if (playerInfo.statusFlag < 4) {
+        tishiStr = '结算中';
+      } else if (playerInfo.statusFlag < 2) {
+        tishiStr = '准备中';
+      }
+    }
     if (roomInfo == null) {
       return Container();
     }
@@ -213,7 +221,10 @@ class houseItem extends StatelessWidget {
                     ],
                   ),
                 ),
-                // Image.asset(imageSrc,width:70)
+                imageSrc != ''
+                    ? Image.asset(imageSrc, width: 70)
+                    : Text(tishiStr,
+                        style: TextStyle(color: Colors.black38, fontSize: 14))
               ],
             ),
           ),

+ 3 - 0
lib/pages/StartWindow.dart

@@ -69,6 +69,9 @@ class StartWindowState extends State<StartWindow> {
                   Text('点击确认开始游戏', style: TextStyle(color: Color(0xFFFDC372), fontSize: 20, fontWeight: FontWeight.w600)),
                   _centerContent(),
                   Container(
+                    width: double.infinity,
+                    margin: EdgeInsets.symmetric(horizontal: 42),
+                    height: 44,
                     child: RaisedButton(
                       textTheme: ButtonTextTheme.primary,
                       child: Text('确认'),

+ 2 - 0
lib/pages/TipInfo.dart

@@ -44,6 +44,8 @@ class TipInfoState extends State<TipInfo> {
         houseInfo = HouseInfo.fromJson(res2.data);
       });
     }
+
+    
   }
 
   void updateHousInfo() {}

+ 64 - 21
lib/pages/roomInfo.dart

@@ -12,6 +12,7 @@ import '../model/HouseInfo.dart';
 import '../styles/totast.dart';
 import 'StartWindow.dart';
 import '../model/PlayerInfo.dart';
+import '../widget/VideoWidget.dart';
 
 class RoomInfo extends StatefulWidget {
   RoomInfo({Key key, this.roomId}) : super(key: key);
@@ -30,6 +31,7 @@ class RoomInfoState extends State<RoomInfo>
   Map colorInfo;
   bool isJoin = true;
   PlayerInfo playerInfo;
+  bool isPop = false;
 
 //获取房间信息
   void getRoomInfo() async {
@@ -38,6 +40,9 @@ class RoomInfoState extends State<RoomInfo>
         await HttpManager.get("houseInfo/getOne", data: {"id": widget.roomId});
     Toast.hide();
     if (res.success) {
+      if (isPop) {
+        return;
+      }
       setState(() {
         roomInfo = res.data;
         houseInfo = HouseInfo.fromJson(res.data);
@@ -57,6 +62,9 @@ class RoomInfoState extends State<RoomInfo>
       if (houseInfo.statusFlag == 0 && res.data["statusFlag"] == 2) {
         showStart();
       }
+      if (isPop) {
+        return;
+      }
       setState(() {
         houseInfo.playerNumber = res.data["playerNumber"];
         houseInfo.statusFlag = res.data["statusFlag"];
@@ -87,8 +95,9 @@ class RoomInfoState extends State<RoomInfo>
       ),
     );
     Map<String, dynamic> data = {"id": playerInfo.id};
+    bool success=true;
     if (result) {
-      bool success = await ScreenStreamPlugin.start(
+      success = await ScreenStreamPlugin.start(
           'rtmp://49.4.66.233:1935/myapp/' +
               playerInfo.userId.toString() +
               '?playerInfoId=' +
@@ -109,17 +118,10 @@ class RoomInfoState extends State<RoomInfo>
       if (data['statusFlag'] == 2) {
         await Future.delayed(Duration(milliseconds: 100));
         showSucessInfo();
-        Future.delayed(Duration(seconds: 3), () async {
-          const url = 'pubgmhd1106467070://';
-          if (await canLaunch(url)) {
-            await launch(url);
-          } else {
-            throw 'Could not launch $url';
-          }
-        });
+        getTotast(10);
       } else {
         // showBackDialog();
-        Future.delayed(Duration(milliseconds: 100), () => showBackDialog());
+        Future.delayed(Duration(milliseconds: 100), () => showBackDialog(success?1:0));
       }
     }
   }
@@ -134,7 +136,7 @@ class RoomInfoState extends State<RoomInfo>
           content: Container(
             height: 50,
             child: Text(
-              '已经成功开启录屏,请保留当前页面,将在3秒后自动打开刺激战场,如未自动打开请您手动打开,祝您取得好成绩!',
+              '已经成功开启录屏,请保留当前页面,10秒倒计时结束将自动打开游戏,如未自动打开请您手动打开,祝您取得好成绩!',
               style: TextStyle(color: Colors.black),
             ),
           ),
@@ -157,10 +159,32 @@ class RoomInfoState extends State<RoomInfo>
     ).then((val) {
       Navigator.of(context).pop();
     });
+
+  }
+
+  getTotast(int index)async{
+    if(isPop){
+      return;
+    }
+    Toast.show(context, index.toString(), 500, 'num');
+    if(index==0){
+      Future.delayed(Duration(seconds: 1),()async{
+        const url = 'pubgmhd1106467070://';
+          if (await canLaunch(url)) {
+            await launch(url);
+          } else {
+            throw 'Could not launch $url';
+          }
+      });
+    }
+    else{
+       Future.delayed(Duration(seconds: 1),()=>getTotast(index-1));
+    }
+
   }
 
 //未确认比赛弹窗
-  showBackDialog() {
+  showBackDialog(type) {
     showDialog<Null>(
       context: context,
       barrierDismissible: false,
@@ -169,7 +193,7 @@ class RoomInfoState extends State<RoomInfo>
           content: Container(
             height: 50,
             child: Text(
-              '您未在十秒内点击开始按钮,系统已经判定您放弃比赛,参赛奖金不予退还。',
+              (type==1?'您未在十秒内点击开始按钮':'您未允许录屏')+',系统已经判定您放弃比赛,参赛奖金不予退还。',
               style: TextStyle(color: Colors.black),
             ),
           ),
@@ -198,11 +222,17 @@ class RoomInfoState extends State<RoomInfo>
     if (res.success) {
       print(res.data);
       if (res.data == null) {
+        if (isPop) {
+          return;
+        }
         setState(() {
           isJoin = false;
         });
       } else {
         playerInfo = PlayerInfo.fromJson(res.data);
+        if (isPop) {
+          return;
+        }
         setState(() {
           isJoin = true;
         });
@@ -227,6 +257,9 @@ class RoomInfoState extends State<RoomInfo>
     Toast.hide();
     if (res.success) {
       Toast.show(context, '加入成功', 1500, 'success');
+      if (isPop) {
+        return;
+      }
       setState(() {
         isJoin = true;
       });
@@ -322,9 +355,15 @@ class RoomInfoState extends State<RoomInfo>
         floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
       ),
       onWillPop: () {
-        Toast.hide();
-        Navigator.of(context).pop();
-        return Future.value(false);
+        if (houseInfo==null||(houseInfo.statusFlag!=0)) {
+          isPop = true;
+          Toast.hide();
+          Navigator.of(context).pop();
+          return Future.value(false);
+        }
+        else{
+          Toast.show(context, '比赛即将开始,暂不能离开房间', 1500, 'info');
+        }
       },
     );
   }
@@ -366,7 +405,10 @@ class RoomInfoState extends State<RoomInfo>
             child: Container(
               child: Column(
                 children: <Widget>[
-                  Image.network(topImg, width: double.infinity),
+                  houseInfo != null
+                      ? VideoWidget(videoSrc: houseInfo.video)
+                      : Container(),
+                  // Image.network(topImg, width: double.infinity),
                   Container(
                       padding: EdgeInsets.only(top: 10),
                       child: Row(
@@ -875,10 +917,11 @@ class SecondPageState extends State<SecondPage> {
               margin: EdgeInsets.only(right: 12),
               width: 36,
               height: 36,
-              child: CircleAvatar(
-                backgroundImage: NetworkImage(
-                    info.userInfo != null ? info.userInfo.icon : ''),
-              ),
+              child: info.userInfo != null
+                  ? CircleAvatar(
+                      backgroundImage: NetworkImage(info.userInfo.icon),
+                    )
+                  : Container(),
             ),
             Expanded(
               flex: 1,

+ 14 - 5
lib/styles/totast.dart

@@ -66,14 +66,16 @@ class Toast {
             child: Material(
                 color: Colors.white.withOpacity(0),
                 child: new Container(
+                  margin: EdgeInsets.only(top:toastType == 'num'?200:0),
                   padding: EdgeInsets.symmetric(
-                      horizontal: toastType == 'info' ? 15 : 36),
-                  height: toastType == 'info' ? 40 : 120,
+                      horizontal: toastType == 'info' ? 15 : (toastType == 'num'?0:36)),
+                  height: toastType == 'info' ? 40 : (toastType=='num'?60:100),
+                  width: toastType=='num'?60:null,
                   decoration: ShapeDecoration(
-                    color: Colors.black.withOpacity(0.4),
+                    color: Colors.black.withOpacity(toastType=='num'?0.8:0.4),
                     shape: RoundedRectangleBorder(
                       borderRadius: BorderRadius.all(
-                        Radius.circular(8.0),
+                        Radius.circular(toastType=='num'?60:8.0),
                       ),
                     ),
                   ),
@@ -119,7 +121,14 @@ List<Widget> _contentWidget(toastType, msg) {
         ),
       ),
     ];
-  } else {
+  } else if (toastType == 'num'){
+    widgetList = [
+      Text(
+        msg,
+        style: new TextStyle(fontSize: 24.0, color: Colors.white),
+      ),
+    ];
+  }else {
     widgetList = [
       Text(
         msg,

+ 139 - 0
lib/widget/VideoWidget.dart

@@ -0,0 +1,139 @@
+import 'package:video_player/video_player.dart';
+import 'package:flutter/material.dart';
+
+class VideoWidget extends StatefulWidget {
+  VideoWidget({Key key, this.videoSrc}) : super(key: key);
+  final String videoSrc; // 用来储存传递过来的值
+
+  @override
+  VideoWidgetState createState() => VideoWidgetState();
+}
+
+class VideoWidgetState extends State<VideoWidget> {
+  VideoPlayerController _controller;
+  String _defaultVideo =
+      'http://oss.izouma.com/shouyoudianjing/video/2019-03-01-11-19-41-ivqsgiy9.mp4';
+  bool isVideo = true;
+  bool showVideo = false;
+  bool isPlay = false;
+
+  @override
+  void initState() {
+    super.initState();
+    if (widget.videoSrc == null) {
+    } else {
+      if (widget.videoSrc.contains('.mp4')) {
+        _defaultVideo = widget.videoSrc;
+        isVideo = true;
+      } else {
+        isVideo = false;
+      }
+    }
+
+    print('**********');
+    print(isVideo);
+    print(_defaultVideo);
+    print(widget.videoSrc);
+    if (isVideo) {
+      _controller = VideoPlayerController.network(_defaultVideo)
+        ..initialize().then((_) {
+          // Ensure the first frame is shown after the video is initialized, even before the play button has been pressed.
+          setState(() {});
+        });
+        _controller.setLooping(true);
+      _controller.addListener(() {
+        setState(() {
+          isPlay = _controller.value.isPlaying;
+        });
+        // if(_controller.value.isLooping)
+      });
+    }
+  }
+
+  @override
+  void dispose() {
+    super.dispose();
+    _controller.dispose();
+  }
+
+  void playVideo() async {
+    if (!showVideo) {
+      setState(() {
+        showVideo = true;
+      });
+      await Future.delayed(Duration(milliseconds: 500));
+    }
+    _controller.value.isPlaying ? _controller.pause() : _controller.play();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+        child: Column(
+      children: <Widget>[
+        isVideo
+            ? _playContainer()
+            : Image.network(widget.videoSrc, width: double.infinity)
+      ],
+    ));
+  }
+
+  Widget _playContainer() {
+    return Container(
+      color: Colors.black,
+      height: 210,
+      width: double.infinity,
+      child: Center(
+        child: Stack(
+          children: <Widget>[
+            InkWell(
+                child: Center(
+                  child: showVideo
+                    ? AspectRatio(
+                        aspectRatio: _controller.value.aspectRatio,
+                        child: VideoPlayer(_controller),
+                      )
+                    : Image.network(
+                        'http://images.liqucn.com/img/h22/h70/img_localize_8e824debdd9ee29522690f36680e2d8e_600x337.png',
+                        width: double.infinity),
+                ),
+                onTap: () => playVideo()),
+            !isPlay
+                ? Positioned(
+                    left: 0,
+                    right: 0,
+                    top:83,
+                    child: Center(
+                      child: UnconstrainedBox(
+                        child: Container(
+                          width: 44,
+                          height: 44,
+                          child: RaisedButton(
+                            shape: RoundedRectangleBorder(
+                                borderRadius: BorderRadius.circular(44)),
+                            padding: EdgeInsets.all(0),
+                            color: Colors.black87,
+                            textColor: Colors.white,
+                            onPressed: () => playVideo(),
+                            child:
+                                Icon(isPlay ? Icons.pause : Icons.play_arrow),
+                          ),
+                        ),
+                      ),
+                    ))
+                : Container(),
+          ],
+        ),
+      ),
+    );
+    return InkWell(
+      child: AspectRatio(
+        aspectRatio: _controller.value.aspectRatio,
+        child: VideoPlayer(_controller),
+      ),
+      onTap: () {
+        _controller.value.isPlaying ? _controller.pause() : _controller.play();
+      },
+    );
+  }
+}