فهرست منبع

[new]增加用户反馈界面

zk 8 ماه پیش
والد
کامیت
79e9814431

BIN
assets/images/icon_mine_urgent_contact.webp


+ 6 - 0
assets/string/base/string.xml

@@ -225,4 +225,10 @@
     <string name="urgent_contact_add_max_tip">最多添加5人,请移除后再添加</string>
     <string name="urgent_contact_ems_send_fail">短信发送失败,请核实手机号码</string>
     <string name="urgent_contact_ems_send_part_fail">部分号码发送失败</string>
+    <string name="feed_back">用户反馈</string>
+    <string name="feed_back_title">意见或建议:</string>
+    <string name="feed_back_hint">请详细描述您的问题</string>
+    <string name="feed_back_submit_txt">提 交</string>
+    <string name="feed_back_customer_service">联系客服</string>
+    <string name="feed_back_success">提交成功,感谢您的反馈!</string>
 </resources>

+ 2 - 0
lib/di/get_it.config.dart

@@ -22,6 +22,7 @@ import '../data/repositories/track_repository.dart' as _i240;
 import '../data/repositories/urgent_contact_repository.dart' as _i983;
 import '../module/add_friend/add_friend_dialog_controller.dart' as _i897;
 import '../module/browser/browser_controller.dart' as _i923;
+import '../module/feedback/feed_back_controller.dart' as _i769;
 import '../module/friend/friend_controller.dart' as _i821;
 import '../module/friend/setting/friend_setting_controller.dart' as _i492;
 import '../module/login/login_controller.dart' as _i1008;
