基础组件库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

custom_search_widget.dart 5.1 KiB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. import 'dart:convert';
  2. import 'package:flutter/material.dart';
  3. import 'package:zhiying_base_widget/widgets/custom/search/model/custom_search_model.dart';
  4. import 'package:zhiying_comm/zhiying_comm.dart';
  5. ///
  6. /// 通用模块的搜索栏
  7. ///
  8. class CustomSearchWidget extends StatelessWidget {
  9. final Map<String, dynamic> data;
  10. CustomSearchModel model;
  11. CustomSearchWidget(this.data, {Key key}) : super(key: key) {
  12. try {
  13. model = CustomSearchModel.fromJson(jsonDecode(data['data']));
  14. } catch (e, s) {
  15. Logger.warn(e, s);
  16. }
  17. }
  18. // 点击事件
  19. void _onClickListener(BuildContext context, SkipModel skipModel) {
  20. if (!EmptyUtil.isEmpty(skipModel)) {
  21. RouterUtil.route(skipModel, model.toJson(), context);
  22. }
  23. }
  24. @override
  25. Widget build(BuildContext context) {
  26. return Container(
  27. width: double.infinity,
  28. padding: EdgeInsets.symmetric(horizontal: ParseUtil.stringParseDouble(model?.leftRightMargin, defVal: 12.5), vertical: 4),
  29. margin: EdgeInsets.only(top: ParseUtil.stringParseDouble(model?.topMargin)),
  30. decoration: BoxDecoration(
  31. color: HexColor.fromHex(model?.bgColor),
  32. // color: Colors.blueAccent,
  33. borderRadius: BorderRadius.only(
  34. bottomRight: Radius.circular(ParseUtil.stringParseDouble(model?.bottomRightRadius)),
  35. bottomLeft: Radius.circular(ParseUtil.stringParseDouble(model?.bottomLeftRadius)),
  36. topLeft: Radius.circular(ParseUtil.stringParseDouble(model?.topLeftRadius)),
  37. topRight: Radius.circular(ParseUtil.stringParseDouble(model?.topRightRadius)),
  38. )),
  39. child: _buildMainWidget(context));
  40. }
  41. Widget _buildMainWidget(BuildContext context) {
  42. if (EmptyUtil.isEmpty(model)) return Container();
  43. Widget rlt;
  44. switch (model.moduleType) {
  45. case 'search_1': // 右1图标
  46. rlt = _buildStyle1Widget(context);
  47. break;
  48. case 'search_2': // 无图标
  49. rlt = _buildStyle2Widget(context);
  50. break;
  51. case 'search_3': // 左1右1图标
  52. rlt = _buildStyle3Widget(context);
  53. break;
  54. case 'search_4': // 右按钮
  55. rlt = _buildStyle4Widget(context);
  56. break;
  57. default:
  58. rlt = Container();
  59. break;
  60. }
  61. return rlt;
  62. }
  63. /// 左1右1图标
  64. Widget _buildStyle3Widget(BuildContext context) {
  65. return Container();
  66. }
  67. /// 右按钮
  68. Widget _buildStyle4Widget(BuildContext context) {
  69. return Container();
  70. }
  71. /// 右1图标
  72. Widget _buildStyle1Widget(BuildContext context) {
  73. return Row(
  74. children: <Widget>[
  75. Expanded(
  76. child: GestureDetector(
  77. onTap: () => _onClickListener(context, model?.listStyle?.searchCss),
  78. behavior: HitTestBehavior.opaque,
  79. child: Container(
  80. // height: 30,
  81. width: double.infinity,
  82. padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 9),
  83. decoration: BoxDecoration(borderRadius: BorderRadius.circular(60 / 2), color: HexColor.fromHex(model?.listStyle?.searchCss?.bgColor)),
  84. child: Row(
  85. children: <Widget>[
  86. CachedNetworkImage(
  87. width: 13,
  88. height: 13,
  89. imageUrl: model?.listStyle?.searchCss?.image ?? '',
  90. ),
  91. SizedBox(width: 4),
  92. Text(model?.listStyle?.searchCss?.text ?? '输入搜索内容,领券省钱', style: TextStyle(fontSize: 13, color: HexColor.fromHex(model?.listStyle?.searchCss?.textColor??"#FFFFFF")))
  93. ],
  94. ),
  95. ),
  96. )),
  97. SizedBox(width: 10),
  98. GestureDetector(
  99. onTap: () => _onClickListener(context, model?.listStyle?.rightCss),
  100. child: CachedNetworkImage(
  101. width: 30,
  102. height: 30,
  103. imageUrl: model?.listStyle?.rightCss?.image ?? '',
  104. )),
  105. ],
  106. );
  107. }
  108. /// 无图标
  109. Widget _buildStyle2Widget(BuildContext context) {
  110. return GestureDetector(
  111. behavior: HitTestBehavior.opaque,
  112. onTap: () => _onClickListener(context, model?.listStyle?.searchCss),
  113. child: Container(
  114. width: double.infinity,
  115. child: Container(
  116. width: double.infinity,
  117. decoration: BoxDecoration(
  118. borderRadius: BorderRadius.circular(40),
  119. color: HexColor.fromHex(model?.listStyle?.searchCss?.bgColor ?? '#F9F9F9'),
  120. ),
  121. padding: const EdgeInsets.symmetric(vertical: 6),
  122. child: Row(
  123. mainAxisAlignment: MainAxisAlignment.center,
  124. children: <Widget>[
  125. /// 搜索按钮
  126. CachedNetworkImage(
  127. imageUrl: model?.listStyle?.searchCss?.image ?? '',
  128. height: 20,
  129. width: 20,
  130. ),
  131. const SizedBox(width: 7.5),
  132. /// 提示文字
  133. Text(
  134. model?.listStyle?.searchCss?.text ?? '搜索更多优惠商品',
  135. style: TextStyle(fontSize: 14, color: HexColor.fromHex(model?.listStyle?.searchCss?.textColor ?? '#999999')),
  136. )
  137. ],
  138. ),
  139. ),
  140. ),
  141. );
  142. }
  143. }