Sfoglia il codice sorgente

Merge branch 'v1.0.0' into v1.1.0-iOS

# Conflicts:
#	lib/di/get_it.config.dart
#	lib/module/news/news_controller.dart
“HeShaoZe” 4 mesi fa
parent
commit
1e20331993

BIN
assets/images/icon_news_report.webp


BIN
assets/images/icon_news_report_agree.webp


+ 1 - 1
assets/string/base/string.xml

@@ -128,7 +128,7 @@
     <string name="friend_delete">删除好友</string>
     <string name="kindly_reminder">温馨提示</string>
     <string name="friend_delete_content">
-        互删好友后,双方将停止位置的分享以及清除相关定位记录,是否确认互删
+        互删好友后,双方将停止共享位置,清除相关定位记录并屏蔽,是否确认互删
     </string>
     <string name="delete_success">删除成功</string>
     <string name="copy_phone_num_success">手机号复制成功</string>

+ 27 - 0
ios/build/XCBuildData/29606b5c766a7bc82970f1cac9879b20.xcbuilddata/build-request.json

@@ -0,0 +1,27 @@
+{
+  "buildCommand" : {
+    "command" : "build",
+    "skipDependencies" : false,
+    "style" : "buildOnly"
+  },
+  "configuredTargets" : [
+
+  ],
+  "continueBuildingAfterErrors" : false,
+  "dependencyScope" : "workspace",
+  "enableIndexBuildArena" : false,
+  "hideShellScriptEnvironment" : false,
+  "parameters" : {
+    "action" : "build",
+    "overrides" : {
+
+    }
+  },
+  "qos" : "utility",
+  "schemeCommand" : "launch",
+  "showNonLoggedProgress" : true,
+  "useDryRun" : false,
+  "useImplicitDependencies" : false,
+  "useLegacyBuildLocations" : false,
+  "useParallelTargets" : true
+}

BIN
ios/build/XCBuildData/29606b5c766a7bc82970f1cac9879b20.xcbuilddata/description.msgpack


+ 1 - 0
ios/build/XCBuildData/29606b5c766a7bc82970f1cac9879b20.xcbuilddata/manifest.json

@@ -0,0 +1 @@
+{"client":{"name":"basic","version":0,"file-system":"device-agnostic","perform-ownership-analysis":"no"},"targets":{"":["<all>"]},"commands":{"<all>":{"tool":"phony","inputs":["<WorkspaceHeaderMapVFSFilesWritten>"],"outputs":["<all>"]},"P0:::Gate WorkspaceHeaderMapVFSFilesWritten":{"tool":"phony","inputs":[],"outputs":["<WorkspaceHeaderMapVFSFilesWritten>"]}}}

+ 1 - 0
ios/build/XCBuildData/29606b5c766a7bc82970f1cac9879b20.xcbuilddata/target-graph.txt

@@ -0,0 +1 @@
+Target dependency graph (0 target)

BIN
ios/build/XCBuildData/29606b5c766a7bc82970f1cac9879b20.xcbuilddata/task-store.msgpack


File diff suppressed because it is too large
+ 539 - 807
lib/data/api/atmob_api.g.dart


+ 13 - 10
lib/di/get_it.config.dart

@@ -1,3 +1,4 @@
+// dart format width=80
 // GENERATED CODE - DO NOT MODIFY BY HAND
 
 // **************************************************************************
@@ -37,6 +38,7 @@ import '../module/main/today_track_helper.dart' as _i683;
 import '../module/member/member_controller.dart' as _i269;
 import '../module/mine/mine_controller.dart' as _i732;
 import '../module/news/news_controller.dart' as _i489;
+import '../module/news/news_report/news_report_controller.dart' as _i779;
 import '../module/news/pending_list/news_pending_list_controller.dart' as _i433;
 import '../module/permission/permission_setting_controller.dart' as _i108;
 import '../module/splash/splash_controller.dart' as _i973;
@@ -61,14 +63,15 @@ extension GetItInjectableX on _i174.GetIt {
       environmentFilter,
     );
     final networkModule = _$NetworkModule();
+    gh.factory<_i973.SplashController>(() => _i973.SplashController());
+    gh.factory<_i756.TrackDetailController>(
+        () => _i756.TrackDetailController());
     gh.factory<_i256.AboutController>(() => _i256.AboutController());
-    gh.factory<_i923.BrowserController>(() => _i923.BrowserController());
     gh.factory<_i769.FeedBackController>(() => _i769.FeedBackController());
+    gh.factory<_i923.BrowserController>(() => _i923.BrowserController());
+    gh.factory<_i779.NewsReportController>(() => _i779.NewsReportController());
     gh.factory<_i108.PermissionSettingController>(
         () => _i108.PermissionSettingController());
-    gh.factory<_i973.SplashController>(() => _i973.SplashController());
-    gh.factory<_i756.TrackDetailController>(
-        () => _i756.TrackDetailController());
     gh.singleton<_i361.Dio>(() => networkModule.createDefaultDio());
     gh.lazySingleton<_i772.InternetConnectionHelper>(
         () => _i772.InternetConnectionHelper());
@@ -82,14 +85,14 @@ extension GetItInjectableX on _i174.GetIt {
         .provideAtmobStreamApi(gh<_i361.Dio>(instanceName: 'stream')));
     gh.lazySingleton<_i20.AccountRepository>(
         () => _i20.AccountRepository(gh<_i243.AtmobApi>()));
-    gh.lazySingleton<_i850.ContactRepository>(
-        () => _i850.ContactRepository(gh<_i243.AtmobApi>()));
+    gh.lazySingleton<_i274.PhoneEventRepository>(
+        () => _i274.PhoneEventRepository(gh<_i243.AtmobApi>()));
     gh.lazySingleton<_i1053.FriendsRepository>(
         () => _i1053.FriendsRepository(gh<_i243.AtmobApi>()));
+    gh.lazySingleton<_i850.ContactRepository>(
+        () => _i850.ContactRepository(gh<_i243.AtmobApi>()));
     gh.lazySingleton<_i791.MessageRepository>(
         () => _i791.MessageRepository(gh<_i243.AtmobApi>()));
-    gh.lazySingleton<_i274.PhoneEventRepository>(
-        () => _i274.PhoneEventRepository(gh<_i243.AtmobApi>()));
     gh.lazySingleton<_i983.UrgentContactRepository>(
         () => _i983.UrgentContactRepository(gh<_i243.AtmobApi>()));
     gh.lazySingleton<_i220.AtmobLocationClient>(
@@ -125,10 +128,10 @@ extension GetItInjectableX on _i174.GetIt {
               gh<_i983.UrgentContactRepository>(),
               gh<_i20.AccountRepository>(),
             ));
