news_page.dart 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. import 'dart:ui';
  2. import 'package:flutter/src/widgets/framework.dart';
  3. import 'package:flutter/widgets.dart';
  4. import 'package:flutter_screenutil/flutter_screenutil.dart';
  5. import 'package:get/get.dart';
  6. import 'package:get/get_core/src/get_main.dart';
  7. import 'package:location/base/base_page.dart';
  8. import 'package:location/data/bean/message_info.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 Opacity(
  36. opacity: 1 - controller.opacity,
  37. child: Assets.images.iconNews.image(width: 118.w));
  38. }))),
  39. SafeArea(
  40. child: Column(
  41. children: [
  42. buildHeadView(),
  43. Expanded(
  44. child: CustomScrollView(
  45. controller: controller.scrollController,
  46. slivers: [
  47. buildSliverTitle(),
  48. buildSliverWaiting(),
  49. Obx(() {
  50. return SliverList.builder(
  51. itemBuilder: buildNewsItem,
  52. itemCount: controller.messageList.length);
  53. })
  54. ],
  55. ))
  56. ],
  57. ),
  58. )
  59. ],
  60. );
  61. }
  62. SliverToBoxAdapter buildSliverTitle() {
  63. return SliverToBoxAdapter(
  64. child: Column(
  65. crossAxisAlignment: CrossAxisAlignment.start,
  66. children: [
  67. SizedBox(height: 18.w),
  68. Padding(
  69. padding: EdgeInsets.only(left: 12.w),
  70. child: Text(StringName.newsTitle,
  71. style: TextStyle(
  72. fontSize: 16.sp,
  73. color: ColorName.black90,
  74. fontWeight: FontWeight.bold)),
  75. ),
  76. SizedBox(height: 10.w),
  77. ],
  78. ));
  79. }
  80. Widget buildHeadView() {
  81. return Container(
  82. margin: EdgeInsets.symmetric(horizontal: 12.w, vertical: 14.w),
  83. child: Row(
  84. crossAxisAlignment: CrossAxisAlignment.center,
  85. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  86. children: [
  87. GestureDetector(
  88. onTap: controller.back, child: CommonView.getBackBtnView()),
  89. Obx(() {
  90. return Opacity(
  91. opacity: controller.opacity,
  92. child: Text(StringName.newsTitle,
  93. style: TextStyle(
  94. fontSize: 16.sp,
  95. color: ColorName.black90,
  96. fontWeight: FontWeight.bold)),
  97. );
  98. }),
  99. GestureDetector(
  100. onTap: controller.newsClick,
  101. child:
  102. Assets.images.iconFriendNews.image(width: 24.w, height: 24.w))
  103. ],
  104. ),
  105. );
  106. }
  107. SliverToBoxAdapter buildSliverWaiting() {
  108. return SliverToBoxAdapter(child: Obx(() {
  109. if (controller.waitingNewsCount == 0) {
  110. return SizedBox.shrink();
  111. }
  112. return buildMessageItem(Assets.images.iconNewsItem.provider(),
  113. title: StringName.newsRequestTitle,
  114. content: StringName.newsRequestDesc,
  115. contentTextStyle:
  116. TextStyle(fontSize: 12.sp, color: ColorName.black60),
  117. createTime: controller.latestFriendRequest?.createTime ?? 0,
  118. statusWidget: Container(
  119. height: 16.w,
  120. constraints: BoxConstraints(
  121. minWidth: 16.w,
  122. ),
  123. padding: EdgeInsets.symmetric(horizontal: 2.w),
  124. decoration: BoxDecoration(
  125. color: '#FF333D'.color,
  126. borderRadius: BorderRadius.circular(100),
  127. ),
  128. child: Center(
  129. child: Text('${controller.waitingNewsCount}',
  130. textAlign: TextAlign.center,
  131. style: TextStyle(
  132. fontSize: 10.sp, color: ColorName.white, height: 1)),
  133. ),
  134. ));
  135. }));
  136. }
  137. Widget buildNewsItem(BuildContext context, int index) {
  138. final item = controller.messageList[index];
  139. return buildMessageInfoItem(
  140. item, (info) => controller.onMessageFunClick(info));
  141. }
  142. }