基础组件库
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 
 

224 wiersze
8.5 KiB

  1. import 'dart:convert';
  2. import 'package:flutter/material.dart';
  3. import 'package:zhiying_base_widget/widgets/custom/banner/model/custom_banner_model.dart';
  4. import 'package:zhiying_comm/zhiying_comm.dart';
  5. ///
  6. /// 通用的BannerWidget
  7. ///
  8. class CustomBannerWidget extends StatelessWidget {
  9. final Map<String, dynamic> data;
  10. CustomBannerModel _model;
  11. CustomBannerWidget(this.data, {Key key}) : super(key: key) {
  12. try {
  13. _model = CustomBannerModel.fromJson(jsonDecode(data['data']));
  14. } catch (e, s) {
  15. Logger.warn(e, s);
  16. }
  17. }
  18. /// 点击事件
  19. void _itemOnClick(BuildContext context, CustomBannerListStyle model) {
  20. print('${model?.skipIdentifier}');
  21. RouterUtil.route(model, model.toJson(), context);
  22. }
  23. @override
  24. Widget build(BuildContext context) {
  25. /// 空视图
  26. if (EmptyUtil.isEmpty(_model)) {
  27. return Container();
  28. }
  29. return Container(
  30. width: double.infinity,
  31. // height: 98,
  32. margin: EdgeInsets.only(top: ParseUtil.stringParseDouble(_model?.topMargin)),
  33. padding: EdgeInsets.symmetric(horizontal: ParseUtil.stringParseDouble(_model?.leftRightMargin, defVal: 12.5)),
  34. decoration: BoxDecoration(
  35. // color: Colors.red,
  36. borderRadius: BorderRadius.only(
  37. bottomLeft: Radius.circular(ParseUtil.stringParseDouble(_model?.bottomLeftRadius)),
  38. bottomRight: Radius.circular(ParseUtil.stringParseDouble(_model?.bottomRightRadius)),
  39. topLeft: Radius.circular(ParseUtil.stringParseDouble(_model?.topLeftRadius)),
  40. topRight: Radius.circular(ParseUtil.stringParseDouble(_model?.topRightRadius)),
  41. )),
  42. child: _buildMainWidget(context, _model?.moduleType, _model?.listStyle),
  43. );
  44. }
  45. /// 主视图
  46. Widget _buildMainWidget(BuildContext context, String moduleType, List<CustomBannerListStyle> listStyle) {
  47. if (EmptyUtil.isEmpty(listStyle)) return Container();
  48. Widget rlt;
  49. switch (moduleType) {
  50. case 'banner1':
  51. rlt = _buildStyle1(context, listStyle);
  52. break;
  53. case 'banner2':
  54. rlt = _buildStyle2(context, listStyle);
  55. break;
  56. case 'banner3':
  57. rlt = _buildStyle3(context, listStyle);
  58. break;
  59. case 'banner4':
  60. rlt = _buildStyle4(context, listStyle);
  61. break;
  62. case 'banner5':
  63. rlt = _buildStyle5(context, listStyle);
  64. break;
  65. case 'banner6':
  66. rlt = _buildStyle6(context, listStyle);
  67. break;
  68. case 'banner7':
  69. rlt = _buildStyle7(context, listStyle);
  70. break;
  71. case 'banner8':
  72. rlt = _buildStyle8(context, listStyle);
  73. break;
  74. default:
  75. rlt = Container();
  76. break;
  77. }
  78. return rlt;
  79. }
  80. /// 1张图
  81. Widget _buildStyle1(BuildContext context, List<CustomBannerListStyle> listStyle) {
  82. return _buildColumnWidget(context, listStyle);
  83. }
  84. /// 左1右1
  85. Widget _buildStyle2(BuildContext context, List<CustomBannerListStyle> listStyle) {
  86. return _buildColumnWidget(context, listStyle);
  87. }
  88. /// 左1右2
  89. Widget _buildStyle3(BuildContext context, List<CustomBannerListStyle> listStyle) {
  90. CustomBannerListStyle left1 = listStyle.firstWhere((element) => element.locationType == 'left1');
  91. CustomBannerListStyle right1 = listStyle.firstWhere((element) => element.locationType == 'right1');
  92. CustomBannerListStyle right2 = listStyle.firstWhere((element) => element.locationType == 'right2');
  93. if (EmptyUtil.isEmpty(left1) || EmptyUtil.isEmpty(right1) || EmptyUtil.isEmpty(right2)) return Container();
  94. return Row(
  95. children: <Widget>[
  96. // Flexible(flex: 1, child: GestureDetector(onTap: () => _itemOnClick(context, left1), child: CachedNetworkImage(imageUrl: left1?.img ?? ''))),
  97. Flexible(flex: 1, child: _buildSingleWidthWidget(context, left1)),
  98. Flexible(
  99. flex: 1,
  100. child: Column(
  101. children: <Widget>[
  102. Flexible(flex: 1, child: GestureDetector(onTap: () => _itemOnClick(context, right1), child: CachedNetworkImage(imageUrl: right1?.img ?? ''))),
  103. Flexible(flex: 1, child: GestureDetector(onTap: () => _itemOnClick(context, right2), child: CachedNetworkImage(imageUrl: right2?.img ?? ''))),
  104. ],
  105. ),
  106. ),
  107. ],
  108. );
  109. }
  110. /// 左2右1
  111. Widget _buildStyle4(BuildContext context, List<CustomBannerListStyle> listStyle) {
  112. CustomBannerListStyle left1 = listStyle.firstWhere((element) => element.locationType == 'left1');
  113. CustomBannerListStyle left2 = listStyle.firstWhere((element) => element.locationType == 'left2');
  114. CustomBannerListStyle right1 = listStyle.firstWhere((element) => element.locationType == 'right1');
  115. if (EmptyUtil.isEmpty(left1) || EmptyUtil.isEmpty(right1) || EmptyUtil.isEmpty(left2)) return Container();
  116. return Row(
  117. children: <Widget>[
  118. Flexible(
  119. flex: 1,
  120. child: Column(
  121. children: <Widget>[
  122. Flexible(flex: 1, child: GestureDetector(onTap: () => _itemOnClick(context, left1), child: CachedNetworkImage(imageUrl: left1?.img ?? ''))),
  123. Flexible(flex: 1, child: GestureDetector(onTap: () => _itemOnClick(context, left2), child: CachedNetworkImage(imageUrl: left2?.img ?? ''))),
  124. ],
  125. ),
  126. ),
  127. // Flexible(flex: 1, child: GestureDetector(onTap: () => _itemOnClick(context, right1), child: CachedNetworkImage(imageUrl: right1?.img ?? ''))),
  128. Flexible(flex: 1, child: _buildSingleWidthWidget(context, right1)),
  129. ],
  130. );
  131. }
  132. /// 左1右3
  133. Widget _buildStyle5(BuildContext context, List<CustomBannerListStyle> listStyle) {
  134. CustomBannerListStyle left1 = listStyle.firstWhere((element) => element.locationType == 'left1');
  135. CustomBannerListStyle right1 = listStyle.firstWhere((element) => element.locationType == 'right1');
  136. CustomBannerListStyle right2 = listStyle.firstWhere((element) => element.locationType == 'right2');
  137. CustomBannerListStyle right3 = listStyle.firstWhere((element) => element.locationType == 'right3');
  138. if (EmptyUtil.isEmpty(left1) || EmptyUtil.isEmpty(right1) || EmptyUtil.isEmpty(right2) || EmptyUtil.isEmpty(right3)) return Container();
  139. return Row(
  140. children: <Widget>[
  141. // Flexible(flex: 4, child: GestureDetector(onTap: () => _itemOnClick(context, left1), child: CachedNetworkImage(imageUrl: left1?.img ?? ''))),
  142. Flexible(flex: 4, child: _buildSingleWidthWidget(context, left1)),
  143. Flexible(
  144. flex: 6,
  145. child: Column(
  146. children: <Widget>[
  147. Flexible(flex: 1, child: GestureDetector(onTap: () => _itemOnClick(context, right1), child: CachedNetworkImage(imageUrl: right1?.img ?? ''))),
  148. Row(
  149. children: <Widget>[
  150. Flexible(flex: 1, child: GestureDetector(onTap: () => _itemOnClick(context, right2), child: CachedNetworkImage(imageUrl: right2?.img ?? ''))),
  151. Flexible(flex: 1, child: GestureDetector(onTap: () => _itemOnClick(context, right3), child: CachedNetworkImage(imageUrl: right3?.img ?? ''))),
  152. ],
  153. )
  154. ],
  155. ),
  156. )
  157. ],
  158. );
  159. }
  160. /// 3列
  161. Widget _buildStyle6(BuildContext context, List<CustomBannerListStyle> listStyle) {
  162. return _buildColumnWidget(context, listStyle);
  163. }
  164. /// 4列
  165. Widget _buildStyle7(BuildContext context, List<CustomBannerListStyle> listStyle) {
  166. return _buildColumnWidget(context, listStyle);
  167. }
  168. /// 5列
  169. Widget _buildStyle8(BuildContext context, List<CustomBannerListStyle> listStyle) {
  170. return _buildColumnWidget(context, listStyle);
  171. }
  172. /// 列的通用
  173. Widget _buildColumnWidget(BuildContext context, List<CustomBannerListStyle> listStyle) {
  174. return Row(
  175. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  176. children: listStyle
  177. .map((e) => Flexible(
  178. flex: 1,
  179. child: GestureDetector(
  180. behavior: HitTestBehavior.opaque,
  181. onTap: () => _itemOnClick(context, e),
  182. child: Container(
  183. width: double.infinity,
  184. child: CachedNetworkImage(
  185. imageUrl: e?.img ?? '',
  186. )),
  187. ),
  188. ))
  189. .toList(),
  190. );
  191. }
  192. /// 单个
  193. Widget _buildSingleWidthWidget(BuildContext context, CustomBannerListStyle listStyle){
  194. return GestureDetector(
  195. behavior: HitTestBehavior.opaque,
  196. onTap: ()=> _itemOnClick(context, listStyle),
  197. child: Container(
  198. width: double.infinity,
  199. child: CachedNetworkImage(
  200. imageUrl: listStyle?.img ?? '',
  201. ),
  202. ),
  203. );
  204. }
  205. }