news_page.dart 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  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. statusWidget: Container(
  133. height: 16.w,
  134. constraints: BoxConstraints(
  135. minWidth: 16.w,
  136. ),
  137. padding: EdgeInsets.symmetric(horizontal: 2.w),
  138. decoration: BoxDecoration(
  139. color: '#FF333D'.color,
  140. borderRadius: BorderRadius.circular(100),
  141. ),
  142. child: Center(
  143. child: Text('${controller.waitingNewsCount}',
  144. textAlign: TextAlign.center,
  145. style: TextStyle(
  146. fontSize: 10.sp, color: ColorName.white, height: 1)),
  147. ),
  148. )),
  149. );
  150. }));
  151. }
  152. Widget buildNewsItem(BuildContext context, int index) {
  153. final item = controller.messageList[index];
  154. return buildMessageInfoItem(
  155. item, (info) => controller.onMessageFunClick(info));
  156. }
  157. Widget buildNoMessageView() {
  158. return Align(
  159. alignment: Alignment(0, -0.1),
  160. child: IntrinsicHeight(
  161. child: Column(
  162. children: [
  163. Assets.images.iconNews.image(width: 150.w),
  164. SizedBox(height: 9.w),
  165. Text(StringName.messageNoData,
  166. style: TextStyle(fontSize: 16.sp, color: ColorName.black60))
  167. ],
  168. ),
  169. ),
  170. );
  171. }
  172. }