You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
280 lines
10 KiB
280 lines
10 KiB
import 'package:flutter/material.dart';
|
|
import 'package:oktoast/oktoast.dart';
|
|
import 'package:recook/constants/api.dart';
|
|
import 'package:recook/constants/constants.dart';
|
|
import 'package:recook/constants/header.dart';
|
|
import 'package:recook/constants/styles.dart';
|
|
import 'package:recook/manager/http_manager.dart';
|
|
import 'package:recook/manager/user_manager.dart';
|
|
import 'package:recook/pages/live/models/live_base_info_model.dart';
|
|
import 'package:recook/pages/live/num_tool/live_num_tool.dart';
|
|
import 'package:recook/pages/live/sub_page/live_host_center_page.dart';
|
|
import 'package:recook/pages/live/sub_page/user_attention_page.dart';
|
|
import 'package:recook/pages/live/sub_page/user_home/user_activity_view.dart';
|
|
import 'package:recook/pages/live/sub_page/user_home/user_playback_view.dart';
|
|
import 'package:recook/pages/live/widget/live_attention_button.dart';
|
|
import 'package:recook/pages/live/widget/sliver_bottom_persistent_delegate.dart';
|
|
import 'package:recook/pages/user/user_page.dart';
|
|
import 'package:recook/utils/custom_route.dart';
|
|
import 'package:recook/widgets/custom_image_button.dart';
|
|
import 'package:recook/widgets/recook_back_button.dart';
|
|
import 'package:recook/widgets/recook_indicator.dart';
|
|
|
|
class UserHomePage extends StatefulWidget {
|
|
final int userId;
|
|
final bool initAttention;
|
|
UserHomePage({Key key, @required this.userId, this.initAttention = false})
|
|
: super(key: key);
|
|
|
|
@override
|
|
_UserHomePageState createState() => _UserHomePageState();
|
|
}
|
|
|
|
class _UserHomePageState extends State<UserHomePage>
|
|
with SingleTickerProviderStateMixin {
|
|
TabController _tabController;
|
|
LiveBaseInfoModel model = LiveBaseInfoModel.zero();
|
|
bool get selfFlag => widget.userId == UserManager.instance.user.info.id;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
_tabController = TabController(
|
|
length: 2,
|
|
vsync: this,
|
|
);
|
|
HttpManager.post(LiveAPI.baseInfo, {
|
|
'findUserId': widget.userId,
|
|
}).then((resultData) {
|
|
if (resultData?.data['data'] != null) {
|
|
setState(() {
|
|
model = LiveBaseInfoModel.fromJson(resultData.data['data']);
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
_tabController?.dispose();
|
|
super.dispose();
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
backgroundColor: AppColor.frenchColor,
|
|
body: NestedScrollView(
|
|
headerSliverBuilder: (context, isScroll) {
|
|
return [
|
|
SliverAppBar(
|
|
backgroundColor: Colors.white,
|
|
brightness: Brightness.light,
|
|
leading: RecookBackButton(),
|
|
centerTitle: true,
|
|
title: Text(
|
|
selfFlag ? '我的主页' : 'TA的主页',
|
|
style: TextStyle(
|
|
color: Color(0xFF333333),
|
|
),
|
|
),
|
|
pinned: true,
|
|
floating: true,
|
|
snap: true,
|
|
expandedHeight: rSize(162.0 + 44),
|
|
flexibleSpace: FlexibleSpaceBar(
|
|
centerTitle: true,
|
|
background: Padding(
|
|
padding: EdgeInsets.fromLTRB(
|
|
rSize(15), rSize(80), rSize(15), rSize(20)),
|
|
child: Column(
|
|
mainAxisAlignment: MainAxisAlignment.end,
|
|
children: [
|
|
Row(
|
|
children: [
|
|
ClipRRect(
|
|
borderRadius:
|
|
BorderRadius.circular(rSize(54 / 2.0)),
|
|
child: FadeInImage.assetNetwork(
|
|
placeholder: R.ASSETS_PLACEHOLDER_NEW_1X1_A_PNG,
|
|
image: Api.getImgUrl(model.headImgUrl),
|
|
height: rSize(54),
|
|
width: rSize(54),
|
|
),
|
|
),
|
|
SizedBox(width: rSize(10)),
|
|
Expanded(
|
|
child: Text(
|
|
model.nickname,
|
|
style: TextStyle(
|
|
color: Color(0xFF333333),
|
|
fontSize: rSP(18),
|
|
),
|
|
),
|
|
),
|
|
selfFlag
|
|
? MaterialButton(
|
|
minWidth: rSize(60),
|
|
height: rSize(30),
|
|
child: Text('主播中心'),
|
|
color: Color(0xFFDB2D2D),
|
|
onPressed: () {
|
|
CRoute.push(
|
|
context,
|
|
LiveHostCenterPage(model: model),
|
|
);
|
|
},
|
|
)
|
|
: LiveAttentionButton(
|
|
filled: true,
|
|
rounded: false,
|
|
initAttention: widget.initAttention,
|
|
width: rSize(68),
|
|
height: rSize(30),
|
|
onAttention: (bool oldState) {
|
|
if (UserManager.instance.haveLogin)
|
|
HttpManager.post(
|
|
oldState
|
|
? LiveAPI.cancelFollow
|
|
: LiveAPI.addFollow,
|
|
{'followUserId': model.userId},
|
|
);
|
|
else {
|
|
showToast('未登陆,请先登陆');
|
|
CRoute.push(context, UserPage());
|
|
}
|
|
},
|
|
),
|
|
],
|
|
),
|
|
rHBox(20),
|
|
Padding(
|
|
padding: EdgeInsets.symmetric(
|
|
horizontal: rSize(70),
|
|
),
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
_buildVerticalView(
|
|
'关注',
|
|
model.follows,
|
|
onTap: () => CRoute.push(
|
|
context,
|
|
UserAttentionPage(id: widget.userId),
|
|
),
|
|
),
|
|
_buildVerticalView(
|
|
'粉丝',
|
|
model.fans,
|
|
onTap: () {},
|
|
),
|
|
_buildVerticalView(
|
|
'获赞',
|
|
model.praise,
|
|
onTap: () {},
|
|
),
|
|
],
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
elevation: 0,
|
|
),
|
|
SliverPersistentHeader(
|
|
pinned: true,
|
|
delegate: SliverBottomPersistentDelegate(
|
|
TabBar(
|
|
controller: _tabController,
|
|
labelColor: Color(0xFF333333),
|
|
isScrollable: true,
|
|
indicatorSize: TabBarIndicatorSize.label,
|
|
indicatorPadding: EdgeInsets.symmetric(
|
|
horizontal: rSize(18),
|
|
),
|
|
indicator: RecookIndicator(
|
|
borderSide: BorderSide(
|
|
color: Color(0xFFDB2D2D),
|
|
width: rSize(3),
|
|
)),
|
|
tabs: [
|
|
Tab(text: '动态'),
|
|
Tab(text: '直播回放'),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
];
|
|
},
|
|
body: Material(
|
|
color: Colors.white,
|
|
child: TabBarView(
|
|
controller: _tabController,
|
|
children: [
|
|
UserActivityView(
|
|
id: widget.userId,
|
|
userModel: model,
|
|
initAttention: selfFlag ? true : widget.initAttention,
|
|
onRefresh: () {
|
|
HttpManager.post(LiveAPI.baseInfo, {
|
|
'findUserId': widget.userId,
|
|
}).then((resultData) {
|
|
if (resultData?.data['data'] != null) {
|
|
setState(() {
|
|
model =
|
|
LiveBaseInfoModel.fromJson(resultData.data['data']);
|
|
});
|
|
}
|
|
});
|
|
},
|
|
),
|
|
UserPlaybackView(
|
|
userId: widget.userId,
|
|
onRefresh: () {
|
|
HttpManager.post(LiveAPI.baseInfo, {
|
|
'findUserId': widget.userId,
|
|
}).then((resultData) {
|
|
if (resultData?.data['data'] != null) {
|
|
setState(() {
|
|
model =
|
|
LiveBaseInfoModel.fromJson(resultData.data['data']);
|
|
});
|
|
}
|
|
});
|
|
},
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
Widget _buildVerticalView(String title, int number, {VoidCallback onTap}) {
|
|
return CustomImageButton(
|
|
onPressed: onTap,
|
|
child: Column(
|
|
children: [
|
|
Text(
|
|
getParseNum(number),
|
|
style: TextStyle(
|
|
color: Color(0xFF333333),
|
|
fontSize: rSP(18),
|
|
fontWeight: FontWeight.bold,
|
|
),
|
|
),
|
|
SizedBox(height: rSize(6)),
|
|
Text(
|
|
title,
|
|
style: TextStyle(
|
|
color: Color(0xFF666666),
|
|
fontSize: rSP(12),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|