news_page.dart 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. import 'dart:ui';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter/src/widgets/framework.dart';
  4. import 'package:flutter/widgets.dart';
  5. import 'package:flutter_screenutil/flutter_screenutil.dart';
  6. import 'package:get/get.dart';
  7. import 'package:get/get_core/src/get_main.dart';
  8. import 'package:location/base/base_page.dart';
  9. import 'package:location/utils/common_expand.dart';
  10. import '../../resource/assets.gen.dart';
  11. import '../../resource/colors.gen.dart';
  12. import '../../resource/string.gen.dart';
  13. import '../../router/app_pages.dart';
  14. import '../../widget/common_view.dart';
  15. import 'news_controller.dart';
  16. import 'news_list_item.dart';
  17. class NewsPage extends BasePage<NewsController> {
  18. const NewsPage({super.key});
  19. static void start() {
  20. Get.toNamed(RoutePath.news);
  21. }
  22. @override
  23. bool immersive() {
  24. return true;
  25. }
  26. @override
  27. Widget buildBody(BuildContext context) {
  28. return Stack(
  29. children: [
  30. Assets.images.bgPageBackground.image(width: double.infinity),
  31. Positioned(
  32. top: 24.w,
  33. right: 19.w,
  34. child: SafeArea(child: Obx(() {
  35. return Visibility(
  36. visible: controller.waitingNewsCount > 0 ||
  37. controller.messageList.isNotEmpty,
  38. child: Opacity(
  39. opacity: 1 - controller.opacity,
  40. child: Assets.images.iconNews.image(width: 118.w)),
  41. );
  42. }))),
  43. SafeArea(
  44. child: Column(
  45. children: [
  46. buildHeadView(),
  47. Obx(() {
  48. return Expanded(
  49. child: controller.waitingNewsCount == 0 &&
  50. controller.messageList.isEmpty
  51. ? buildNoMessageView()
  52. : buildHasMessageView());
  53. }),
  54. SizedBox(
  55. height:18.w + 46.w + 10.w,
  56. )
  57. ],
  58. ),
  59. ),
  60. Positioned(
  61. bottom: MediaQuery.of(Get.context!).padding.bottom + 18.w,
  62. left: 0,
  63. right: 0,
  64. height: 46.w,
  65. child: GestureDetector(
  66. onTap: () {
  67. controller.onAddJumpToAddNewFriend();
  68. },
  69. child: Container(
  70. decoration: BoxDecoration(
  71. color: "#7B7DFF".color,
  72. borderRadius: BorderRadius.circular(10.w),
  73. ),
  74. margin: EdgeInsets.symmetric(horizontal: 15.w),
  75. height: 46.w,
  76. alignment: Alignment.center,
  77. child: Text("添加好友",
  78. style: TextStyle(
  79. fontSize: 14.sp,
  80. color: '#FFFFFF'.color,
  81. fontWeight: FontWeight.w500)
  82. ),
  83. ),
  84. )),
  85. ],
  86. );
  87. }
  88. CustomScrollView buildHasMessageView() {
  89. return CustomScrollView(
  90. controller: controller.scrollController,
  91. slivers: [
  92. buildSliverTitle(),
  93. buildSliverWaiting(),
  94. Obx(() {
  95. return SliverList.builder(
  96. itemBuilder: buildNewsItem,
  97. itemCount: controller.messageList.length);
  98. })
  99. ],
  100. );
  101. }
  102. SliverToBoxAdapter buildSliverTitle() {
  103. return SliverToBoxAdapter(
  104. child: Column(
  105. crossAxisAlignment: CrossAxisAlignment.start,
  106. children: [
  107. SizedBox(height: 18.w),
  108. Padding(
  109. padding: EdgeInsets.only(left: 12.w),
  110. child: Text(StringName.newsTitle,
  111. style: TextStyle(
  112. fontSize: 16.sp,
  113. color: ColorName.black90,
  114. fontWeight: FontWeight.bold)),
  115. ),
  116. SizedBox(height: 10.w),
  117. ],
  118. ));
  119. }
  120. Widget buildHeadView() {
  121. return Container(
  122. margin: EdgeInsets.symmetric(horizontal: 12.w, vertical: 14.w),
  123. child: Row(
  124. crossAxisAlignment: CrossAxisAlignment.center,
  125. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  126. children: [
  127. GestureDetector(
  128. onTap: controller.back, child: CommonView.getBackBtnView()),
  129. Obx(() {
  130. return Opacity(
  131. opacity: controller.opacity,
  132. child: Text(StringName.newsTitle,
  133. style: TextStyle(
  134. fontSize: 16.sp,
  135. color: ColorName.black90,
  136. fontWeight: FontWeight.bold)),
  137. );
  138. }),
  139. GestureDetector(
  140. onTap: controller.newsClick,
  141. child:
  142. Assets.images.iconFriendNews.image(width: 24.w, height: 24.w))
  143. ],
  144. ),
  145. );
  146. }
  147. SliverToBoxAdapter buildSliverWaiting() {
  148. return SliverToBoxAdapter(child: Obx(() {
  149. if (controller.waitingNewsCount == 0) {
  150. return SizedBox.shrink();
  151. }
  152. return GestureDetector(
  153. onTap: () => controller.onMessageWaitingClick(),
  154. child: buildMessageItem(Assets.images.iconNewsItem.provider(),
  155. title: StringName.newsRequestTitle,
  156. content: StringName.newsRequestDesc,
  157. contentTextStyle:
  158. TextStyle(fontSize: 12.sp, color: ColorName.black60),
  159. createTime: controller.latestFriendRequest?.createTime ?? 0,
  160. statusWidget: Container(
  161. height: 16.w,
  162. constraints: BoxConstraints(
  163. minWidth: 16.w,
  164. ),
  165. padding: EdgeInsets.symmetric(horizontal: 2.w),
  166. decoration: BoxDecoration(
  167. color: '#FF333D'.color,
  168. borderRadius: BorderRadius.circular(100),
  169. ),
  170. child: Center(
  171. child: Text('${controller.waitingNewsCount}',
  172. textAlign: TextAlign.center,
  173. style: TextStyle(
  174. fontSize: 10.sp, color: ColorName.white, height: 1)),
  175. ),
  176. )),
  177. );
  178. }));
  179. }
  180. Widget buildNewsItem(BuildContext context, int index) {
  181. final item = controller.messageList[index];
  182. return buildMessageInfoItem(
  183. item, (info) => controller.onMessageFunClick(info));
  184. }
  185. Widget buildNoMessageView() {
  186. return Align(
  187. alignment: Alignment(0, -0.1),
  188. child: IntrinsicHeight(
  189. child: Column(
  190. children: [
  191. Assets.images.iconNews.image(width: 150.w),
  192. SizedBox(height: 9.w),
  193. Text(StringName.messageNoData,
  194. style: TextStyle(fontSize: 16.sp, color: ColorName.black60))
  195. ],
  196. ),
  197. ),
  198. );
  199. }
  200. }