view.dart 8.0 KB

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