-    gh.factory<_i897.AddFriendDialogController>(
-        () => _i897.AddFriendDialogController(gh<_i1053.FriendsRepository>()));
     gh.factory<_i492.FriendSettingController>(
         () => _i492.FriendSettingController(gh<_i1053.FriendsRepository>()));
+    gh.factory<_i897.AddFriendDialogController>(
+        () => _i897.AddFriendDialogController(gh<_i1053.FriendsRepository>()));
     gh.lazySingleton<_i814.MemberRepository>(() => _i814.MemberRepository(
           gh<_i243.AtmobApi>(),
           gh<_i20.AccountRepository>(),

+ 3 - 3
lib/module/member/member_header_cycle_widget.dart

@@ -64,7 +64,7 @@ class _MemberHeaderCycleWidgetState extends State<MemberHeaderCycleWidget> {
     return Stack(
       children: [
         Container(
-          height: 291.w + MediaQuery.of(Get.context!).padding.top,
+          height: 291.w + MediaQuery.of(Get.context!).padding.top - 36.5.w,
           width: double.infinity,
           child: PageView.builder(
             controller: _controller,
@@ -75,7 +75,7 @@ class _MemberHeaderCycleWidgetState extends State<MemberHeaderCycleWidget> {
                 decoration: BoxDecoration(
                     image: DecorationImage(
                       image: _images[realIndex],
-                      fit: BoxFit.cover,
+                      //fit: BoxFit.cover,
                     )
                 ),
               );
@@ -83,7 +83,7 @@ class _MemberHeaderCycleWidgetState extends State<MemberHeaderCycleWidget> {
           ),
         ),
         Positioned(
-            bottom: 50.w,
+            bottom: 38.w,
             left: 0,
             right: 0,
             height: 5.w,

+ 1 - 1
lib/module/member/member_page.dart

@@ -74,7 +74,7 @@ class MemberPage extends BasePage<MemberController> {
                 MemberHeaderCycleWidget(),
                 Column(
                   children: [
-                    SizedBox(height: 249.w + MediaQuery.of(Get.context!).padding.top),
+                    SizedBox(height: 249.w + MediaQuery.of(Get.context!).padding.top - 24.w),
                     Container(
                       decoration: BoxDecoration(
                         color: ColorName.white,

+ 48 - 1
lib/module/news/news_controller.dart

@@ -1,15 +1,21 @@
+import 'dart:ffi';
+
 import 'package:flutter/cupertino.dart';
+import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get.dart';
 import 'package:injectable/injectable.dart';
 import 'package:location/base/base_controller.dart';
 import 'package:location/data/repositories/message_repository.dart';
 import 'package:location/handler/error_handler.dart';
 import 'package:location/module/news/pending_list/news_pending_list_page.dart';
+import 'package:location/resource/assets.gen.dart';
+import 'package:location/utils/common_expand.dart';
 import 'package:url_launcher/url_launcher.dart';
 
 import '../../data/bean/message_info.dart';
 import '../../data/bean/request_friend_info.dart';
 import '../add_friend/add_friend_page.dart';
+import 'news_report/news_report_page.dart';
 
 @injectable
 class NewsController extends BaseController {
@@ -30,6 +36,8 @@ class NewsController extends BaseController {
 
   RxList<MessageInfo> messageList = RxList();
 
+  RxInt isLongTapIndex = RxInt(-1);
+
   NewsController(this.messageRepository);
 
   @override
@@ -107,4 +115,43 @@ class NewsController extends BaseController {
   void onAddJumpToAddNewFriend() {
     AddFriendPage.show();
   }
-}
+
+  ///举报事件
+  void onReportEventClick() {
+    showCupertinoModalPopup(
+      context: Get.context!,
+      builder: (context) =>
+          CupertinoActionSheet(
+            actions: [
+              CupertinoActionSheetAction(
+                  child: Row(
+                    children: [
+                      SizedBox(width: 18.w,),
+                      Assets.images.iconNewsReport.image(
+                          width: 20.w, height: 20.w),
+                      SizedBox(width: 6.w,),
+                      Text(
+                        '举报',
+                        style: TextStyle(
+                            fontSize: 13.sp,
+                            color: "#333333".color,
+                            fontWeight: FontWeight.w400),
+                      ),
+                    ],
+                  ),
+                  onPressed: () {
+                    Navigator.pop(context);
+                    NewsReportPage.start();
+                  }
+              ),
+            ],
+          ),
+    );
+  }
+
+  ///用户是否在长安
+  void onUserIsLongEventClick(int longIndex) {
+    print("longIndexsfsdfs---${longIndex}");
+    isLongTapIndex.value = longIndex;
+  }
+}

+ 39 - 1
lib/module/news/news_list_item.dart

@@ -1,5 +1,8 @@
 import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
 import 'package:flutter_screenutil/flutter_screenutil.dart';
+import 'package:get/get.dart';
+import 'package:get/get_core/src/get_main.dart';
 import 'package:location/data/bean/message_info.dart';
 import 'package:location/utils/common_expand.dart';
 
@@ -10,13 +13,15 @@ import '../../utils/date_util.dart';
 
 typedef MessageFunCallback = void Function(MessageInfo info);
 
-Widget buildMessageInfoItem(MessageInfo item, MessageFunCallback callback) {
+Widget buildMessageInfoItem(MessageInfo item,MessageFunCallback callback,{VoidCallback? onReportEvent,bool? isShowReportButton}) {
   return buildMessageItem(Assets.images.iconDefaultFriendAvatar.provider(),
       title: item.senderPhone ?? '',
       content: getMessageContentTxt(item.type),
       contentTextStyle: getMessageContentTextStyle(item.type),
       createTime: item.createTime,
       bgGradient: getMessageBgGradient(item.type),
+      onReportEvent: onReportEvent,
+      isShowReportButton: isShowReportButton ?? false,
       statusWidget: getMessageStatusWidget(item.type, funClick: () {
         callback(item);
       }));
@@ -110,6 +115,8 @@ Widget buildMessageItem(ImageProvider avatar,
     required TextStyle contentTextStyle,
     required int createTime,
     required Widget statusWidget,
+      bool? isShowReportButton,
+      VoidCallback? onReportEvent,
     Gradient? bgGradient}) {
   return Container(
     decoration: BoxDecoration(
@@ -162,6 +169,37 @@ Widget buildMessageItem(ImageProvider avatar,
                   SizedBox(width: 16.w),
                   statusWidget
                 ],
+              ),
+              if (isShowReportButton?? false) Column(
+                crossAxisAlignment: CrossAxisAlignment.end,
+                children: [
+                  SizedBox(height: 7.w),
+                  Container(
+                    width: MediaQuery.of(Get.context!).size.width,
+                    alignment: Alignment.centerRight,
+                    child: Container(
+                      width: 100.w,
+                      height: 32.w,
+                      decoration: BoxDecoration(
+                          color: "#7B7DFF".color,
+                          borderRadius: BorderRadius.all(Radius.circular(32.w/2))
+                      ),
+                      alignment: Alignment.center,
+                      //color: Colors.orange,
+                      child: GestureDetector(
+                        onTap: onReportEvent,
+                        child: Container(
+                          child: Text("举报",style: TextStyle(
+                              fontSize: 15.sp,
+                              color: "#FFFFFF".color,
+                              fontWeight: FontWeight.w500
+                          ),
+                          ),
+                        ),
+                      ),
+                    ),
+                  )
+                ],
               )
             ],
           ))

+ 13 - 2
lib/module/news/news_page.dart

@@ -1,3 +1,4 @@
+import 'dart:io';
 import 'dart:ui';
 
 import 'package:flutter/material.dart';
@@ -189,8 +190,18 @@ class NewsPage extends BasePage<NewsController> {
 
   Widget buildNewsItem(BuildContext context, int index) {
     final item = controller.messageList[index];
-    return buildMessageInfoItem(
-        item, (info) => controller.onMessageFunClick(info));
+    return GestureDetector(
+      onLongPress: () {
+        controller.onUserIsLongEventClick(index);
+      },
+      child: Obx(() {
+        return buildMessageInfoItem(
+            item, (info) => controller.onMessageFunClick(info),
+            isShowReportButton: (controller.isLongTapIndex.value == index) && Platform.isIOS && (item.type == 3 || item.type == 4),
+            onReportEvent: (item.type == 3 || item.type == 4) ? controller.onReportEventClick : null
+        );
+      }),
+    );
   }
 
   Widget buildNoMessageView() {

+ 63 - 0
lib/module/news/news_report/news_report_controller.dart

@@ -0,0 +1,63 @@
+
+
+import 'package:flutter/cupertino.dart';
+import 'package:get/get.dart';
+import 'package:get/get_core/src/get_main.dart';
+import 'package:injectable/injectable.dart';
+import 'package:location/dialog/loading_dialog.dart';
+
+import '../../../base/base_controller.dart';
+import 'news_report_dialog.dart' show NewsReportDialog;
+
+@injectable
+class NewsReportController extends BaseController {
+
+
+  ///用户的基本信息
+  late TextEditingController reportContetnController;
+  late String reportContentString;
+
+  RxBool submitBuEnble = RxBool(false);
+
+  @override
+  void onInit() {
+    // TODO: implement onInit
+    super.onInit();
+    reportContetnController = TextEditingController(text:"");
+    reportContentString = "";
+  }
+
+  @override
+  void onReady() {
+    super.onReady();
+  }
+
+
+  void back() {
+    Get.back();
+  }
+
+
+  void inputContentText(String inpustr) {
+    reportContentString = inpustr;
+    onTextInputChange();
+  }
+
+  void onTextInputChange() {
+    if (reportContentString.length > 3 && reportContentString.length < 500) {
+       submitBuEnble.value = true;
+     } else {
+       submitBuEnble.value = false;
+     }
+  }
+
+  void onSubmti() {
+    FocusManager.instance.primaryFocus?.unfocus();
+    CustomLoadingDialog.show();
+    Future.delayed(Duration(seconds: 2), () {
+      CustomLoadingDialog.hide();
+      NewsReportDialog.show();
+    });
+  }
+
+}

+ 106 - 0
lib/module/news/news_report/news_report_dialog.dart

@@ -0,0 +1,106 @@
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_screenutil/flutter_screenutil.dart';
+import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
+import 'package:location/resource/string.gen.dart';
+import 'package:location/utils/common_expand.dart';
+
+import '../../../resource/assets.gen.dart';
+import '../../../resource/colors.gen.dart';
+
+class NewsReportDialog {
+  static const String _tag = 'AccountReplaceDialog';
+
+  static void show() {
+    SmartDialog.show(
+        builder: (_) => _NewsReportDialogView(),
+        tag: _tag,
+        clickMaskDismiss: false);
+  }
+
+  static void dismiss() {
+    SmartDialog.dismiss(tag: _tag);
+  }
+}
+
+class _NewsReportDialogView extends StatelessWidget {
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      width: 274.w,
+      decoration: BoxDecoration(
+          borderRadius: BorderRadius.circular(16.r),
+          border: Border.all(
+            color: Colors.white,
+            width: 2.w,
+          ),
+          gradient: LinearGradient(
+              begin: Alignment.topCenter,
+              end: Alignment.bottomCenter,
+              colors: [
+                '#E4E4FF'.color,
+                '#FFFFFF'.color,
+              ])),
+      child: Stack(
+        alignment: Alignment.center,
+        children: [
+          // Positioned(
+          //     top: 16.w,
+          //     right: 16.w,
+          //     child: GestureDetector(
+          //       onTap: onCloseClick,
+          //       child: Assets.images.iconAgreementClose
+          //           .image(width: 20.w, height: 20.w),
+          //     )),
+          buildAccountReplaceContent(),
+        ],
+      ),
+    );
+  }
+
+  Widget buildAccountReplaceContent() {
+    return IntrinsicHeight(
+      child: Column(
+        children: [
+          SizedBox(height: 33.w),
+          Assets.images.iconNewsReportAgree.image(height: 76.w),
+          SizedBox(height: 29.w),
+          Text("提交成功",
+              style: TextStyle(
+                  fontSize: 17.sp,
+                  color: '#333333'.color,
+                  fontWeight: FontWeight.bold)),
+          SizedBox(height: 20.w),
+          GestureDetector(
+            onTap: onKnowClick,
+            child: Container(
+              width: 229.w,
+              height: 43.w,
+              decoration: BoxDecoration(
+                color: ColorName.colorPrimary,
+                borderRadius: BorderRadius.circular(100.r),
+              ),
+              child: Center(
+                child: Text("我知道了",
+                    style: TextStyle(
+                        fontSize: 14.sp,
+                        color: Colors.white,
+                        fontWeight: FontWeight.w500)),
+              ),
+            ),
+          ),
+          SizedBox(height: 20.w),
+        ],
+      ),
+    );
+  }
+
+  void onCloseClick() {
+    NewsReportDialog.dismiss();
+  }
+
+  void onKnowClick() {
+    NewsReportDialog.dismiss();
+  }
+}
+

+ 119 - 0
lib/module/news/news_report/news_report_page.dart

@@ -0,0 +1,119 @@
+
+
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/src/widgets/framework.dart';
+import 'package:flutter_screenutil/flutter_screenutil.dart';
+import 'package:get/get.dart';
+import 'package:get/get_core/src/get_main.dart';
+import 'package:location/utils/common_expand.dart';
+
+import '../../../base/base_page.dart';
+import '../../../resource/colors.gen.dart';
+import '../../../resource/string.gen.dart';
+import '../../../router/app_pages.dart';
+import '../../../widget/common_view.dart';
+import 'news_report_controller.dart';
+import 'news_repost_text_view.dart';
+import 'news_tap_to_dismiss_key_board.dart';
+
+class NewsReportPage extends BasePage<NewsReportController> {
+  const NewsReportPage({super.key});
+
+  static void start() {
+    Get.toNamed(RoutePath.newsReport);
+  }
+
+  @override
+  bool immersive() {
+    return false;
+  }
+
+  @override
+  Widget buildBody(BuildContext context) {
+    // TODO: implement buildBody
+    return NewsTapToDismissKeyBoard(child: Column(
+      children: [
+        buildHeadView(onTap: controller.back),
+        SizedBox(height: 28.w,),
+        Container(
+          padding: EdgeInsets.symmetric(horizontal: 16.w),
+          child: Column(
+            children: [
+              Row(
+                children: [
+                  Text("*",
+                      style: TextStyle(
+                          fontSize: 14.sp,
+                          color: '#FF3C3C'.color,
+                          fontWeight: FontWeight.w500)),
+                  Text("举报内容",
+                      style: TextStyle(
+                          fontSize: 14.sp,
+                          color: "#333333".color,
+                          fontWeight: FontWeight.w500))
+                ],
+              ),
+              SizedBox(height: 10.w,),
+              Container(
+                color: ColorName.white,
+                child: NewsRepostTextView(
+                  controller: controller.reportContetnController,
+                  onChanged: (text) {
+                    // 实时监听文本变化
+                    print('当前内容: $text');
+                    controller.inputContentText(text);
+                  },
+                ),
+              ),
+              SizedBox(height: 30.w,),
+              Container(
+                child: Obx(() {
+                  return GestureDetector(
+                    onTap: controller.submitBuEnble.value  ? controller.onSubmti : null,
+                    child: Container(
+                      alignment: Alignment.center,
+                      decoration: BoxDecoration(
+                        color: controller.submitBuEnble.value  ? "#7B7DFF".color : ColorName.black30,
+                        borderRadius: BorderRadius.all(Radius.circular(41.w / 2)),
+                      ),
+                      width: 114.w,
+                      height: 41.w,
+                      child: Text(
+                          "提 交",
+                          style: TextStyle(
+                              fontSize: 16.sp, color: ColorName.white, fontWeight: FontWeight.w400)
+                      ),
+
+                    ),
+                  );
+                }),
+              )
+            ],
+          ),
+        )
+      ],
+    ));
+  }
+}
+
+
+Widget buildHeadView({GestureTapCallback? onTap}) {
+  return Container(
+    margin: EdgeInsets.symmetric(horizontal: 12.w, vertical: 14.w),
+    child: Row(
+      crossAxisAlignment: CrossAxisAlignment.center,
+      mainAxisAlignment: MainAxisAlignment.spaceBetween,
+      children: [
+        GestureDetector(
+            onTap: onTap, child: CommonView.getBackBtnView()),
+        Text("举报投诉",
+            style: TextStyle(
+                fontSize: 18.sp,
+                color: '#202020'.color,
+                fontWeight: FontWeight.bold)),
+        SizedBox(width: 24.w, height: 24.w)
+      ],
+    ),
+  );
+}

+ 154 - 0
lib/module/news/news_report/news_repost_text_view.dart

@@ -0,0 +1,154 @@
+import 'package:flutter/material.dart';
+import 'package:location/utils/common_expand.dart';
+
+class NewsRepostTextView extends StatefulWidget {
+  final String? initialValue; // 初始值
+  final String hintText; // 提示文本
+  final TextEditingController controller;
+  final ValueChanged<String>? onChanged; // 文本变化回调
+  final VoidCallback? onSubmitted; // 提交回调
+  final int minLength; // 最小字数
+  final int maxLength; // 最大字数
+
+  const NewsRepostTextView({
+    Key? key,
+    this.initialValue,
+    required this.controller,
+    this.hintText = '请输入举报原因,确保您提交的信息真实、客观,且符合中华人民共和国相关法律法规。我们将由专门的审核团队对您提供的内容进行核查并第一时间处理。',
+    this.onChanged,
+    this.onSubmitted,
+    this.minLength = 3,
+    this.maxLength = 500,
+  }) : super(key: key);
+
+  @override
+  _NewsRepostTextViewState createState() => _NewsRepostTextViewState();
+}
+
+class _NewsRepostTextViewState extends State<NewsRepostTextView> {
+  late TextEditingController _controller;
+  late FocusNode _focusNode;
+  bool _isValid = true; // 当前输入是否有效
+  int _currentLength = 0; // 当前字数
+
+  @override
+  void initState() {
+    super.initState();
+    _controller = widget.controller;//TextEditingController(text: widget.initialValue);
+    _focusNode = FocusNode();
+    _currentLength = widget.initialValue?.length ?? 0;
+    _validateText();
+
+    // 监听文本变化
+    _controller.addListener(() {
+      setState(() {
+        _currentLength = _controller.text.length;
+        _validateText();
+        widget.onChanged?.call(_controller.text);
+      });
+    });
+  }
+
+  @override
+  void dispose() {
+    _controller.dispose();
+    _focusNode.dispose();
+    super.dispose();
+  }
+
+  // 验证文本长度
+  void _validateText() {
+    final text = _controller.text;
+    _isValid = text.length >= widget.minLength && text.length <= widget.maxLength;
+  }
+
+  // 获取当前文本状态的提示信息
+  String get _lengthStatusText {
+    if (_currentLength < widget.minLength) {
+      return '至少输入${widget.minLength}个字';
+    } else if (_currentLength >= widget.maxLength) {
+      return '已超出最大字数限制';
+    } else {
+      return '${_currentLength}/${widget.maxLength}';
+    }
+  }
+
+  // 获取当前文本状态的颜色
+  Color get _lengthStatusColor {
+    if (_currentLength < widget.minLength || _currentLength > widget.maxLength) {
+      return Colors.red;
+    } else {
+      return Colors.grey;
+    }
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return GestureDetector(
+      onTap: () {
+        // 点击时收起键盘
+        FocusScopeNode currentFocus = FocusScope.of(context);
+        if (!currentFocus.hasPrimaryFocus && currentFocus.focusedChild != null) {
+          FocusManager.instance.primaryFocus?.unfocus();
+        }
+      },
+      child: Column(
+        crossAxisAlignment: CrossAxisAlignment.start,
+        children: [
+          TextField(
+            controller: _controller,
+            focusNode: _focusNode,
+            maxLines: null, // 允许多行输入
+            minLines: 4, // 最小显示行数
+            maxLength: widget.maxLength, // 最大字数限制(UI层限制)
+            keyboardType: TextInputType.multiline,
+            decoration: InputDecoration(
+              hintText: widget.hintText,
+              hintStyle: TextStyle(
+                color: Colors.grey
+              ),
+              border:  OutlineInputBorder(
+                borderSide: BorderSide(
+                  color: "#12C2C2C2".color,
+                  width: 1.0,
+                ),
+              ),
+              enabledBorder:  OutlineInputBorder(
+                borderSide: BorderSide(
+                  color: "#12C2C2C2".color,
+                  width: 1.0,
+                ),
+              ),
+              focusedBorder: OutlineInputBorder(
+                  borderSide: BorderSide(
+                    color: _isValid ? "#12C2C2C2".color : Colors.red,
+                    width: 2.0,
+                  ),
+                  borderRadius: BorderRadius.all(Radius.circular(10))
+              ),
+              counterText: '', // 隐藏默认计数器
+            ),
+            onSubmitted: (_) => widget.onSubmitted?.call(),
+          ),
+          SizedBox(height: 8.0),
+          Row(
+            mainAxisAlignment: MainAxisAlignment.spaceBetween,
+            children: [
+              Text(
+                _lengthStatusText,
+                style: TextStyle(color: _lengthStatusColor),
+              ),
+              if (!_isValid)
+                Text(
+                  '字数不符合要求',
+                  style: TextStyle(color: Colors.red),
+                ),
+            ],
+          ),
+        ],
+      ),
+    );
+
+
+  }
+}

+ 37 - 0
lib/module/news/news_report/news_tap_to_dismiss_key_board.dart

@@ -0,0 +1,37 @@
+import 'package:flutter/material.dart';
+
+// 点击空白区域收起键盘的Widget
+class NewsTapToDismissKeyBoard extends StatelessWidget {
+  final Widget child;
+  final bool? enable;
+
+  const NewsTapToDismissKeyBoard({
+    Key? key,
+    required this.child,
+    this.enable = true,
+  }) : super(key: key);
+
+  @override
+  Widget build(BuildContext context) {
+    if (!enable!) return child;
+
+    return GestureDetector(
+      onTap: () {
+        // 点击时收起键盘
+        FocusScopeNode currentFocus = FocusScope.of(context);
+        if (!currentFocus.hasPrimaryFocus && currentFocus.focusedChild != null) {
+          FocusManager.instance.primaryFocus?.unfocus();
+        }
+      },
+      behavior: HitTestBehavior.translucent,
+      child: child,
+    );
+  }
+}
+
+// 全局扩展方法,方便在任意Widget上使用
+extension TapToDismiss on Widget {
+  Widget get dismissKeyboardOnTap {
+    return NewsTapToDismissKeyBoard(child: this);
+  }
+}

+ 204 - 186
lib/resource/assets.gen.dart

@@ -35,7 +35,8 @@ class $AssetsImagesGen {
 
   /// File path: assets/images/bg_dialog_location_permission_ios.webp
   AssetGenImage get bgDialogLocationPermissionIos => const AssetGenImage(
-      'assets/images/bg_dialog_location_permission_ios.webp');
+    'assets/images/bg_dialog_location_permission_ios.webp',
+  );
 
   /// File path: assets/images/bg_dialog_track_error.webp
   AssetGenImage get bgDialogTrackError =>
@@ -271,7 +272,8 @@ class $AssetsImagesGen {
 
   /// File path: assets/images/icon_main_refresh_friend_location.webp
   AssetGenImage get iconMainRefreshFriendLocation => const AssetGenImage(
-      'assets/images/icon_main_refresh_friend_location.webp');
+    'assets/images/icon_main_refresh_friend_location.webp',
+  );
 
   /// File path: assets/images/icon_main_refresh_mine_location.webp
   AssetGenImage get iconMainRefreshMineLocation =>
@@ -287,7 +289,8 @@ class $AssetsImagesGen {
 
   /// File path: assets/images/icon_member_comment_very_satisfied.webp
   AssetGenImage get iconMemberCommentVerySatisfied => const AssetGenImage(
-      'assets/images/icon_member_comment_very_satisfied.webp');
+    'assets/images/icon_member_comment_very_satisfied.webp',
+  );
 
   /// File path: assets/images/icon_member_contact_click_help.webp
   AssetGenImage get iconMemberContactClickHelp =>
@@ -295,7 +298,8 @@ class $AssetsImagesGen {
 
   /// File path: assets/images/icon_member_contact_click_help_close.webp
   AssetGenImage get iconMemberContactClickHelpClose => const AssetGenImage(
-      'assets/images/icon_member_contact_click_help_close.webp');
+    'assets/images/icon_member_contact_click_help_close.webp',
+  );
 
   /// File path: assets/images/icon_member_fun5.webp
   AssetGenImage get iconMemberFun5 =>
@@ -323,11 +327,13 @@ class $AssetsImagesGen {
 
   /// File path: assets/images/icon_member_ordinary_product_normal.webp
   AssetGenImage get iconMemberOrdinaryProductNormal => const AssetGenImage(
-      'assets/images/icon_member_ordinary_product_normal.webp');
+    'assets/images/icon_member_ordinary_product_normal.webp',
+  );
 
   /// File path: assets/images/icon_member_ordinary_product_select.webp
   AssetGenImage get iconMemberOrdinaryProductSelect => const AssetGenImage(
-      'assets/images/icon_member_ordinary_product_select.webp');
+    'assets/images/icon_member_ordinary_product_select.webp',
+  );
 
   /// File path: assets/images/icon_member_payment_completed.webp
   AssetGenImage get iconMemberPaymentCompleted =>
@@ -347,11 +353,13 @@ class $AssetsImagesGen {
 
   /// File path: assets/images/icon_member_special_products_normal.webp
   AssetGenImage get iconMemberSpecialProductsNormal => const AssetGenImage(
-      'assets/images/icon_member_special_products_normal.webp');
+    'assets/images/icon_member_special_products_normal.webp',
+  );
 
   /// File path: assets/images/icon_member_special_products_select.webp
   AssetGenImage get iconMemberSpecialProductsSelect => const AssetGenImage(
-      'assets/images/icon_member_special_products_select.webp');
+    'assets/images/icon_member_special_products_select.webp',
+  );
 
   /// File path: assets/images/icon_member_vip_back.webp
   AssetGenImage get iconMemberVipBack =>
@@ -403,7 +411,8 @@ class $AssetsImagesGen {
 
   /// File path: assets/images/icon_mine_fun_permission_setting.webp
   AssetGenImage get iconMineFunPermissionSetting => const AssetGenImage(
-      'assets/images/icon_mine_fun_permission_setting.webp');
+    'assets/images/icon_mine_fun_permission_setting.webp',
+  );
 
   /// File path: assets/images/icon_mine_fun_share.webp
   AssetGenImage get iconMineFunShare =>
@@ -431,19 +440,23 @@ class $AssetsImagesGen {
 
   /// File path: assets/images/icon_mine_trial_expiration_header.webp
   AssetGenImage get iconMineTrialExpirationHeader => const AssetGenImage(
-      'assets/images/icon_mine_trial_expiration_header.webp');
+    'assets/images/icon_mine_trial_expiration_header.webp',
+  );
 
   /// File path: assets/images/icon_mine_trial_expiration_pause_bg.webp
   AssetGenImage get iconMineTrialExpirationPauseBg => const AssetGenImage(
-      'assets/images/icon_mine_trial_expiration_pause_bg.webp');
+    'assets/images/icon_mine_trial_expiration_pause_bg.webp',
+  );
 
   /// File path: assets/images/icon_mine_trial_expiration_question.webp
   AssetGenImage get iconMineTrialExpirationQuestion => const AssetGenImage(
-      'assets/images/icon_mine_trial_expiration_question.webp');
+    'assets/images/icon_mine_trial_expiration_question.webp',
+  );
 
   /// File path: assets/images/icon_mine_trial_expiration_recommend.webp
   AssetGenImage get iconMineTrialExpirationRecommend => const AssetGenImage(
-      'assets/images/icon_mine_trial_expiration_recommend.webp');
+    'assets/images/icon_mine_trial_expiration_recommend.webp',
+  );
 
   /// File path: assets/images/icon_mine_trial_expiration_up.webp
   AssetGenImage get iconMineTrialExpirationUp =>
@@ -477,6 +490,14 @@ class $AssetsImagesGen {
   AssetGenImage get iconNewsItem =>
       const AssetGenImage('assets/images/icon_news_item.webp');
 
+  /// File path: assets/images/icon_news_report.webp
+  AssetGenImage get iconNewsReport =>
+      const AssetGenImage('assets/images/icon_news_report.webp');
+
+  /// File path: assets/images/icon_news_report_agree.webp
+  AssetGenImage get iconNewsReportAgree =>
+      const AssetGenImage('assets/images/icon_news_report_agree.webp');
+
   /// File path: assets/images/icon_splash_title.webp
   AssetGenImage get iconSplashTitle =>
       const AssetGenImage('assets/images/icon_splash_title.webp');
@@ -503,7 +524,8 @@ class $AssetsImagesGen {
 
   /// File path: assets/images/icon_track_detail_time_base_arrow.webp
   AssetGenImage get iconTrackDetailTimeBaseArrow => const AssetGenImage(
-      'assets/images/icon_track_detail_time_base_arrow.webp');
+    'assets/images/icon_track_detail_time_base_arrow.webp',
+  );
 
   /// File path: assets/images/icon_track_error.webp
   AssetGenImage get iconTrackError =>
@@ -583,19 +605,23 @@ class $AssetsImagesGen {
 
   /// File path: assets/images/img_dialog_location_always_tip_1.webp
   AssetGenImage get imgDialogLocationAlwaysTip1 => const AssetGenImage(
-      'assets/images/img_dialog_location_always_tip_1.webp');
+    'assets/images/img_dialog_location_always_tip_1.webp',
+  );
 
   /// File path: assets/images/img_dialog_location_always_tip_2.webp
   AssetGenImage get imgDialogLocationAlwaysTip2 => const AssetGenImage(
-      'assets/images/img_dialog_location_always_tip_2.webp');
+    'assets/images/img_dialog_location_always_tip_2.webp',
+  );
 
   /// File path: assets/images/img_dialog_location_always_tip_3.webp
   AssetGenImage get imgDialogLocationAlwaysTip3 => const AssetGenImage(
-      'assets/images/img_dialog_location_always_tip_3.webp');
+    'assets/images/img_dialog_location_always_tip_3.webp',
+  );
 
   /// File path: assets/images/img_member_first_week_discount_container.webp
   AssetGenImage get imgMemberFirstWeekDiscountContainer => const AssetGenImage(
-      'assets/images/img_member_first_week_discount_container.webp');
+    'assets/images/img_member_first_week_discount_container.webp',
+  );
 
   /// File path: assets/images/img_member_header_ad_1.webp
   AssetGenImage get imgMemberHeaderAd1 =>
@@ -619,7 +645,8 @@ class $AssetsImagesGen {
 
   /// File path: assets/images/img_member_user_cancels_container.webp
   AssetGenImage get imgMemberUserCancelsContainer => const AssetGenImage(
-      'assets/images/img_member_user_cancels_container.webp');
+    'assets/images/img_member_user_cancels_container.webp',
+  );
 
   /// File path: assets/images/img_track_ai_analyse.webp
   AssetGenImage get imgTrackAiAnalyse =>
@@ -635,159 +662,161 @@ class $AssetsImagesGen {
 
   /// List of all assets
   List<AssetGenImage> get values => [
-        bgAddFriendDialog,
-        bgCheckLocationPermission,
-        bgDialogLocationPermissionIos,
-        bgDialogTrackError,
-        bgFriendItem,
-        bgLocationAnalyse,
-        bgLocationAnalyseAi,
-        bgLoginHeadContainer,
-        bgMemberHeader,
-        bgMineMemberCard,
-        bgPageBackground,
-        bgTrackLocationTie,
-        bgTrackPieChat,
-        bgUrgentContactAdd,
-        bgUrgentContactEmpty,
-        bgUrgentContactLogo,
-        bgUrgentContactPopup,
-        iconAccountReplaceLogo,
-        iconAddFriendBackGround,
-        iconAgreementClose,
-        iconAlipayPayment,
-        iconAlipayScanPayment,
-        iconAppleRecoverSubscribe,
-        iconAvatarClose,
-        iconAvatarSelected,
-        iconBlackBack,
-        iconCallPhone,
-        iconCbSelected,
-        iconCbUnSelect,
-        iconCheckboxSelected,
-        iconCheckboxUnSelect,
-        iconDefaultFriendAvatar,
-        iconDefaultMineAvatar,
-        iconDialogAddFriend,
-        iconDialogClose,
-        iconDialogClose2,
-        iconDialogNetError,
-        iconEvaluate1,
-        iconEvaluate2,
-        iconEvaluate3,
-        iconEvaluate4,
-        iconEvaluate5,
-        iconExperiment,
-        iconFriendEdit,
-        iconFriendEditArrow,
-        iconFriendNews,
-        iconFriendSettingCopy,
-        iconGuard,
-        iconLoginAddressBook,
-        iconLoginClose,
-        iconLoginGoWxArrow,
-        iconLoginPhone,
-        iconLoginWx,
-        iconLogo,
-        iconLogoMax,
-        iconMainAddFriend,
-        iconMainFriendGuard,
-        iconMainHelp,
-        iconMainMapClock,
-        iconMainMine,
-        iconMainNews,
-        iconMainRefreshFriendLocation,
-        iconMainRefreshMineLocation,
-        iconMainTrackArrow,
-        iconMemberAvatar,
-        iconMemberCommentVerySatisfied,
-        iconMemberContactClickHelp,
-        iconMemberContactClickHelpClose,
-        iconMemberFun5,
-        iconMemberFun1,
-        iconMemberFun2,
-        iconMemberFun3,
-        iconMemberFun4,
-        iconMemberFun6,
-        iconMemberOrdinaryProductNormal,
-        iconMemberOrdinaryProductSelect,
-        iconMemberPaymentCompleted,
-        iconMemberRetainClose,
-        iconMemberSettlementBg,
-        iconMemberSettlementConfirm,
-        iconMemberSpecialProductsNormal,
-        iconMemberSpecialProductsSelect,
-        iconMemberVipBack,
-        iconMemberVipMiddleBg,
-        iconMemberVipMore,
-        iconMemberVipReceiveArrow,
-        iconMemberVipSign,
-        iconMessageFriendHelp,
-        iconMineFunAbout,
-        iconMineFunAccountFeedback,
-        iconMineFunArrow,
-        iconMineFunCustomerService,
-        iconMineFunExitAccount,
-        iconMineFunLogoutAccount,
-        iconMineFunPermissionSetting,
-        iconMineFunShare,
-        iconMineLogged,
-        iconMineNoLogin,
-        iconMineSmallVip,
-        iconMineTrialExpirationBg,
-        iconMineTrialExpirationHave,
-        iconMineTrialExpirationHeader,
-        iconMineTrialExpirationPauseBg,
-        iconMineTrialExpirationQuestion,
-        iconMineTrialExpirationRecommend,
-        iconMineTrialExpirationUp,
-        iconMineTrialExpirationVip,
-        iconMineUnlockVip,
-        iconMineUrgentContact,
-        iconNetMobile,
-        iconNetWifi,
-        iconNews,
-        iconNewsItem,
-        iconSplashTitle,
-        iconTrackAiInterpretation,
-        iconTrackAnalyseRefresh,
-        iconTrackDailyReport,
-        iconTrackDailySummary,
-        iconTrackDailySummaryArrow,
-        iconTrackDetailTimeBaseArrow,
-        iconTrackError,
-        iconTrackLocation,
-        iconTrackLocationNow,
-        iconTrackMoving,
-        iconTrackSearch,
-        iconTrackSearchClear,
-        iconTrackSelectTimeArrow,
-        iconTrackStay,
-        iconTrackUnlock,
-        iconTrackUnlockNoPermission,
-        iconUrgentAdd,
-        iconUrgentContactAdd,
-        iconUrgentContactDialPhone,
-        iconUrgentContactMore,
-        iconUrgentContactTipBg,
-        iconVip,
-        iconWechatPayment,
-        iconWechatScanPayment,
-        iconWhiteBack,
-        imgDialogLocationAlwaysTip1,
-        imgDialogLocationAlwaysTip2,
-        imgDialogLocationAlwaysTip3,
-        imgMemberFirstWeekDiscountContainer,
-        imgMemberHeaderAd1,
-        imgMemberHeaderAd2,
-        imgMemberHeaderAd3,
-        imgMemberHeaderAd4,
-        imgMemberRetainContainer,
-        imgMemberUserCancelsContainer,
-        imgTrackAiAnalyse,
-        imgTrackNoData,
-        imgTrackNoMemberTips
-      ];
+    bgAddFriendDialog,
+    bgCheckLocationPermission,
+    bgDialogLocationPermissionIos,
+    bgDialogTrackError,
+    bgFriendItem,
+    bgLocationAnalyse,
+    bgLocationAnalyseAi,
+    bgLoginHeadContainer,
+    bgMemberHeader,
+    bgMineMemberCard,
+    bgPageBackground,
+    bgTrackLocationTie,
+    bgTrackPieChat,
+    bgUrgentContactAdd,
+    bgUrgentContactEmpty,
+    bgUrgentContactLogo,
+    bgUrgentContactPopup,
+    iconAccountReplaceLogo,
+    iconAddFriendBackGround,
+    iconAgreementClose,
+    iconAlipayPayment,
+    iconAlipayScanPayment,
+    iconAppleRecoverSubscribe,
+    iconAvatarClose,
+    iconAvatarSelected,
+    iconBlackBack,
+    iconCallPhone,
+    iconCbSelected,
+    iconCbUnSelect,
+    iconCheckboxSelected,
+    iconCheckboxUnSelect,
+    iconDefaultFriendAvatar,
+    iconDefaultMineAvatar,
+    iconDialogAddFriend,
+    iconDialogClose,
+    iconDialogClose2,
+    iconDialogNetError,
+    iconEvaluate1,
+    iconEvaluate2,
+    iconEvaluate3,
+    iconEvaluate4,
+    iconEvaluate5,
+    iconExperiment,
+    iconFriendEdit,
+    iconFriendEditArrow,
+    iconFriendNews,
+    iconFriendSettingCopy,
+    iconGuard,
+    iconLoginAddressBook,
+    iconLoginClose,
+    iconLoginGoWxArrow,
+    iconLoginPhone,
+    iconLoginWx,
+    iconLogo,
+    iconLogoMax,
+    iconMainAddFriend,
+    iconMainFriendGuard,
+    iconMainHelp,
+    iconMainMapClock,
+    iconMainMine,
+    iconMainNews,
+    iconMainRefreshFriendLocation,
+    iconMainRefreshMineLocation,
+    iconMainTrackArrow,
+    iconMemberAvatar,
+    iconMemberCommentVerySatisfied,
+    iconMemberContactClickHelp,
+    iconMemberContactClickHelpClose,
+    iconMemberFun5,
+    iconMemberFun1,
+    iconMemberFun2,
+    iconMemberFun3,
+    iconMemberFun4,
+    iconMemberFun6,
+    iconMemberOrdinaryProductNormal,
+    iconMemberOrdinaryProductSelect,
+    iconMemberPaymentCompleted,
+    iconMemberRetainClose,
+    iconMemberSettlementBg,
+    iconMemberSettlementConfirm,
+    iconMemberSpecialProductsNormal,
+    iconMemberSpecialProductsSelect,
+    iconMemberVipBack,
+    iconMemberVipMiddleBg,
+    iconMemberVipMore,
+    iconMemberVipReceiveArrow,
+    iconMemberVipSign,
+    iconMessageFriendHelp,
+    iconMineFunAbout,
+    iconMineFunAccountFeedback,
+    iconMineFunArrow,
+    iconMineFunCustomerService,
+    iconMineFunExitAccount,
+    iconMineFunLogoutAccount,
+    iconMineFunPermissionSetting,
+    iconMineFunShare,
+    iconMineLogged,
+    iconMineNoLogin,
+    iconMineSmallVip,
+    iconMineTrialExpirationBg,
+    iconMineTrialExpirationHave,
+    iconMineTrialExpirationHeader,
+    iconMineTrialExpirationPauseBg,
+    iconMineTrialExpirationQuestion,
+    iconMineTrialExpirationRecommend,
+    iconMineTrialExpirationUp,
+    iconMineTrialExpirationVip,
+    iconMineUnlockVip,
+    iconMineUrgentContact,
+    iconNetMobile,
+    iconNetWifi,
+    iconNews,
+    iconNewsItem,
+    iconNewsReport,
+    iconNewsReportAgree,
+    iconSplashTitle,
+    iconTrackAiInterpretation,
+    iconTrackAnalyseRefresh,
+    iconTrackDailyReport,
+    iconTrackDailySummary,
+    iconTrackDailySummaryArrow,
+    iconTrackDetailTimeBaseArrow,
+    iconTrackError,
+    iconTrackLocation,
+    iconTrackLocationNow,
+    iconTrackMoving,
+    iconTrackSearch,
+    iconTrackSearchClear,
+    iconTrackSelectTimeArrow,
+    iconTrackStay,
+    iconTrackUnlock,
+    iconTrackUnlockNoPermission,
+    iconUrgentAdd,
+    iconUrgentContactAdd,
+    iconUrgentContactDialPhone,
+    iconUrgentContactMore,
+    iconUrgentContactTipBg,
+    iconVip,
+    iconWechatPayment,
+    iconWechatScanPayment,
+    iconWhiteBack,
+    imgDialogLocationAlwaysTip1,
+    imgDialogLocationAlwaysTip2,
+    imgDialogLocationAlwaysTip3,
+    imgMemberFirstWeekDiscountContainer,
+    imgMemberHeaderAd1,
+    imgMemberHeaderAd2,
+    imgMemberHeaderAd3,
+    imgMemberHeaderAd4,
+    imgMemberRetainContainer,
+    imgMemberUserCancelsContainer,
+    imgTrackAiAnalyse,
+    imgTrackNoData,
+    imgTrackNoMemberTips,
+  ];
 }
 
 class Assets {
@@ -798,11 +827,7 @@ class Assets {
 }
 
 class AssetGenImage {
-  const AssetGenImage(
-    this._assetName, {
-    this.size,
-    this.flavors = const {},
-  });
+  const AssetGenImage(this._assetName, {this.size, this.flavors = const {}});
 
   final String _assetName;
 
@@ -862,15 +887,8 @@ class AssetGenImage {
     );
   }
 
-  ImageProvider provider({
-    AssetBundle? bundle,
-    String? package,
-  }) {
-    return AssetImage(
-      _assetName,
-      bundle: bundle,
-      package: package,
-    );
+  ImageProvider provider({AssetBundle? bundle, String? package}) {
+    return AssetImage(_assetName, bundle: bundle, package: package);
   }
 
   String get path => _assetName;

+ 2 - 2
lib/resource/string.gen.dart

@@ -109,7 +109,7 @@ class StringName {
   static String get blockFriendOff => 'block_friend_off'.tr; // 屏蔽好友已关闭
   static String get friendDelete => 'friend_delete'.tr; // 删除好友
   static String get kindlyReminder => 'kindly_reminder'.tr; // 温馨提示
-  static String get friendDeleteContent => 'friend_delete_content'.tr; // 互删好友后,双方将停止位置的分享以及清除相关定位记录,是否确认互删
+  static String get friendDeleteContent => 'friend_delete_content'.tr; // 互删好友后,双方将停止共享位置,清除相关定位记录并屏蔽,是否确认互删
   static String get deleteSuccess => 'delete_success'.tr; // 删除成功
   static String get copyPhoneNumSuccess => 'copy_phone_num_success'.tr; // 手机号复制成功
   static String get friendUpdateRemarkTitle => 'friend_update_remark_title'.tr; // 修改备注
@@ -416,7 +416,7 @@ class StringMultiSource {
       'block_friend_off': '屏蔽好友已关闭',
       'friend_delete': '删除好友',
       'kindly_reminder': '温馨提示',
-      'friend_delete_content': '互删好友后,双方将停止位置的分享以及清除相关定位记录,是否确认互删',
+      'friend_delete_content': '互删好友后,双方将停止共享位置,清除相关定位记录并屏蔽,是否确认互删',
       'delete_success': '删除成功',
       'copy_phone_num_success': '手机号复制成功',
       'friend_update_remark_title': '修改备注',

+ 5 - 0
lib/router/app_pages.dart

@@ -32,6 +32,8 @@ import '../module/login/login_page.dart';
 import '../module/main/main_controller.dart';
 import '../module/mine/mine_controller.dart';
 import '../module/news/news_controller.dart';
+import '../module/news/news_report/news_report_controller.dart';
+import '../module/news/news_report/news_report_page.dart';
 import '../module/splash/splash_page.dart';
 import '../module/track/track_controller.dart';
 import '../module/track/track_page.dart';
@@ -53,6 +55,7 @@ abstract class RoutePath {
   static const track = '/track';
   static const trackDetail = '/trackDetail';
   static const news = '/news';
+  static const newsReport = '/newsReport';
   static const newsPendingList = '/newsPendingList';
   static const urgentContact = '/urgentContact';
   static const feedback = '/feedback';
@@ -74,6 +77,7 @@ class AppBinding extends Bindings {
     lazyPut(() => getIt.get<MemberController>());
     lazyPut(() => getIt.get<TrackController>());
     lazyPut(() => getIt.get<NewsController>());
+    lazyPut(() => getIt.get<NewsReportController>());
     lazyPut(() => getIt.get<NewsPendingListController>());
     lazyPut(() => getIt.get<UrgentContactController>());
     lazyPut(() => getIt.get<AddUrgentContactController>());
@@ -100,6 +104,7 @@ final generalPages = [
   GetPage(name: RoutePath.member, page: () => MemberPage()),
   GetPage(name: RoutePath.track, page: () => TrackPage()),
   GetPage(name: RoutePath.news, page: () => NewsPage()),
+  GetPage(name: RoutePath.newsReport, page: () => NewsReportPage()),
   GetPage(name: RoutePath.newsPendingList, page: () => NewsPendingListPage()),
   GetPage(name: RoutePath.urgentContact, page: () => UrgentContactPage()),
   GetPage(name: RoutePath.feedback, page: () => FeedBackPage()),