@@ -53,6 +54,7 @@ extension GetItInjectableX on _i174.GetIt {
     gh.factory<_i923.BrowserController>(() => _i923.BrowserController());
     gh.factory<_i269.MemberController>(() => _i269.MemberController());
     gh.factory<_i973.SplashController>(() => _i973.SplashController());
+    gh.factory<_i769.FeedBackController>(() => _i769.FeedBackController());
     gh.singleton<_i361.Dio>(() => networkModule.createDefaultDio());
     gh.lazySingleton<_i220.AtmobLocationClient>(
         () => _i220.AtmobLocationClient());

+ 32 - 0
lib/module/feedback/feed_back_controller.dart

@@ -0,0 +1,32 @@
+import 'package:get/get.dart';
+import 'package:get/get_core/src/get_main.dart';
+import 'package:injectable/injectable.dart';
+import 'package:location/base/base_controller.dart';
+import 'package:location/resource/string.gen.dart';
+import 'package:location/utils/toast_util.dart';
+
+@injectable
+class FeedBackController extends BaseController {
+  final RxString _content = RxString('');
+
+  String get content => _content.value;
+
+  void back() {
+    Get.back();
+  }
+
+  set content(String value) {
+    _content.value = value;
+  }
+
+  void submit() {
+    if (content.isEmpty) {
+      ToastUtil.show(StringName.feedBackHint);
+      return;
+    }
+    ToastUtil.show(StringName.feedBackSuccess);
+    Get.back();
+  }
+
+  void onCustomerServiceClick() {}
+}

+ 107 - 0
lib/module/feedback/feed_back_page.dart

@@ -0,0 +1,107 @@
+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/base/base_page.dart';
+import 'package:location/resource/string.gen.dart';
+import 'package:location/utils/common_expand.dart';
+import '../../resource/colors.gen.dart';
+import '../../router/app_pages.dart';
+import '../../widget/common_view.dart';
+import 'feed_back_controller.dart';
+
+class FeedBackPage extends BasePage<FeedBackController> {
+  const FeedBackPage({super.key});
+
+  static void start() {
+    Get.toNamed(RoutePath.feedback);
+  }
+
+  @override
+  Widget buildBody(BuildContext context) {
+    return Column(
+      crossAxisAlignment: CrossAxisAlignment.center,
+      children: [
+        CommonView.buildAppBar(StringName.feedBack,
+            backOnTap: controller.back, titleCenter: false),
+        SizedBox(height: 12.w),
+        Align(
+          alignment: Alignment.centerLeft,
+          child: Padding(
+            padding: EdgeInsets.only(left: 14.w),
+            child: Text(StringName.feedBackTitle,
+                style: TextStyle(fontSize: 14.sp, color: '#202020'.color)),
+          ),
+        ),
+        SizedBox(height: 12.w),
+        buildFeedbackPrintView(),
+        SizedBox(height: 120.w),
+        GestureDetector(
+          onTap: controller.submit,
+          child: Container(
+            width: 240.w,
+            height: 50.w,
+            decoration: BoxDecoration(
+              color: ColorName.colorPrimary,
+              borderRadius: BorderRadius.circular(100.w),
+            ),
+            child: Center(
+              child: Text(StringName.feedBackSubmitTxt,
+                  style: TextStyle(fontSize: 16.sp, color: ColorName.white)),
+            ),
+          ),
+        ),
+        SizedBox(height: 24.w),
+        GestureDetector(
+          onTap: controller.onCustomerServiceClick,
+          child: Text(StringName.feedBackCustomerService,
+              style: TextStyle(
+                  decoration: TextDecoration.underline,
+                  fontSize: 14.sp,
+                  color: ColorName.black)),
+        )
+      ],
+    );
+  }
+
+  Widget buildFeedbackPrintView() {
+    return Container(
+      margin: EdgeInsets.symmetric(horizontal: 12.w),
+      decoration: BoxDecoration(
+        color: '#FAFAFA'.color,
+        borderRadius: BorderRadius.circular(6.w),
+      ),
+      child: Stack(children: [
+        TextField(
+          keyboardType: TextInputType.multiline,
+          maxLength: 500,
+          maxLines: null,
+          minLines: 12,
+          style: TextStyle(fontSize: 14.sp, color: ColorName.primaryTextColor),
+          decoration: InputDecoration(
+            counterText: "",
+            border: InputBorder.none,
+            fillColor: Colors.transparent,
+            hintText: StringName.feedBackHint,
+            hintStyle: TextStyle(fontSize: 14.sp, color: '#A7A7A7'.color),
+            contentPadding: EdgeInsets.only(
+                left: 12.w, right: 12.w, top: 12.w, bottom: 28.w),
+          ),
+          onChanged: (value) {
+            controller.content = value;
+          },
+        ),
+        Obx(() {
+          return Positioned(
+            bottom: 10.w,
+            right: 12.w,
+            child: Text('${controller.content.length}/500',
+                style: TextStyle(fontSize: 14.sp, color: '#A7A7A7'.color)),
+          );
+        })
+      ]),
+    );
+  }
+}

+ 11 - 2
lib/module/mine/mine_controller.dart

@@ -3,11 +3,14 @@ import 'package:get/get_core/src/get_main.dart';
 import 'package:injectable/injectable.dart';
 import 'package:location/base/base_controller.dart';
 import 'package:location/data/bean/member_status_info.dart';
+import 'package:location/module/feedback/feed_back_page.dart';
 import 'package:location/module/login/login_page.dart';
 import 'package:location/module/urgent_contact/urgent_contact_page.dart';
 import 'package:location/resource/string.gen.dart';
 import '../../data/repositories/account_repository.dart';
 import '../../dialog/common_alert_dialog_impl.dart';
+import '../../sdk/wechat/wechat_share_util.dart';
+import '../../utils/toast_util.dart';
 
 @injectable
 class MineController extends BaseController {
@@ -33,13 +36,19 @@ class MineController extends BaseController {
     return '${StringName.mineAccountLoggedDesc}$phone';
   }
 
-  onShareClick() {}
+  onShareClick() {
+    WechatShareUtil.shareWebPage().catchError((error) {
+      ToastUtil.show(error);
+    });
+  }
 
   onCustomerServiceClick() {}
 
   onPermissionSettingClick() {}
 
-  onAccountFeedbackClick() {}
+  onAccountFeedbackClick() {
+    FeedBackPage.start();
+  }
 
   onAboutClick() {}
 

+ 2 - 1
lib/module/mine/mine_page.dart

@@ -317,7 +317,8 @@ class MinePage extends BasePage<MineController> {
       padding: EdgeInsets.symmetric(vertical: 5.w),
       child: Column(
         children: [
-          buildMineFunItem(Assets.images.iconMineFunShare.provider(),
+          buildMineFunItem(
+              Assets.images.iconMineUrgentContact.provider(),
               StringName.mineUrgentContact,
               () => controller.onUrgentContactClick()),
           buildMineFunItem(Assets.images.iconMineFunShare.provider(),

+ 5 - 0
lib/resource/assets.gen.dart

@@ -228,6 +228,10 @@ class $AssetsImagesGen {
   AssetGenImage get iconMineUnlockVip =>
       const AssetGenImage('assets/images/icon_mine_unlock_vip.webp');
 
+  /// File path: assets/images/icon_mine_urgent_contact.webp
+  AssetGenImage get iconMineUrgentContact =>
+      const AssetGenImage('assets/images/icon_mine_urgent_contact.webp');
+
   /// File path: assets/images/icon_news.webp
   AssetGenImage get iconNews =>
       const AssetGenImage('assets/images/icon_news.webp');
@@ -340,6 +344,7 @@ class $AssetsImagesGen {
         iconMineNoLogin,
         iconMineSmallVip,
         iconMineUnlockVip,
+        iconMineUrgentContact,
         iconNews,
         iconNewsItem,
         iconSplashTitle,

+ 13 - 0
lib/resource/string.gen.dart

@@ -185,6 +185,13 @@ class StringName {
   static final String urgentContactAddMaxTip = 'urgent_contact_add_max_tip'.tr; // 最多添加5人,请移除后再添加
   static final String urgentContactEmsSendFail = 'urgent_contact_ems_send_fail'.tr; // 短信发送失败,请核实手机号码
   static final String urgentContactEmsSendPartFail = 'urgent_contact_ems_send_part_fail'.tr; // 部分号码发送失败
+  static final String feedBack = 'feed_back'.tr; // 用户反馈
+  static final String feedBackTitle = 'feed_back_title'.tr; // 意见或建议:
+  static final String feedBackHint = 'feed_back_hint'.tr; // 请详细描述您的问题
+  static final String feedBackSubmitTxt = 'feed_back_submit_txt'.tr; // 提 交
+  static final String feedBackCustomerService =
+      'feed_back_customer_service'.tr; // 联系客服
+  static final String feedBackSuccess = 'feed_back_success'.tr; // 提交成功,感谢您的反馈!
 }
 class StringMultiSource {
   StringMultiSource._();
@@ -373,6 +380,12 @@ class StringMultiSource {
       'urgent_contact_add_max_tip': '最多添加5人,请移除后再添加',
       'urgent_contact_ems_send_fail': '短信发送失败,请核实手机号码',
       'urgent_contact_ems_send_part_fail': '部分号码发送失败',
+      'feed_back': '用户反馈',
+      'feed_back_title': '意见或建议:',
+      'feed_back_hint': '请详细描述您的问题',
+      'feed_back_submit_txt': '提 交',
+      'feed_back_customer_service': '联系客服',
+      'feed_back_success': '提交成功,感谢您的反馈!',
     },
   };
 }

+ 5 - 0
lib/router/app_pages.dart

@@ -1,6 +1,8 @@
 import 'package:get/get.dart';
 import 'package:location/di/get_it.dart';
 import 'package:location/module/browser/browser_controller.dart';
+import 'package:location/module/feedback/feed_back_controller.dart';
+import 'package:location/module/feedback/feed_back_page.dart';
 import 'package:location/module/friend/friend_controller.dart';
 import 'package:location/module/friend/friend_page.dart';
 import 'package:location/module/friend/setting/friend_setting_controller.dart';
@@ -43,6 +45,7 @@ abstract class RoutePath {
   static const news = '/news';
   static const newsPendingList = '/newsPendingList';
   static const urgentContact = '/urgentContact';
+  static const feedback = '/feedback';
 }
 
 class AppBinding extends Bindings {
@@ -61,6 +64,7 @@ class AppBinding extends Bindings {
     lazyPut(() => getIt.get<NewsPendingListController>());
     lazyPut(() => getIt.get<UrgentContactController>());
     lazyPut(() => getIt.get<AddUrgentContactController>());
+    lazyPut(() => getIt.get<FeedBackController>());
   }
 
   void lazyPut<S>(InstanceBuilderCallback<S> builder) {
@@ -80,4 +84,5 @@ final generalPages = [
   GetPage(name: RoutePath.news, page: () => NewsPage()),
   GetPage(name: RoutePath.newsPendingList, page: () => NewsPendingListPage()),
   GetPage(name: RoutePath.urgentContact, page: () => UrgentContactPage()),
+  GetPage(name: RoutePath.feedback, page: () => FeedBackPage()),
 ];

+ 3 - 3
lib/widget/common_view.dart

@@ -16,7 +16,7 @@ class CommonView {
   }
 
   static Widget buildAppBar(String title,
-      {VoidCallback? backOnTap, Widget? rightWidget}) {
+      {VoidCallback? backOnTap, Widget? rightWidget, bool titleCenter = true}) {
     return Container(
       width: double.infinity,
       padding: EdgeInsets.symmetric(horizontal: 12.w, vertical: 14.w),
@@ -24,8 +24,8 @@ class CommonView {
         children: [
           GestureDetector(onTap: backOnTap, child: CommonView.getBackBtnView()),
           Positioned(
-            left: 0,
-            right: 0,
+            left: titleCenter ? 0 : 40.w,
+            right: titleCenter ? 0 : null,
             top: 0,
             bottom: 0,
             child: Center(