import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:sport/application.dart'; import 'package:sport/bean/user.dart'; import 'package:sport/bean/user_info.dart'; import 'package:sport/pages/social/chat_page.dart'; import 'package:sport/router/navigator_util.dart'; import 'package:sport/services/api/inject_api.dart'; import 'package:sport/services/userid.dart'; import 'package:sport/utils/toast.dart'; import 'package:sport/widgets/appbar.dart'; import 'package:sport/widgets/button_primary.dart'; import 'package:sport/widgets/dialog/request_dialog.dart'; import 'package:sport/widgets/image.dart'; import 'package:sport/widgets/misc.dart'; import 'package:sport/widgets/space.dart'; class RankPeopleDetailsPage extends StatefulWidget { final User _data; RankPeopleDetailsPage(this._data); @override State createState() { return _RankPeopleDetailsPageState(); } } class _RankPeopleDetailsPageState extends State with InjectApi, UserId { late ValueNotifier _valueNotifierUserInfo; @override void initState() { super.initState(); _valueNotifierUserInfo = ValueNotifier(UserInfo.fromJson(widget._data.toJson())); api.getUserInfo("${widget._data.userId}").then((value) { _valueNotifierUserInfo.value = value.data; }); } @override Widget build(BuildContext context) { final data = widget._data; return Scaffold( backgroundColor: Colors.white, appBar: AppBar( backgroundColor: Colors.white, elevation: 0, leading: buildBackButton(context), ), body: SingleChildScrollView( // physics: ClampingScrollPhysics(), child: Container( color: Colors.white, width: double.infinity, child: Column( children: [ ValueListenableBuilder( valueListenable: _valueNotifierUserInfo, builder: (BuildContext context, UserInfo? user, Widget? child) { if (user == null) { return Container(); } return Container( child: Column( mainAxisSize: MainAxisSize.min, children: [ CircleAvatar( backgroundColor: Colors.black26, backgroundImage: userAvatarProvider(user.avatar), radius: 45, ), Space( height: 12, ), Text(user.name ?? "", style: Theme.of(context).textTheme.headline1!), Space( height: 6, ), Row( mainAxisSize: MainAxisSize.min, children: (user.gender ?? 0) > 0 ? [ Image.asset("lib/assets/img/mine_icon_${user.gender == 1 ? "man" : "girl"}_gray.png"), Space( width: 4, ), Text(user.gender == 1 ? "男" : "女", style: Theme.of(context).textTheme.bodyText1!), Space( width: 10, ), Text(user.age != null ? "${user.age}岁" : "", style: Theme.of(context).textTheme.bodyText1!), if ((user.districtId ?? 0) != 0) Padding( padding: const EdgeInsets.only(left: 10.0), child: Text("${user.province}${user.province == user.city ? '' : user.city}", style: Theme.of(context).textTheme.bodyText1), ) ] : [ Text("", style: Theme.of(context).textTheme.subtitle1!), ], ), if (openSocial()) if (selfId != '${widget._data.userId}') Padding( padding: const EdgeInsets.only(top: 20.0), child: Row(mainAxisSize: MainAxisSize.min, children: [ PrimaryButton( width: 120, height: 35, callback: () { // 先尝试换一下 NavigatorUtil.goPage(context, (context) => ChatPage(user)); // NavigatorUtil.goPage(context, (context) => PrivateMessagePage(user)); }, content: '', child: Row(mainAxisSize: MainAxisSize.min, children: [ Image.asset("lib/assets/img/mine_icon_message.png"), Space( width: 6, ), Text( "私信", strutStyle: fixedLine, style: Theme.of(context).textTheme.subtitle1!.copyWith(color: Colors.white), ) ]), ), Space( width: 12, ), user.followStatus == "friends" || user.followStatus == "followed" ? GestureDetector( child: Container( width: 120, height: 35, alignment: Alignment.center, child: Row(mainAxisSize: MainAxisSize.min, children: [ Image.asset("lib/assets/img/mine_icon_followed.png"), Space( width: 6, ), Text( "已关注", strutStyle: fixedLine, style: Theme.of(context).textTheme.subtitle1!.copyWith(color: Theme.of(context).accentColor), ) ]), decoration: BoxDecoration( borderRadius: BorderRadius.circular(20), border: Border.all( color: Theme.of(context).accentColor, width: .5, ), ), ), onTap: () async { await request(context, () async { var resp = await api.userUnFollow(uid: user.id).catchError((onError) {}); if (resp.code == 0) { ToastUtil.show("取关成功"); user.followStatus = "none"; setState(() {}); } }); }, ) : PrimaryButton( width: 120, height: 35, callback: () async { await request(context, () async { var resp = await api.userFollow(uid: user.id).catchError((onError) {}); if (resp.code == 0) { ToastUtil.show("关注成功"); user.followStatus = "followed"; setState(() {}); } }); }, content: '', child: Row(mainAxisSize: MainAxisSize.min, children: [ Image.asset("lib/assets/img/mine_icon_follow.png"), Space( width: 6, ), Text( "关注", strutStyle: fixedLine, style: Theme.of(context).textTheme.subtitle1!.copyWith(color: Colors.white), ) ]), ), ]), ), Space( height: 32, ), ], ), ); }, ), Divider( endIndent: 12, indent: 12, ), Container( padding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 10.0), child: Column( children: [ Padding( padding: EdgeInsets.only( bottom: 12.0, ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( "榜单排名", style: TextStyle(color: Color.fromRGBO(51, 51, 51, 1)), ), Text( "第 ${data.position} 名", style: TextStyle(color: Color.fromRGBO(255, 196, 0, 1)), ) ], ), ), if (data.score != null) Padding( padding: EdgeInsets.only( bottom: 12.0, ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( "通关评分", style: TextStyle(color: Color.fromRGBO(51, 51, 51, 1)), ), Text( "${data.score?.toStringAsFixed(1)} 分", style: TextStyle(color: Color.fromRGBO(153, 153, 153, 1)), ) ], ), ), if (data.sportDay == 0) Padding( padding: EdgeInsets.only( bottom: 12.0, ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( "通关日期", style: TextStyle(color: Color.fromRGBO(51, 51, 51, 1)), ), Text( "${data.finishAt}", style: TextStyle(color: Color.fromRGBO(153, 153, 153, 1)), ) ], ), ), if (data.sportDay == 0) Padding( padding: EdgeInsets.only( bottom: 12.0, ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( "通关时长", style: TextStyle(color: Color.fromRGBO(51, 51, 51, 1)), ), Text( "${(data.duration ?? 0) ~/ 60} 分钟", style: TextStyle(color: Color.fromRGBO(153, 153, 153, 1)), ) ], ), ), if ((data.sportDay ?? 0) > 0) Padding( padding: EdgeInsets.only( bottom: 12.0, ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( "运动时长", style: TextStyle(color: Color.fromRGBO(51, 51, 51, 1)), ), Text( "${(data.duration ?? 0) ~/ 60} 分钟", style: TextStyle(color: Color.fromRGBO(153, 153, 153, 1)), ) ], ), ), if ((data.sportDay ?? 0) > 0) Padding( padding: EdgeInsets.only( bottom: 12.0, ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( "运动天数", style: TextStyle(color: Color.fromRGBO(51, 51, 51, 1)), ), Text( "${data.sportDay} 天", style: TextStyle(color: Color.fromRGBO(153, 153, 153, 1)), ) ], ), ), if ((data.sportDay ?? 0) > 0) Padding( padding: EdgeInsets.only( bottom: 12.0, ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( "每天平均时长", style: TextStyle(color: Color.fromRGBO(51, 51, 51, 1)), ), Text( "${(data.duration ?? 0) ~/ 60 ~/ (data.sportDay ?? 0)} 分钟/天", style: TextStyle(color: Color.fromRGBO(153, 153, 153, 1)), ) ], ), ), Padding( padding: EdgeInsets.only( bottom: 12.0, ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( "消耗能量", style: TextStyle(color: Color.fromRGBO(51, 51, 51, 1)), ), Text( "${data.consume} 大卡", style: TextStyle(color: Color.fromRGBO(153, 153, 153, 1)), ) ], ), ), Padding( padding: EdgeInsets.only( bottom: 5.0, ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( "运动效率", style: TextStyle(color: Color.fromRGBO(51, 51, 51, 1)), ), Text( "${((data.consume ?? 0) / ((data.duration ?? 0) ~/ 60)).toStringAsFixed(2)} 大卡/分钟", style: TextStyle(color: Color.fromRGBO(153, 153, 153, 1)), ) ], ), ), ], ), ), Divider( endIndent: 12, indent: 12, ), Column( children: [ Space( height: 24, ), // head Stack( alignment: Alignment.center, children: [ Image.asset( "lib/assets/img/mine_image_achievement.png", fit: BoxFit.fitWidth, width: 240, ), Text( "${(widget._data.userId?.toString() == selfId) ? "我" : "他"}的成就", style: Theme.of(context).textTheme.subtitle1!, ) ], ), // bottom Space( height: 12, ), ValueListenableBuilder( valueListenable: _valueNotifierUserInfo, builder: (BuildContext context, UserInfo? user, Widget? child) { if (user == null) { return Container(); } return Padding(padding: EdgeInsets.all(12.0), child: achievementGroupWidget(user.achievements)); }, ), ], ) ], ), ), )); } }