Hibok
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 
 
 

297 linhas
11 KiB

  1. import 'package:chat/data/UserData.dart';
  2. import 'package:chat/data/group_data_mgr.dart';
  3. import 'package:chat/models/friends_info.dart';
  4. import 'package:chat/models/group_info_model.dart';
  5. import 'package:chat/utils/HttpUtil.dart';
  6. import 'package:chat/utils/conversation_table.dart';
  7. import 'package:chat/utils/friend_list_mgr.dart';
  8. import 'package:chat/utils/screen.dart';
  9. import 'package:flutter/material.dart';
  10. import 'package:chat/data/constants.dart';
  11. import 'package:chat/generated/i18n.dart';
  12. import 'package:chat/utils/CustomUI.dart';
  13. import 'package:flutter/services.dart';
  14. import 'ProfilePage.dart';
  15. import 'group_item_widget.dart';
  16. import 'package:chat/models/ref_name_provider.dart';
  17. import 'package:provider/provider.dart';
  18. class GlobalSearchPage extends StatefulWidget {
  19. final int type;
  20. GlobalSearchPage({Key key, @required this.type}) : super(key: key);
  21. @override
  22. _GlobalSearchPageState createState() => _GlobalSearchPageState();
  23. }
  24. class _GlobalSearchPageState extends State<GlobalSearchPage> {
  25. ScrollController _scrollController = ScrollController();
  26. TextEditingController _txtCtrl = new TextEditingController();
  27. bool _hasdeleteIcon = false;
  28. FocusNode focusNode;
  29. List searchList = [];
  30. String searchStr = '';
  31. @override
  32. void initState() {
  33. super.initState();
  34. _scrollController = new ScrollController();
  35. focusNode = new FocusNode();
  36. }
  37. @override
  38. void dispose() {
  39. _scrollController.dispose();
  40. focusNode.dispose();
  41. super.dispose();
  42. }
  43. //群搜索结果
  44. Widget _buildSearchGroupBody() {
  45. return ListView.builder(
  46. controller: _scrollController,
  47. itemBuilder: (BuildContext context, int index) {
  48. GroupInfoModel _contact = searchList[index];
  49. return GroupItem(Key('Item${_contact.sessionId}'),
  50. groupInfoModel: _contact);
  51. },
  52. itemCount: searchList.length,
  53. );
  54. }
  55. //好友搜索结果
  56. Widget _buildSearchMyfriendsBody() {
  57. return ListView.builder(
  58. controller: _scrollController,
  59. itemBuilder: (BuildContext context, int index) {
  60. FriendModel _contact = searchList[index];
  61. return FriendsInfo(
  62. userId: _contact.friendId,
  63. avatar: _contact.avatar,
  64. title: Provider.of<RefNameProvider>(context)
  65. .getRefName(_contact.friendId, _contact.name),
  66. isShowDivder: true,
  67. groupTitle: null);
  68. },
  69. itemCount: searchList.length,
  70. );
  71. }
  72. //通过手机号搜索新用户结果
  73. Widget _buildSearchNewfriendsBody() {
  74. if (searchStr == '') return Container();
  75. return InkWell(
  76. onTap: () {
  77. HttpUtil().searchNewFrindsByPhone(searchStr, (int userId) {
  78. if (userId == null || userId == 0) {
  79. CustomUI.buildOneConfirm(context, I18n.of(context).not_have_user,
  80. I18n.of(context).determine, () {
  81. Navigator.of(context).pop();
  82. });
  83. return;
  84. }
  85. if (userId == UserData().basicInfo.userId) {
  86. CustomUI.buildOneConfirm(context, I18n.of(context).not_add_Myself,
  87. I18n.of(context).determine, () {
  88. Navigator.of(context).pop();
  89. });
  90. return;
  91. }
  92. Navigator.of(context).push(
  93. new MaterialPageRoute(
  94. builder: (context) {
  95. return ProfilePage(userId: userId, addMode: 3);
  96. },
  97. ),
  98. );
  99. });
  100. },
  101. child: Container(
  102. margin: EdgeInsets.only(top: 9),
  103. height: 55.1,
  104. width: Screen.width,
  105. child: Row(
  106. mainAxisAlignment: MainAxisAlignment.start,
  107. children: <Widget>[
  108. Container(
  109. margin: EdgeInsets.only(left: 20,right: 13),
  110. width: Constants.ContactAvatarSize,
  111. height: Constants.ContactAvatarSize,
  112. decoration: BoxDecoration(
  113. gradient: LinearGradient(
  114. begin: Alignment.topCenter,
  115. end: Alignment.bottomCenter,
  116. colors: <Color>[
  117. const Color(0xFF58B7F5),
  118. const Color(0xFF1874C9),
  119. ]),
  120. borderRadius: BorderRadius.circular(6)),
  121. child: Icon(
  122. IconData(0xe662, fontFamily: Constants.IconFontFamily),
  123. color: Colors.white,
  124. ),
  125. ),
  126. Container(
  127. child: Text('${I18n.of(context).search_phone}: ',
  128. style: TextStyle(fontSize: 16.23)),
  129. ),
  130. Container(
  131. margin: EdgeInsets.only(top: 5),
  132. child: Text(searchStr,
  133. style: TextStyle(
  134. fontSize: 16.23, color: Color(0xFF008AFF))))
  135. ],
  136. ),
  137. color: Colors.white));
  138. }
  139. Widget buildBody() {
  140. Widget result = Container();
  141. switch (widget.type) {
  142. case GlobalSearchPageType.SearchGroup:
  143. result = _buildSearchGroupBody();
  144. break;
  145. case GlobalSearchPageType.SearchMyFriends:
  146. result = _buildSearchMyfriendsBody();
  147. break;
  148. case GlobalSearchPageType.SearchNewFriends:
  149. result = _buildSearchNewfriendsBody();
  150. break;
  151. default:
  152. }
  153. return result;
  154. }
  155. //开始搜索群
  156. _beginSearchGroup(String str) {
  157. Map refMap = Provider.of<RefNameProvider>(context).refMap;
  158. List<GroupInfoModel> groupList = GroupInfoMgr().groupInfoList;
  159. searchList = CustomUI()
  160. .getGroupSearchResult(str, groupList == null ? [] : groupList, refMap);
  161. }
  162. //开始搜索自己好友
  163. _beginSearchMyFriends(String str) async {
  164. List<FriendModel> friendList = [];
  165. friendList = await FriendListMgr().getFriendList();
  166. searchList =
  167. CustomUI().getSearchResult(str, friendList == null ? [] : friendList);
  168. }
  169. beginSearch(String str) {
  170. switch (widget.type) {
  171. case GlobalSearchPageType.SearchGroup:
  172. _beginSearchGroup(str);
  173. break;
  174. case GlobalSearchPageType.SearchMyFriends:
  175. _beginSearchMyFriends(str);
  176. break;
  177. default:
  178. }
  179. }
  180. @override
  181. Widget build(BuildContext context) {
  182. final List<Widget> _body = [];
  183. _body.add(buildBody());
  184. return Scaffold(
  185. resizeToAvoidBottomPadding: false,
  186. appBar: AppBar(
  187. backgroundColor: AppColors.NewAppbarBgColor,
  188. title: Text(I18n.of(context).search,
  189. textScaleFactor: 1.0, style: Constants.MainTitleStyle),
  190. centerTitle: true,
  191. elevation: 1,
  192. leading: CustomUI.buildCustomLeading(context),
  193. bottom: PreferredSize(
  194. preferredSize: Size.fromHeight(49),
  195. child: Container(
  196. alignment: Alignment.center,
  197. margin: EdgeInsets.only(bottom: 14, left: 12.5, right: 12.5),
  198. height: 35,
  199. decoration: BoxDecoration(
  200. color: const Color(0xFFEEEEEE),
  201. borderRadius: BorderRadius.all(Radius.circular(8))),
  202. child: TextField(
  203. keyboardType: TextInputType.text,
  204. cursorColor: Constants.BlueTextColor,
  205. textInputAction: TextInputAction.search,
  206. controller: _txtCtrl,
  207. maxLines: 1,
  208. focusNode: focusNode,
  209. style: TextStyle(
  210. textBaseline: TextBaseline.alphabetic, fontSize: 14.5),
  211. autofocus: true,
  212. inputFormatters:
  213. widget.type == GlobalSearchPageType.SearchNewFriends
  214. ? [
  215. WhitelistingTextInputFormatter.digitsOnly,
  216. LengthLimitingTextInputFormatter(15),
  217. ]
  218. : [
  219. LengthLimitingTextInputFormatter(50),
  220. ],
  221. decoration: InputDecoration(
  222. hintText: I18n.of(context).search,
  223. hintStyle: TextStyle(fontSize: 14.5),
  224. contentPadding: EdgeInsets.only(
  225. left: 20,
  226. top: (UserData().language == LanguageType.English ||
  227. UserData().language ==
  228. LanguageType.Vietnamese)
  229. ? 3
  230. : 10.5,
  231. bottom: 10.5),
  232. prefixIcon: Icon(
  233. IconData(
  234. 0xe664,
  235. fontFamily: Constants.IconFontFamily,
  236. ),
  237. color: const Color(0xFFA0A0A0),
  238. size: 18,
  239. ),
  240. suffixIcon: Padding(
  241. padding: EdgeInsetsDirectional.only(
  242. start: 2.0, end: _hasdeleteIcon ? 20.0 : 0),
  243. child: _hasdeleteIcon
  244. ? new InkWell(
  245. onTap: (() {
  246. setState(() {
  247. WidgetsBinding.instance
  248. .addPostFrameCallback(
  249. (_) => _txtCtrl.clear());
  250. _hasdeleteIcon = false;
  251. });
  252. }),
  253. child: Icon(
  254. Icons.clear,
  255. size: 18.0,
  256. color: Constants.BlackTextColor,
  257. ))
  258. : new Text('')),
  259. ),
  260. onChanged: (str) async {
  261. setState(() {
  262. searchStr = str;
  263. if (str.isEmpty) {
  264. _hasdeleteIcon = false;
  265. } else {
  266. _hasdeleteIcon = true;
  267. beginSearch(str);
  268. }
  269. });
  270. },
  271. onEditingComplete: () {
  272. FocusScope.of(context).requestFocus(FocusNode());
  273. }),
  274. )),
  275. ),
  276. body: Stack(
  277. children: _body,
  278. ));
  279. }
  280. }