Hibok
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 
 
 

746 lignes
25 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/home/SearchPage.dart';
  6. import 'package:chat/models/ref_name_provider.dart';
  7. import 'package:chat/utils/CustomUI.dart';
  8. import 'package:chat/utils/DropDownMemu.dart';
  9. import 'package:chat/utils/HttpUtil.dart';
  10. import 'package:chat/utils/MessageMgr.dart';
  11. import 'package:chat/utils/Toggle.dart';
  12. import 'package:chat/utils/TokenMgr.dart';
  13. import 'package:chat/utils/UserCard.dart';
  14. import 'package:chat/utils/screen.dart';
  15. import 'package:dio/dio.dart';
  16. import 'package:flutter/cupertino.dart';
  17. import 'package:flutter/material.dart';
  18. import 'package:location_permissions/location_permissions.dart';
  19. import 'package:provider/provider.dart';
  20. import 'package:pull_to_refresh/pull_to_refresh.dart';
  21. class DisCoverPage extends StatefulWidget {
  22. DisCoverPage({Key key}) : super(key: key);
  23. _DisCoverPageState createState() => _DisCoverPageState();
  24. }
  25. class _DisCoverPageState extends State<DisCoverPage>
  26. with TickerProviderStateMixin {
  27. TabController sameTabCtrl;
  28. TabController diffTabCtrl;
  29. RefreshController _scrollControllerNear =
  30. RefreshController(initialRefresh: true);
  31. RefreshController _scrollControllerNew =
  32. RefreshController(initialRefresh: true);
  33. RefreshController _scrollControllerApply =
  34. RefreshController(initialRefresh: true);
  35. RefreshController _scrollControllerVIP =
  36. RefreshController(initialRefresh: true);
  37. bool isPerformingRequest = false;
  38. Map listMap = {
  39. 1: {'list': [], 'page': 1, 'control': null},
  40. 2: {'list': [], 'page': 1, 'control': null},
  41. 3: {'list': [], 'page': 1, 'control': null},
  42. 4: {'list': [], 'page': 1, 'control': null},
  43. }; //不同类别的数据
  44. int type = 1;
  45. int rows = 20;
  46. bool isLoading = false; //是否正在加载数据
  47. static const SEPARATE_SIZE = 20.0;
  48. bool isOnline = false;
  49. bool isWomen = UserData().isMan();
  50. String search = '1';
  51. String titleStr = '';
  52. GZXDropdownMenuController _dropdownMenuController =
  53. GZXDropdownMenuController();
  54. //获取新的数据
  55. void getNewData() {
  56. listMap[type]['page'] = 1;
  57. getData((data) {
  58. listMap[type]['list'].clear();
  59. if (data != null) {
  60. listMap[type]['list'].addAll(data);
  61. }
  62. if (mounted) {
  63. setState(() {});
  64. }
  65. });
  66. }
  67. void _onLoading() async {
  68. listMap[type]['page']++;
  69. getData((data) {
  70. if (data == null || data.length == 0) {
  71. listMap[type]['page']--;
  72. listMap[type]['control'].loadNoData();
  73. } else {
  74. listMap[type]['list'].addAll(data);
  75. listMap[type]['control'].loadComplete();
  76. }
  77. if (mounted) {
  78. setState(() {});
  79. }
  80. });
  81. }
  82. void getData(callback) async {
  83. var data = {
  84. "userId": UserData().basicInfo.userId,
  85. "type": type,
  86. "search": search,
  87. };
  88. data['sign'] = TokenMgr().getSign(data);
  89. data['lng'] = UserData().longitude;
  90. data['lat'] = UserData().latitude;
  91. data['page'] = listMap[type]['page'];
  92. data['rows'] = rows;
  93. data['sex'] = isWomen ? 2 : 1;
  94. data['online'] = isOnline ? 1 : 0;
  95. Response res = await HttpUtil().post('user/main/interface', data: data);
  96. listMap[type]['control'].refreshCompleted();
  97. isLoading = false;
  98. if (res == null) {
  99. return;
  100. }
  101. var resData = res.data;
  102. print(resData);
  103. if (resData['code'] == 0) {
  104. callback(resData['data']);
  105. }
  106. }
  107. @override
  108. void initState() {
  109. super.initState();
  110. diffTabCtrl = TabController(length: 3, vsync: this);
  111. sameTabCtrl = TabController(length: 2, vsync: this);
  112. listMap[1]['control'] = _scrollControllerNear;
  113. listMap[2]['control'] = _scrollControllerNew;
  114. listMap[3]['control'] = _scrollControllerApply;
  115. listMap[4]['control'] = _scrollControllerVIP;
  116. //getNewData();
  117. sameTabCtrl.addListener(() {
  118. type = sameTabCtrl.index == 0 ? 1 : 4;
  119. if (listMap[type]['list'].length == 0) getNewData();
  120. });
  121. diffTabCtrl.addListener(() {
  122. type = diffTabCtrl.index + 1;
  123. if (listMap[type]['list'].length == 0) getNewData();
  124. });
  125. MessageMgr().on('test_Permission', msgTestPermission);
  126. MessageMgr().on('refresh_love_list', msgRefreshLoveList);
  127. }
  128. msgRefreshLoveList(data) {
  129. print('msgRefreshLoveList ${data['UserId'] is String}');
  130. for (int i = 0; i < listMap[type]['list'].length; i++) {
  131. var item = listMap[type]['list'][i];
  132. print(item['UserId'] == data['UserId']);
  133. if (item['UserId'] == data['UserId']) {
  134. item['Follow'] = data['flag'];
  135. print(listMap[type]['list'][i]);
  136. break;
  137. }
  138. }
  139. setState(() {});
  140. }
  141. msgTestPermission(data) async {
  142. PermissionStatus status =
  143. await LocationPermissions().checkPermissionStatus();
  144. if (status == PermissionStatus.granted) {
  145. UserData().hasLocationPermission = true;
  146. _onRefresh();
  147. }
  148. }
  149. @override
  150. void dispose() {
  151. _scrollControllerNear.dispose();
  152. _scrollControllerNew.dispose();
  153. _scrollControllerApply.dispose();
  154. _scrollControllerVIP.dispose();
  155. sameTabCtrl.dispose();
  156. diffTabCtrl.dispose();
  157. MessageMgr().off('test_Permission', msgTestPermission);
  158. MessageMgr().off('refresh_love_list', msgRefreshLoveList);
  159. super.dispose();
  160. }
  161. var _selectTempFirstLevelIndex = '1';
  162. var _selectFirstLevelIndex = '1';
  163. var _selectSecondLevelIndex = '-1';
  164. _buildAddressWidget(void itemOnTap(String key, String value)) {
  165. List firstLevels = [
  166. {'key': '1', 'value': I18n.of(context).nearby},
  167. ];
  168. if (WebData().provinces.length > 0) {
  169. if (UserData().isInChina) {
  170. firstLevels
  171. .add({'key': 'China', 'value': WebData().provinces['China']});
  172. } else {
  173. firstLevels
  174. .add({'key': 'VietNam', 'value': WebData().provinces['VietNam']});
  175. }
  176. }
  177. List secondLevels = [];
  178. if (WebData().cities.length > 0) {
  179. if (UserData().isInChina) {
  180. WebData()
  181. .cities['China']
  182. .forEach((k, v) => secondLevels.add({'key': k, 'value': v}));
  183. } else {
  184. WebData()
  185. .cities['VietNam']
  186. .forEach((k, v) => secondLevels.add({'key': k, 'value': v}));
  187. }
  188. }
  189. Widget _buildRow(item) {
  190. var index = item['key'];
  191. return GestureDetector(
  192. onTap: () {
  193. _selectSecondLevelIndex = index;
  194. _selectFirstLevelIndex = _selectTempFirstLevelIndex;
  195. itemOnTap(index, item['value']);
  196. },
  197. child: Container(
  198. height: 50,
  199. decoration: BoxDecoration(
  200. border: Border(top: Constants.GreyBorderSide),
  201. ),
  202. alignment: Alignment.center,
  203. child: Text(
  204. item['value'],
  205. textScaleFactor: 1.0,
  206. style: TextStyle(
  207. decoration: TextDecoration.none,
  208. color: _selectFirstLevelIndex == _selectTempFirstLevelIndex &&
  209. _selectSecondLevelIndex == index
  210. ? const Color(0xFF0368FF)
  211. : Constants.BlackTextColor,
  212. fontWeight: FontWeight.normal,
  213. fontSize: 14),
  214. )),
  215. );
  216. }
  217. return Container(
  218. child: Row(
  219. children: <Widget>[
  220. Container(
  221. width: MediaQuery.of(context).size.width * 0.4,
  222. child: ListView(
  223. padding: EdgeInsets.zero,
  224. children: firstLevels.map((item) {
  225. var index = item['key'];
  226. return GestureDetector(
  227. onTap: () {
  228. _selectTempFirstLevelIndex = index;
  229. if (index == '1' || index == '2') {
  230. itemOnTap(index, item['value']);
  231. return;
  232. }
  233. setState(() {});
  234. },
  235. child: Container(
  236. height: 50,
  237. decoration: BoxDecoration(
  238. color: _selectTempFirstLevelIndex == index
  239. ? const Color(0xFF0368FF)
  240. : Colors.white,
  241. border: Border(top: Constants.GreyBorderSide),
  242. ),
  243. alignment: Alignment.center,
  244. child: Text(
  245. item['value'],
  246. textScaleFactor: 1.0,
  247. style: TextStyle(
  248. color: _selectTempFirstLevelIndex == index
  249. ? Colors.white
  250. : Constants.BlackTextColor,
  251. fontWeight: FontWeight.normal,
  252. decoration: TextDecoration.none,
  253. fontSize: 14),
  254. )));
  255. }).toList(),
  256. )),
  257. Expanded(
  258. child: Container(
  259. width: double.infinity,
  260. decoration:
  261. BoxDecoration(border: Border(left: Constants.GreyBorderSide)),
  262. child: ListView(
  263. padding: EdgeInsets.zero,
  264. children: _selectTempFirstLevelIndex == '1'
  265. ? [
  266. _buildRow({'key': '1', 'value': I18n.of(context).nearby})
  267. ]
  268. : (_selectTempFirstLevelIndex == '2'
  269. ? [
  270. _buildRow({
  271. 'key': '2',
  272. 'value': I18n.of(context).Resident_city
  273. })
  274. ]
  275. : secondLevels.map((item) {
  276. return _buildRow(item);
  277. }).toList()),
  278. ),
  279. ),
  280. )
  281. ],
  282. ));
  283. }
  284. Widget _buildAppBar() {
  285. Widget title = InkWell(
  286. highlightColor: Colors.transparent,
  287. radius: 0,
  288. onTap: UserData().isInChina
  289. ? null
  290. : () {
  291. _dropdownMenuController.dropDownHearderHeight = 70;
  292. _dropdownMenuController.show(0);
  293. },
  294. child: Container(
  295. child: Row(
  296. crossAxisAlignment: CrossAxisAlignment.center,
  297. mainAxisAlignment: MainAxisAlignment.center,
  298. children: <Widget>[
  299. Text(
  300. titleStr == '' ? I18n.of(context).nearby : titleStr,
  301. textScaleFactor: 1.0,
  302. //style: Constants.MainTitleStyle,
  303. ),
  304. UserData().isInChina
  305. ? Container()
  306. : Icon(
  307. Icons.arrow_drop_down,
  308. color: Constants.BlackTextColor,
  309. )
  310. ],
  311. )));
  312. Widget leading = Container(
  313. child: Row(
  314. children: <Widget>[
  315. CircleAvatar(
  316. backgroundColor: Constants.GreyBackgroundColor,
  317. radius: 13.75,
  318. child: Padding(
  319. padding: EdgeInsets.only(bottom: 1.5),
  320. child: ToggleButton(
  321. activeIcon: IconData(
  322. 0xe61e,
  323. fontFamily: 'iconfont',
  324. ),
  325. unActiveIcon: IconData(
  326. 0xe61f,
  327. fontFamily: 'iconfont',
  328. ),
  329. active: isWomen,
  330. activeColor: Constants.BlackTextColor,
  331. unActiveColor: Colors.transparent,
  332. onChange: (state) {
  333. setState(() {
  334. isWomen = !isWomen;
  335. sameTabCtrl.index = 0;
  336. diffTabCtrl.index = 0;
  337. getNewData();
  338. });
  339. },
  340. ))),
  341. Container(
  342. padding: EdgeInsets.only(left: 10),
  343. child: IconButton(
  344. icon: CircleAvatar(
  345. backgroundColor: Constants.GreyBackgroundColor,
  346. radius: 13.75,
  347. child: Padding(
  348. padding: EdgeInsets.only(bottom: 1),
  349. child: Icon(
  350. IconData(0xe619, fontFamily: Constants.IconFontFamily),
  351. color: Constants.BlackTextColor,
  352. size: 22,
  353. ))),
  354. onPressed: () {
  355. Navigator.of(context).push(
  356. new MaterialPageRoute(
  357. builder: (context) {
  358. return SearchPage();
  359. },
  360. ),
  361. );
  362. },
  363. ),
  364. ),
  365. // Container(
  366. // child: IconButton(
  367. // icon: CircleAvatar(
  368. // backgroundColor: Constants.GreyBackgroundColor,
  369. // radius: 13.75,
  370. // child: Padding(
  371. // padding: EdgeInsets.only(bottom: 1.5),
  372. // child: Icon(
  373. // IconData(0xe659, fontFamily: Constants.IconFontFamily),
  374. // color: Constants.BlackTextColor,
  375. // size: 21,
  376. // ))),
  377. // onPressed: () {
  378. // goScanPage();
  379. // },
  380. // ),
  381. // )
  382. ],
  383. ),
  384. );
  385. Color borderColor =
  386. isOnline ? Constants.LightBlueButtonColor : Constants.GreyTextColor;
  387. Color textColor = isOnline ? Colors.white : Constants.GreyTextColor;
  388. Color bgColor = isOnline
  389. ? Constants.LightBlueButtonColor
  390. : Constants.LightGreyBackgroundColor;
  391. Widget actions = GestureDetector(
  392. child: Container(
  393. margin: EdgeInsets.only(right: 16, bottom: 0),
  394. alignment: Alignment.center,
  395. child: Text(
  396. I18n.of(context).first_online,
  397. textScaleFactor: 1.0,
  398. style: TextStyle(color: textColor, fontSize: 11.5),
  399. ),
  400. padding: EdgeInsets.only(left: 11, right: 11, bottom: 3, top: 2),
  401. decoration: BoxDecoration(
  402. color: bgColor,
  403. border: Border.all(color: borderColor, width: 1),
  404. borderRadius: BorderRadius.all(Radius.circular(5.0))),
  405. ),
  406. onTap: () {
  407. setState(() {
  408. isOnline = !isOnline;
  409. getNewData();
  410. });
  411. },
  412. );
  413. return AppBar(
  414. backgroundColor: Constants.LightGreyBackgroundColor,
  415. title: title,
  416. centerTitle: true,
  417. actions: <Widget>[leading],
  418. leading: CustomUI.buildCustomLeading(context),
  419. elevation: 0,
  420. bottom: PreferredSize(
  421. preferredSize:
  422. Size.fromHeight(UserData().hasLocationPermission ? 28 : 52),
  423. child: Column(
  424. children: <Widget>[
  425. Container(
  426. padding: EdgeInsets.only(left: 2),
  427. width: Screen.width,
  428. decoration: BoxDecoration(
  429. color: Constants.LightGreyBackgroundColor,
  430. border: Border(
  431. bottom: UserData().hasLocationPermission
  432. ? BorderSide(color: Color(0xffeaeaea))
  433. : BorderSide.none)),
  434. alignment: Alignment.centerLeft,
  435. child: Stack(
  436. alignment: Alignment.centerLeft,
  437. children: <Widget>[
  438. tabBar(),
  439. Positioned(right: 0, bottom: 4, child: actions)
  440. ],
  441. ),
  442. ),
  443. // !UserData().hasLocationPermission
  444. // ? InkWell(
  445. // onTap: () {
  446. // CustomUI.buildOneConfirm(
  447. // context,
  448. // I18n.of(context).get_location,
  449. // I18n.of(context).determine, () async {
  450. // Navigator.of(context).pop();
  451. // LocationPermissions().openAppSettings();
  452. // }, title: I18n.of(context).open_location);
  453. // },
  454. // child: Container(
  455. // height: 25,
  456. // alignment: Alignment.center,
  457. // width: double.infinity,
  458. // child: Row(
  459. // crossAxisAlignment: CrossAxisAlignment.center,
  460. // mainAxisAlignment: MainAxisAlignment.center,
  461. // children: <Widget>[
  462. // Text(
  463. // I18n.of(context).not_positioned,
  464. // textScaleFactor: 1,
  465. // style: TextStyle(
  466. // fontSize: 12.5,
  467. // color: const Color(0xffab8f60)),
  468. // ),
  469. // Icon(
  470. // Icons.chevron_right,
  471. // size: 18,
  472. // color: const Color(0xffab8f60),
  473. // )
  474. // ],
  475. // ),
  476. // color: const Color(0xfffaefcf),
  477. // ))
  478. // : Container()
  479. ],
  480. )),
  481. );
  482. }
  483. buildSexBar(bool isWomen) {
  484. List<Widget> feMaleTabs = [
  485. Text(I18n.of(context).nearby, textScaleFactor: 1.0),
  486. Text(I18n.of(context).new_registration, textScaleFactor: 1.0),
  487. Text(I18n.of(context).authenticate, textScaleFactor: 1.0),
  488. ];
  489. List<Widget> maleTabs = [
  490. Text(I18n.of(context).nearby, textScaleFactor: 1.0),
  491. Text(I18n.of(context).member, textScaleFactor: 1.0),
  492. ];
  493. return TabBar(
  494. isScrollable: true,
  495. indicatorPadding: EdgeInsets.only(left: 9, right: 9),
  496. tabs: isWomen ? feMaleTabs : maleTabs,
  497. controller: isWomen ? diffTabCtrl : sameTabCtrl,
  498. );
  499. }
  500. Widget tabBar() {
  501. return Container(
  502. alignment: Alignment.centerLeft,
  503. width: Screen.width,
  504. child: buildSexBar(isWomen));
  505. }
  506. @override
  507. Widget build(BuildContext context) {
  508. GZXDropDownMenu menu = GZXDropDownMenu(
  509. // controller用于控制menu的显示或隐藏
  510. controller: _dropdownMenuController,
  511. // 下拉菜单显示或隐藏动画时长
  512. animationMilliseconds: 150,
  513. // 下拉菜单,高度自定义,你想显示什么就显示什么,完全由你决定,你只需要在选择后调用_dropdownMenuController.hide();即可
  514. menus: [
  515. GZXDropdownMenuBuilder(
  516. dropDownHeight: 50 * 8.0,
  517. callback: () {
  518. setState(() {});
  519. },
  520. dropDownWidget: _buildAddressWidget((key, value) {
  521. setState(() {});
  522. isLoading = true;
  523. titleStr = value;
  524. _dropdownMenuController.hide();
  525. search = key;
  526. getNewData();
  527. })),
  528. ],
  529. );
  530. var footer = CustomUI.buildLoadingFooter();
  531. Widget diffView = TabBarView(
  532. children: <Widget>[
  533. SmartRefresher(
  534. enablePullDown: true,
  535. enablePullUp: true,
  536. header: MaterialClassicHeader(),
  537. footer: footer,
  538. controller: _scrollControllerNear,
  539. onRefresh: _onRefresh,
  540. onLoading: _onLoading,
  541. child:
  542. (_scrollControllerNear.headerStatus == RefreshStatus.completed &&
  543. listMap[1]['list'].length == 0)
  544. ? CustomUI.buildNoData(context)
  545. : ListView.builder(
  546. itemBuilder: _renderRowNear,
  547. itemCount: listMap[1]['list'].length,
  548. ),
  549. ),
  550. SmartRefresher(
  551. enablePullDown: true,
  552. enablePullUp: true,
  553. header: MaterialClassicHeader(),
  554. footer: footer,
  555. controller: _scrollControllerNew,
  556. onRefresh: _onRefresh,
  557. onLoading: _onLoading,
  558. child:
  559. (_scrollControllerNew.headerStatus == RefreshStatus.completed &&
  560. listMap[2]['list'].length == 0)
  561. ? CustomUI.buildNoData(context)
  562. : ListView.builder(
  563. itemBuilder: _renderRowNew,
  564. itemCount: listMap[2]['list'].length,
  565. ),
  566. ),
  567. SmartRefresher(
  568. enablePullDown: true,
  569. enablePullUp: true,
  570. header: MaterialClassicHeader(),
  571. footer: footer,
  572. controller: _scrollControllerApply,
  573. onRefresh: _onRefresh,
  574. onLoading: _onLoading,
  575. child:
  576. (_scrollControllerApply.headerStatus == RefreshStatus.completed &&
  577. listMap[3]['list'].length == 0)
  578. ? CustomUI.buildNoData(context)
  579. : ListView.builder(
  580. itemBuilder: _renderRowApply,
  581. itemCount: listMap[3]['list'].length,
  582. ),
  583. ),
  584. ],
  585. controller: diffTabCtrl,
  586. );
  587. Widget sampView = TabBarView(
  588. children: <Widget>[
  589. SmartRefresher(
  590. enablePullDown: true,
  591. enablePullUp: true,
  592. header: MaterialClassicHeader(),
  593. footer: footer,
  594. controller: _scrollControllerNear,
  595. onRefresh: _onRefresh,
  596. onLoading: _onLoading,
  597. child:
  598. (_scrollControllerNear.headerStatus == RefreshStatus.completed &&
  599. listMap[1]['list'].length == 0)
  600. ? CustomUI.buildNoData(context)
  601. : ListView.builder(
  602. itemBuilder: _renderRowNear,
  603. itemCount: listMap[1]['list'].length,
  604. ),
  605. ),
  606. SmartRefresher(
  607. enablePullDown: true,
  608. enablePullUp: true,
  609. header: MaterialClassicHeader(),
  610. footer: footer,
  611. controller: _scrollControllerVIP,
  612. onRefresh: _onRefresh,
  613. onLoading: _onLoading,
  614. child:
  615. (_scrollControllerVIP.headerStatus == RefreshStatus.completed &&
  616. listMap[4]['list'].length == 0)
  617. ? CustomUI.buildNoData(context)
  618. : ListView.builder(
  619. itemBuilder: _renderRowVIP,
  620. itemCount: listMap[4]['list'].length,
  621. ),
  622. ),
  623. ],
  624. controller: sameTabCtrl,
  625. );
  626. return Stack(
  627. children: <Widget>[
  628. Scaffold(
  629. appBar: _buildAppBar(),
  630. body: SafeArea(
  631. child: Stack(
  632. children: <Widget>[
  633. !isWomen ? sampView : diffView,
  634. isLoading ? CustomUI.buildLoaingAnim(context) : Container(),
  635. ],
  636. ),
  637. )),
  638. menu
  639. ],
  640. );
  641. }
  642. Widget _renderRow(int index, list, page) {
  643. if (index < list.length) {
  644. var userInfo = list[index];
  645. print('----------------------------------------------------');
  646. print(userInfo);
  647. return UserCard(
  648. key: UniqueKey(),
  649. userName: Provider.of<RefNameProvider>(context)
  650. .getRefName(userInfo['UserId'], userInfo['NickName']),
  651. city: WebData().getCountry(
  652. userInfo['Country']), //WebData().getCity(userInfo['City']),
  653. headUrl: userInfo['Headimgurl'],
  654. isReal: userInfo['IsAttestation'] == 1,
  655. constellation:
  656. WebData().getConstellation(context, userInfo['Constellation']),
  657. distance: userInfo['Distance'].toDouble(),
  658. age: userInfo['Age'],
  659. professional: WebData().getProffesionName(userInfo['Occupation']),
  660. isOnline: userInfo['OnlineStatus'] == 1
  661. ? I18n.of(context).online
  662. : WebData().getLoginTime(context, userInfo['LoginDate']),
  663. hiddenDistince: userInfo['DistanceStatus'] == 1,
  664. sex: userInfo['Sex'],
  665. isLove: userInfo['Follow'] == 0,
  666. isBalck: userInfo['Follow'] == 1,
  667. userId: userInfo['UserId'],
  668. payImg: userInfo['PhotoAut'] == 1,
  669. isHidden: userInfo['InfoAut'] == 1,
  670. member: userInfo['IsMember'],
  671. imgNum: userInfo['PhotoNum'],
  672. );
  673. }
  674. return Container();
  675. }
  676. Widget _renderRowNear(BuildContext context, int index) {
  677. return _renderRow(index, listMap[1]['list'], listMap[1]['page']);
  678. }
  679. Widget _renderRowNew(BuildContext context, int index) {
  680. return _renderRow(index, listMap[2]['list'], listMap[2]['page']);
  681. }
  682. Widget _renderRowApply(BuildContext context, int index) {
  683. return _renderRow(index, listMap[3]['list'], listMap[3]['page']);
  684. }
  685. Widget _renderRowVIP(BuildContext context, int index) {
  686. return _renderRow(index, listMap[4]['list'], listMap[4]['page']);
  687. }
  688. Future<Null> _onRefresh() async {
  689. getNewData();
  690. }
  691. }