search_bar.dart 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import 'package:flutter/material.dart';
  2. import 'package:fun_selfie_app/utils/api.dart';
  3. class SeachBarDelegate extends SearchDelegate<String> {
  4. String searchHint = '请输入搜索内容...';
  5. var suggestList = ['S2023062812', 'S202306243', 'S202307012', 'S202307051'];
  6. List searchList = [];
  7. @override
  8. String get searchFieldLabel => searchHint;
  9. //重写搜索框右上角方法
  10. @override
  11. List<Widget> buildActions(BuildContext context) {
  12. return [
  13. IconButton(
  14. icon: const Icon(Icons.clear),
  15. onPressed: () {
  16. if (query.isEmpty) return;
  17. query = "";
  18. showSuggestions(context);
  19. })
  20. ];
  21. }
  22. //重写左上角方法
  23. @override
  24. Widget buildLeading(BuildContext context) {
  25. return IconButton(
  26. icon: AnimatedIcon(
  27. icon: AnimatedIcons.menu_arrow, progress: transitionAnimation),
  28. onPressed: () {
  29. close(context, '');
  30. });
  31. }
  32. //重写键盘点击确认后方法
  33. @override
  34. Widget buildResults(BuildContext context) {
  35. return FutureBuilder(
  36. future: loadList(),
  37. builder: (context, AsyncSnapshot snapshot) {
  38. return ListView.builder(
  39. physics: const AlwaysScrollableScrollPhysics(),
  40. itemCount: searchList.isEmpty ? 1 : searchList.length,
  41. itemBuilder: (BuildContext context, int index) {
  42. if (searchList.isEmpty) return const Text('');
  43. Map obj = searchList[index];
  44. return ListTile(
  45. title: Text(obj['saleOrderNo']),
  46. subtitle: Text(obj['id']),
  47. onTap: () {
  48. Navigator.pushNamed(
  49. context, "/newsDetail/".toString() + obj['id']);
  50. });
  51. });
  52. });
  53. }
  54. //重写输入过程方法,在输入过程不断调用
  55. @override
  56. Widget buildSuggestions(BuildContext context) {
  57. return Container(
  58. margin: const EdgeInsets.only(left: 16, right: 16),
  59. child: ListView(
  60. primary: false,
  61. shrinkWrap: true,
  62. children: <Widget>[
  63. const SizedBox(height: 10),
  64. const Text("推荐活动:", style: TextStyle(fontSize: 20)),
  65. const SizedBox(height: 10),
  66. Wrap(
  67. spacing: 8,
  68. runSpacing: 8,
  69. children: suggestList.map((childNode) {
  70. return InkWell(
  71. child: ClipRRect(
  72. borderRadius: BorderRadius.circular(3),
  73. child: Container(
  74. padding: const EdgeInsets.all(3),
  75. color: Colors.grey,
  76. child: Text(
  77. childNode,
  78. style: const TextStyle(
  79. fontSize: 16,
  80. color: Colors.white,
  81. shadows: [
  82. BoxShadow(
  83. color: Colors.grey, offset: Offset(0.2, 0.2))
  84. ]),
  85. ),
  86. ),
  87. ),
  88. onTap: () {
  89. loadList();
  90. Future.delayed(const Duration(seconds: 1), () async {
  91. searchHint = '';
  92. query = childNode;
  93. showResults(context);
  94. });
  95. },
  96. );
  97. }).toList(),
  98. )
  99. ],
  100. ),
  101. );
  102. }
  103. loadList() async {
  104. try {
  105. var params = {
  106. "pageNo": 1,
  107. "pageSize": 20,
  108. "status": 'READY',
  109. "saleOrderNo": query
  110. };
  111. var res = await UtilHelper.updateList(params);
  112. searchList = res['records'];
  113. } catch (err) {
  114. debugPrint(err.toString());
  115. }
  116. }
  117. }