Hibok
您不能選擇超過 %s 個話題 話題必須以字母或數字為開頭,可包含連接號 ('-') 且最長為 35 個字
 
 
 
 
 
 

277 行
9.2 KiB

  1. import 'package:cached_network_image/cached_network_image.dart';
  2. import 'package:chat/data/WebData.dart';
  3. import 'package:chat/data/constants.dart';
  4. import 'package:chat/generated/i18n.dart';
  5. import 'package:chat/models/ref_name_provider.dart';
  6. import 'package:chat/utils/CustomUI.dart';
  7. import 'package:chat/utils/MessageMgr.dart';
  8. import 'package:chat/utils/UserCard.dart';
  9. import 'package:flutter/material.dart';
  10. import 'package:oktoast/oktoast.dart';
  11. import 'package:provider/provider.dart';
  12. import 'package:pull_to_refresh/pull_to_refresh.dart';
  13. import '../utils/HttpUtil.dart';
  14. import 'package:dio/dio.dart';
  15. import "../data/UserData.dart";
  16. import '../utils/TokenMgr.dart';
  17. import 'ProfilePage.dart';
  18. class WhiteAndBlackPage extends StatefulWidget {
  19. final bool isWhite;
  20. WhiteAndBlackPage({Key key, this.isWhite = true}) : super(key: key);
  21. @override
  22. _WhiteAndBlackPageState createState() => new _WhiteAndBlackPageState();
  23. }
  24. class _WhiteAndBlackPageState extends State<WhiteAndBlackPage> {
  25. List list = new List(); //列表要展示的数据
  26. RefreshController _refreshController =
  27. RefreshController(initialRefresh: true);
  28. int _page = 1; //加载的页数
  29. int rows = 20;
  30. @override
  31. void initState() {
  32. super.initState();
  33. MessageMgr().on('refresh_love_list', msgRefreshLoveList);
  34. }
  35. msgRefreshLoveList(data) {
  36. for (int i = 0; i < list.length; i++) {
  37. var item = list[i];
  38. if (item['FollowUserId'] == data['UserId'] && data['flag'] != 0) {
  39. list.removeAt(i);
  40. break;
  41. }
  42. }
  43. setState(() {});
  44. }
  45. Future getData(type, callback) async {
  46. var data = {
  47. "userid": UserData().basicInfo.userId,
  48. "type": type,
  49. };
  50. data['sign'] = TokenMgr().getSign(data);
  51. data['lng'] = UserData().longitude;
  52. data['lat'] = UserData().latitude;
  53. data['page'] = _page;
  54. data['rows'] = rows;
  55. Response res = await HttpUtil().post('userfollow/follow/user',
  56. data: data, failback: () => Navigator.of(context).pop());
  57. _refreshController.refreshCompleted();
  58. var resData = res.data;
  59. if (resData['code'] == 0) {
  60. callback(resData['data']);
  61. } else {
  62. showToast(resData['msg']);
  63. }
  64. }
  65. @override
  66. Widget build(BuildContext context) {
  67. Widget appBar = new AppBar(
  68. backgroundColor: AppColors.NewAppbarBgColor,
  69. title: new Text(
  70. widget.isWhite ? I18n.of(context).i_like : I18n.of(context).blacklist2,
  71. textScaleFactor: 1.0,
  72. style: TextStyle(color: AppColors.NewAppbarTextColor),
  73. ),
  74. centerTitle: true,
  75. leading: CustomUI.buildCustomLeading(context),
  76. );
  77. return Scaffold(
  78. appBar: appBar,
  79. body: SafeArea(
  80. child: SmartRefresher(
  81. enablePullDown: true,
  82. enablePullUp: true,
  83. header: MaterialClassicHeader(),
  84. footer: CustomUI.buildLoadingFooter(),
  85. controller: _refreshController,
  86. onRefresh: _onRefresh,
  87. onLoading: _onLoading,
  88. child:
  89. (_refreshController.headerStatus == RefreshStatus.completed &&
  90. list.length == 0)
  91. ? CustomUI.buildNoData(context)
  92. : ListView.builder(
  93. itemBuilder: _renderRow,
  94. itemCount: list.length,
  95. ),
  96. ),
  97. ));
  98. }
  99. Widget _renderRow(BuildContext context, int index) {
  100. if (index < list.length) {
  101. var userInfo = list[index];
  102. print(userInfo);
  103. var whiteItem = UserCard(
  104. key: UniqueKey(),
  105. userName: Provider.of<RefNameProvider>(context)
  106. .getRefName(userInfo['UserId'], userInfo['NickName']),
  107. city: WebData().getCountry(
  108. userInfo['Country']), // WebData().getCity(userInfo['City']),
  109. headUrl: userInfo['Headimgurl'],
  110. isReal: userInfo['IsAttestation'] == 1,
  111. constellation:
  112. WebData().getConstellation(context, userInfo['constellation']),
  113. distance: userInfo['Distance'].toDouble(),
  114. age:
  115. DateTime.now().year - int.parse(userInfo['Birthday'].split('-')[0]),
  116. professional: WebData().getProffesionName(userInfo['Occupation']),
  117. isOnline: userInfo['OnlineStatus'] == 1
  118. ? I18n.of(context).online
  119. : WebData().getLoginTime(context, userInfo['LoginDate']),
  120. hiddenDistince: userInfo['DistanceStatus'] == 1,
  121. sex: userInfo['Sex'],
  122. isLove: true,
  123. isBalck: false,
  124. userId: userInfo['FollowUserId'],
  125. payImg: userInfo['PhotoAut'] == 1,
  126. isHidden: userInfo['InfoAut'] == 1,
  127. member: userInfo['IsMember'],
  128. imgNum: userInfo['PhotoNum'],
  129. );
  130. var blackItem = Container(
  131. padding: EdgeInsets.all(10),
  132. margin: EdgeInsets.symmetric(horizontal: 10, vertical: 4),
  133. decoration: BoxDecoration(
  134. color: Colors.white,
  135. boxShadow: [
  136. BoxShadow(
  137. color: Color.fromRGBO(0, 0, 0, 248),
  138. offset: Offset(0, 6),
  139. blurRadius: 6,
  140. )
  141. ],
  142. borderRadius: BorderRadius.all(Radius.circular(10))),
  143. child: Row(
  144. children: <Widget>[
  145. _buildImg(userInfo['FollowUserId'], userInfo['Headimgurl']),
  146. Padding(
  147. padding: EdgeInsets.only(left: 10),
  148. child: Text(
  149. WebData().subUserName(Provider.of<RefNameProvider>(context)
  150. .getRefName(
  151. userInfo['FollowUserId'], userInfo['NickName'])),
  152. textScaleFactor: 1.0,
  153. style:
  154. TextStyle(fontSize: 15, color: Constants.BlackTextColor),
  155. )),
  156. Expanded(child: Container()),
  157. InkWell(
  158. onTap: () async {
  159. HttpUtil().cancleBlackUser(userInfo['FollowUserId'], () {
  160. for (int i = 0; i < list.length; i++) {
  161. if (list[i]['FollowUserId'] == userInfo['FollowUserId']) {
  162. setState(() {
  163. list.removeAt(i);
  164. if (list.length == 0) {
  165. _refreshController.refreshCompleted();
  166. }
  167. });
  168. break;
  169. }
  170. }
  171. });
  172. },
  173. child: Container(
  174. padding: EdgeInsets.symmetric(vertical: 5, horizontal: 10.5),
  175. decoration: BoxDecoration(
  176. color: Constants.ConfrimButtonColor,
  177. borderRadius: BorderRadius.all(Radius.circular(5))),
  178. alignment: Alignment.center,
  179. child: Text(
  180. I18n.of(context).cancel_shield,
  181. textScaleFactor: 1.0,
  182. style: TextStyle(
  183. color: Colors.white,
  184. fontSize: 13.5,
  185. ),
  186. )),
  187. )
  188. ],
  189. ),
  190. );
  191. return widget.isWhite
  192. ? (index == 0
  193. ? Padding(padding: EdgeInsets.only(top: 10), child: whiteItem)
  194. : whiteItem)
  195. : blackItem;
  196. }
  197. return Container();
  198. }
  199. Widget _buildImg(userId, url) {
  200. return InkWell(
  201. onTap: () {
  202. Navigator.of(context).push(
  203. new MaterialPageRoute(
  204. builder: (context) {
  205. return ProfilePage(
  206. userId: userId,
  207. );
  208. },
  209. ),
  210. );
  211. },
  212. child: Container(
  213. decoration: BoxDecoration(borderRadius: BorderRadius.circular(2.0)),
  214. width: 70.6,
  215. height: 70.6,
  216. child: ClipRRect(
  217. borderRadius: BorderRadius.circular(10),
  218. child: url == '' || url == null
  219. ? Image.asset(
  220. Constants.DefaultHeadImgUrl,
  221. )
  222. : CachedNetworkImage(
  223. imageUrl: url,
  224. placeholder: (context, url) => Image.asset(
  225. Constants.DefaultHeadImgUrl,
  226. width: 55,
  227. height: 55,
  228. ),
  229. fit: BoxFit.cover,
  230. ),
  231. )));
  232. }
  233. Future<Null> _onRefresh() async {
  234. _page = 1;
  235. getData(widget.isWhite == true ? 0 : 1, (data) {
  236. if (data != null) {
  237. list.clear();
  238. list.addAll(data);
  239. setState(() {});
  240. }
  241. });
  242. }
  243. Future _onLoading() async {
  244. _page++;
  245. getData(widget.isWhite == true ? 0 : 1, (data) {
  246. if (data == null || data.length == 0) {
  247. _page--;
  248. _refreshController.loadNoData();
  249. } else {
  250. list.addAll(data);
  251. _refreshController.loadComplete();
  252. }
  253. setState(() {});
  254. });
  255. }
  256. @override
  257. void dispose() {
  258. _refreshController.dispose();
  259. MessageMgr().off('refresh_love_list', msgRefreshLoveList);
  260. super.dispose();
  261. }
  262. }