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

256 行
8.6 KiB

  1. import 'package:chat/data/UserData.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/HttpUtil.dart';
  8. import 'package:chat/utils/MessageMgr.dart';
  9. import 'package:chat/utils/TokenMgr.dart';
  10. import 'package:chat/utils/UserCard.dart';
  11. import 'package:dio/dio.dart';
  12. import 'package:flutter/material.dart';
  13. import 'package:flutter/services.dart';
  14. import 'package:provider/provider.dart';
  15. import 'package:pull_to_refresh/pull_to_refresh.dart';
  16. class SearchPage extends StatefulWidget {
  17. @override
  18. _SearchPageState createState() => _SearchPageState();
  19. }
  20. class _SearchPageState extends State<SearchPage> {
  21. RefreshController _refreshController =
  22. RefreshController(initialRefresh: false);
  23. TextEditingController _txtCtrl = new TextEditingController();
  24. List list = new List(); //列表要展示的数据
  25. int _page = 1; //加载的页数
  26. int rows = 20;
  27. bool isLoading = false; //是否正在加载数据
  28. bool _hasdeleteIcon = false;
  29. @override
  30. void initState() {
  31. super.initState();
  32. MessageMgr().on('refresh_love_list', msgRefreshLoveList);
  33. }
  34. msgRefreshLoveList(data) {
  35. for (int i = 0; i < list.length; i++) {
  36. var item = list[i];
  37. if (item['UserId'] == data['UserId']) {
  38. item['Follow'] = data['flag'];
  39. break;
  40. }
  41. }
  42. setState(() {});
  43. }
  44. //获取新的数据
  45. void getNewData() {
  46. _page = 1;
  47. getData((data) {
  48. list.clear();
  49. if (data != null) {
  50. list.addAll(data);
  51. }
  52. setState(() {});
  53. });
  54. }
  55. void getMoreData() {
  56. _page++;
  57. getData((data) {
  58. data == null || data.length == 0 ? _page-- : list.addAll(data);
  59. setState(() {});
  60. });
  61. }
  62. void getData(callback) async {
  63. var data = {
  64. "userId": UserData().basicInfo.userId,
  65. "language": UserData().language,
  66. "value": _txtCtrl.text,
  67. };
  68. data['sign'] = TokenMgr().getSign(data);
  69. data['lng'] = UserData().longitude;
  70. data['lat'] = UserData().latitude;
  71. data['page'] = _page;
  72. data['rows'] = rows;
  73. data['sex'] = UserData().basicInfo.sex;
  74. Response res = await HttpUtil().post('user/search/userList', data: data);
  75. isLoading = false;
  76. _refreshController.refreshCompleted();
  77. var resData = res.data;
  78. print(resData);
  79. if (resData['code'] == 0) {
  80. callback(resData['data']);
  81. }
  82. }
  83. @override
  84. void dispose() {
  85. _refreshController.dispose();
  86. _txtCtrl.dispose();
  87. MessageMgr().off('refresh_love_list', msgRefreshLoveList);
  88. super.dispose();
  89. }
  90. searchUser() {}
  91. @override
  92. Widget build(BuildContext context) {
  93. return Scaffold(
  94. resizeToAvoidBottomPadding: false,
  95. appBar: AppBar(
  96. backgroundColor: AppColors.NewAppbarBgColor,
  97. titleSpacing: 0,
  98. leading: CustomUI.buildCustomLeading(context),
  99. title: Container(
  100. alignment: Alignment.center,
  101. margin: const EdgeInsets.only(top: 20, bottom: 20, right: 20),
  102. decoration: BoxDecoration(
  103. color: Colors.grey[200],
  104. borderRadius: BorderRadius.all(Radius.circular(10))),
  105. child: new TextField(
  106. keyboardAppearance: Brightness.light,
  107. keyboardType: TextInputType.text,
  108. textInputAction: TextInputAction.search,
  109. controller: _txtCtrl,
  110. maxLines: 1,
  111. style: TextStyle(
  112. textBaseline: TextBaseline.alphabetic,
  113. fontSize: 14,
  114. color: AppColors.NewAppbarTextColor),
  115. autofocus: true,
  116. inputFormatters: [
  117. LengthLimitingTextInputFormatter(50),
  118. ],
  119. decoration: InputDecoration(
  120. hintText: I18n.of(context).search_user,
  121. hintStyle: TextStyle(fontSize: 14, color: Colors.grey),
  122. suffixIcon: Padding(
  123. padding: EdgeInsetsDirectional.only(
  124. start: 2.0, end: _hasdeleteIcon ? 20.0 : 0),
  125. child: _hasdeleteIcon
  126. ? new InkWell(
  127. onTap: (() {
  128. setState(() {
  129. WidgetsBinding.instance.addPostFrameCallback(
  130. (_) => _txtCtrl.clear());
  131. _hasdeleteIcon = false;
  132. });
  133. }),
  134. child: Icon(
  135. Icons.clear,
  136. size: 18.0,
  137. color: Constants.BlackTextColor,
  138. ))
  139. : new Text('')),
  140. filled: true,
  141. contentPadding:
  142. EdgeInsets.only(left: 20, top: 14, bottom: 14),
  143. fillColor: Colors.transparent,
  144. border: InputBorder.none,
  145. ),
  146. onChanged: (str) {
  147. setState(() {
  148. if (str.isEmpty) {
  149. _hasdeleteIcon = false;
  150. } else {
  151. _hasdeleteIcon = true;
  152. }
  153. });
  154. },
  155. onEditingComplete: () {
  156. setState(() {
  157. isLoading = true;
  158. getNewData();
  159. });
  160. }),
  161. ),
  162. ),
  163. body: SafeArea(
  164. child: Stack(
  165. children: <Widget>[
  166. SmartRefresher(
  167. enablePullDown: list.length > 0,
  168. enablePullUp: true,
  169. header: MaterialClassicHeader(),
  170. footer: CustomUI.buildLoadingFooter(),
  171. controller: _refreshController,
  172. onRefresh: _onRefresh,
  173. onLoading: _onLoading,
  174. child:
  175. (_refreshController.headerStatus == RefreshStatus.completed &&
  176. list.length == 0)
  177. ? CustomUI.buildNoData(context)
  178. : ListView.builder(
  179. itemBuilder: _renderRow,
  180. itemCount: list.length,
  181. ),
  182. ),
  183. isLoading ? CustomUI.buildLoaingAnim(context) : Container(),
  184. ],
  185. )));
  186. }
  187. Widget _renderRow(BuildContext context, int index) {
  188. if (index < list.length) {
  189. var userInfo = list[index];
  190. var refName = Provider.of<RefNameProvider>(context)
  191. .getRefName(userInfo['UserId'], userInfo['NickName']);
  192. return UserCard(
  193. key: UniqueKey(),
  194. nameSize: 14,
  195. userName: refName == userInfo['NickName']
  196. ? userInfo['NickName']
  197. : WebData().subUserName(refName, size: 4) +
  198. '(${WebData().subUserName(userInfo['NickName'], size: 2)})',
  199. city: WebData().getCountry(
  200. userInfo['Country']), //WebData().getCity(userInfo['City']),
  201. headUrl: userInfo['Headimgurl'],
  202. isReal: userInfo['IsAttestation'] == 1,
  203. constellation:
  204. WebData().getConstellation(context, userInfo['Constellation']),
  205. distance: userInfo['Distance'].toDouble(),
  206. age: userInfo['Age'],
  207. professional: WebData().getProffesionName(userInfo['Occupation']),
  208. isOnline: userInfo['OnlineStatus'] == 1
  209. ? I18n.of(context).online
  210. : WebData().getLoginTime(context, userInfo['LoginDate']),
  211. sex: userInfo['Sex'],
  212. hiddenDistince: userInfo['DistanceStatus'] == 1,
  213. isLove: userInfo['Follow'] == 0,
  214. isBalck: userInfo['Follow'] == 1,
  215. userId: userInfo['UserId'],
  216. payImg: userInfo['PhotoAut'] == 1,
  217. isHidden: userInfo['InfoAut'] == 1,
  218. member: userInfo['IsMember'],
  219. imgNum: userInfo['PhotoNum'],
  220. );
  221. }
  222. return Container();
  223. }
  224. Future<Null> _onRefresh() async {
  225. getNewData();
  226. }
  227. Future _onLoading() async {
  228. _page++;
  229. getData((data) {
  230. if (data == null || data.length == 0) {
  231. _page--;
  232. _refreshController.loadNoData();
  233. } else {
  234. list.addAll(data);
  235. _refreshController.loadComplete();
  236. }
  237. setState(() {});
  238. });
  239. }
  240. }