view.dart 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. import 'package:electronic_assistant/base/base_page.dart';
  2. import 'package:electronic_assistant/utils/expand.dart';
  3. import 'package:flutter/cupertino.dart';
  4. import 'package:flutter/gestures.dart';
  5. import 'package:flutter/material.dart';
  6. import 'package:flutter_screenutil/flutter_screenutil.dart';
  7. import 'package:get/get.dart';
  8. import 'package:pull_to_refresh/pull_to_refresh.dart';
  9. import '../../../data/bean/talks.dart';
  10. import '../../../data/consts/Constants.dart';
  11. import '../../../resource/assets.gen.dart';
  12. import '../../../resource/colors.gen.dart';
  13. import '../../../resource/string.gen.dart';
  14. import '../common_view.dart';
  15. import 'controller.dart';
  16. class HomeTalkView extends BasePage<HomeTalkController> {
  17. const HomeTalkView({super.key});
  18. @override
  19. bool immersive() {
  20. return true;
  21. }
  22. @override
  23. Color backgroundColor() {
  24. return '#F6F5F8'.color;
  25. }
  26. @override
  27. Widget buildBody(BuildContext context) {
  28. return Obx(() {
  29. return SmartRefresher(
  30. controller: controller.refreshController,
  31. enablePullUp: false,
  32. onRefresh: controller.onRefresh,
  33. enablePullDown: true,
  34. child: ListView(
  35. padding: EdgeInsets.only(left: 12.w, top: 4.w, right: 12.w),
  36. children: [
  37. for (var value in controller.talkList.length > 10
  38. ? controller.talkList.sublist(0, 10)
  39. : controller.talkList)
  40. _buildTalkView(value),
  41. _buildSeeMoreView()
  42. ],
  43. ));
  44. });
  45. }
  46. Widget _buildSeeMoreView() {
  47. return Obx(() {
  48. if (controller.talkList.isNotEmpty) {
  49. return Container(
  50. alignment: Alignment.center,
  51. padding: EdgeInsets.only(
  52. top: 16.w, bottom: 100.w + Constants.bottomBarHeight),
  53. child: _buildMoreView(),
  54. );
  55. } else {
  56. return homeEmptyView(StringName.homeTalkNoData.tr, _buildMoreView());
  57. }
  58. });
  59. }
  60. Widget _buildMoreView() {
  61. return RichText(
  62. text: TextSpan(
  63. text: StringName.homeTalkSeeMoreTxt.tr,
  64. style: TextStyle(color: ColorName.secondaryTextColor, fontSize: 12.sp),
  65. children: <TextSpan>[
  66. TextSpan(
  67. text: StringName.homeTalkAll.tr,
  68. style: TextStyle(color: ColorName.colorPrimary, fontSize: 12.sp),
  69. recognizer: TapGestureRecognizer()
  70. ..onTap = () {
  71. controller.onGoTalkSeeAll();
  72. }),
  73. ],
  74. ),
  75. );
  76. }
  77. Widget _buildTalkView(TalkBean item) {
  78. return _buildTalkItem(item, onLongPressStart: (details) {
  79. controller.onLongPressTalkItem(item, details);
  80. }, onItemClick: () {
  81. controller.onTalkItemClick(item);
  82. });
  83. }
  84. Widget _buildTalkItem(TalkBean item,
  85. {VoidCallback? onItemClick,
  86. GestureLongPressStartCallback? onLongPressStart}) {
  87. return GestureDetector(
  88. onTap: onItemClick,
  89. onLongPressStart: onLongPressStart,
  90. child: Container(
  91. margin: EdgeInsets.only(bottom: 8.w),
  92. decoration: BoxDecoration(
  93. color: Colors.white,
  94. borderRadius: BorderRadius.all(Radius.circular(12.w)),
  95. ),
  96. child: Stack(
  97. children: [
  98. Padding(
  99. padding: EdgeInsets.symmetric(horizontal: 12.w),
  100. child: Column(
  101. crossAxisAlignment: CrossAxisAlignment.start,
  102. children: [
  103. SizedBox(height: 16.w),
  104. Text(
  105. item.title.value.orEmpty,
  106. style: TextStyle(
  107. fontSize: 15.sp,
  108. color: ColorName.primaryTextColor,
  109. fontWeight: FontWeight.bold),
  110. maxLines: 1,
  111. overflow: TextOverflow.ellipsis,
  112. ),
  113. SizedBox(height: 4.w),
  114. RichText(
  115. maxLines: 2,
  116. overflow: TextOverflow.ellipsis,
  117. text: TextSpan(
  118. children: [
  119. WidgetSpan(
  120. alignment: PlaceholderAlignment.middle,
  121. child: Container(
  122. decoration: BoxDecoration(
  123. gradient: RadialGradient(
  124. center: Alignment.centerRight,
  125. colors: [
  126. "#E7EEFF".toColor(),
  127. "#F4E8FF".toColor()
  128. ],
  129. radius: 2),
  130. borderRadius: BorderRadius.circular(4.w)),
  131. padding: EdgeInsets.symmetric(
  132. horizontal: 5.w, vertical: 2.w),
  133. margin: EdgeInsets.only(right: 4.w),
  134. child: ShaderMask(
  135. shaderCallback: (bounds) {
  136. return LinearGradient(
  137. colors: ['#9075FF'.color, '#4366FF'.color],
  138. ).createShader(bounds);
  139. },
  140. blendMode: BlendMode.srcIn,
  141. child: Text(
  142. StringName.talkSummary.tr,
  143. style: TextStyle(fontSize: 11.sp, height: 1),
  144. ),
  145. ),
  146. ),
  147. ),
  148. TextSpan(
  149. text: item.summary.value.orEmpty,
  150. style: TextStyle(
  151. fontSize: 12.sp, color: '#969699'.color),
  152. ),
  153. ],
  154. ),
  155. ),
  156. SizedBox(height: 6.w),
  157. Row(
  158. crossAxisAlignment: CrossAxisAlignment.center,
  159. children: [
  160. Assets.images.iconTalkHomeSmallRecord
  161. .image(width: 14.w, height: 14.w),
  162. SizedBox(width: 2.w),
  163. Text(item.duration.toFormattedDuration(),
  164. style: TextStyle(
  165. fontSize: 11.sp, color: '#969699'.color)),
  166. SizedBox(width: 2.w),
  167. Text('·',
  168. style: TextStyle(
  169. fontSize: 11.sp, color: '#969699'.color)),
  170. SizedBox(width: 2.w),
  171. Text(item.createTime.orEmpty,
  172. style: TextStyle(
  173. fontSize: 11.sp, color: '#969699'.color)),
  174. ],
  175. ),
  176. SizedBox(height: 15.w)
  177. ],
  178. ),
  179. ),
  180. Visibility(
  181. visible: item.isExample.isTrue,
  182. child: Align(
  183. alignment: Alignment.topRight,
  184. child: Container(
  185. padding:
  186. EdgeInsets.symmetric(vertical: 2.w, horizontal: 10.w),
  187. decoration: BoxDecoration(
  188. color: "#F0F0FA".toColor(),
  189. borderRadius: const BorderRadius.only(
  190. topRight: Radius.circular(12),
  191. bottomLeft: Radius.circular(12))),
  192. child: Text(StringName.homeTalkExample.tr,
  193. style: TextStyle(
  194. height: 1,
  195. fontSize: 12.sp,
  196. color: '#A7ACBF'.color)),
  197. ),
  198. ),
  199. )
  200. ],
  201. )),
  202. );
  203. }
  204. }