news_page.dart 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  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. ],
  55. ),
  56. )
  57. ],
  58. );
  59. }
  60. CustomScrollView buildHasMessageView() {
  61. return CustomScrollView(
  62. controller: controller.scrollController,
  63. slivers: [
  64. buildSliverTitle(),
  65. buildSliverWaiting(),
  66. Obx(() {
  67. return SliverList.builder(
  68. itemBuilder: buildNewsItem,
  69. itemCount: controller.messageList.length);
  70. })
  71. ],
  72. );
  73. }
  74. SliverToBoxAdapter buildSliverTitle() {
  75. return SliverToBoxAdapter(
  76. child: Column(
  77. crossAxisAlignment: CrossAxisAlignment.start,
  78. children: [
  79. SizedBox(height: 18.w),
  80. Padding(
  81. padding: EdgeInsets.only(left: 12.w),
  82. child: Text(StringName.newsTitle,
  83. style: TextStyle(
  84. fontSize: 16.sp,
  85. color: ColorName.black90,
  86. fontWeight: FontWeight.bold)),
  87. ),
  88. SizedBox(height: 10.w),
  89. ],
  90. ));
  91. }
  92. Widget buildHeadView() {
  93. return Container(
  94. margin: EdgeInsets.symmetric(horizontal: 12.w, vertical: 14.w),
  95. child: Row(
  96. crossAxisAlignment: CrossAxisAlignment.center,
  97. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  98. children: [
  99. GestureDetector(
  100. onTap: controller.back, child: CommonView.getBackBtnView()),
  101. Obx(() {
  102. return Opacity(
  103. opacity: controller.opacity,
  104. child: Text(StringName.newsTitle,
  105. style: TextStyle(
  106. fontSize: 16.sp,
  107. color: ColorName.black90,
  108. fontWeight: FontWeight.bold)),
  109. );
  110. }),
  111. GestureDetector(
  112. onTap: controller.newsClick,
  113. child:
  114. Assets.images.iconFriendNews.image(width: 24.w, height: 24.w))
  115. ],
  116. ),
  117. );
  118. }
  119. SliverToBoxAdapter buildSliverWaiting() {
  120. return SliverToBoxAdapter(child: Obx(() {
  121. if (controller.waitingNewsCount == 0) {
  122. return SizedBox.shrink();
  123. }
  124. return GestureDetector(
  125. onTap: () => controller.onMessageWaitingClick(),
  126. child: buildMessageItem(Assets.images.iconNewsItem.provider(),
  127. title: StringName.newsRequestTitle,
  128. content: StringName.newsRequestDesc,
  129. contentTextStyle:
  130. TextStyle(fontSize: 12.sp, color: ColorName.black60),
  131. createTime: controller.latestFriendRequest?.createTime ?? 0,
  132. onReportEvent: controller.onReportEventClick,
  133. statusWidget: Container(
  134. height: 16.w,
  135. constraints: BoxConstraints(
  136. minWidth: 16.w,
  137. ),
  138. padding: EdgeInsets.symmetric(horizontal: 2.w),
  139. decoration: BoxDecoration(
  140. color: '#FF333D'.color,
  141. borderRadius: BorderRadius.circular(100),
  142. ),
  143. child: Center(
  144. child: Text('${controller.waitingNewsCount}',
  145. textAlign: TextAlign.center,
  146. style: TextStyle(
  147. fontSize: 10.sp, color: ColorName.white, height: 1)),
  148. ),
  149. )),
  150. );
  151. }));
  152. }
  153. Widget buildNewsItem(BuildContext context, int index) {
  154. final item = controller.messageList[index];
  155. return buildMessageInfoItem(
  156. item,
  157. () => controller.onReportEventClick(),
  158. (info) => controller.onMessageFunClick(info));
  159. }
  160. Widget buildNoMessageView() {
  161. return Align(
  162. alignment: Alignment(0, -0.1),
  163. child: IntrinsicHeight(
  164. child: Column(
  165. children: [
  166. Assets.images.iconNews.image(width: 150.w),
  167. SizedBox(height: 9.w),
  168. Text(StringName.messageNoData,
  169. style: TextStyle(fontSize: 16.sp, color: ColorName.black60))
  170. ],
  171. ),
  172. ),
  173. );
  174. }
  175. }