Procházet zdrojové kódy

[feat]亲密度分析,增加对话分析、识图回复Tab页,处理PageView缓存和嵌套问题

hezihao před 7 měsíci
rodič
revize
ae861ba985

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

@@ -228,6 +228,9 @@
     <string name="intimacy_analyse_tab_report">亲密分析报告</string>
     <string name="intimacy_analyse_tab_screenshot_reply">截图回复</string>
 
+    <string name="intimacy_analyse_tab_conversation_analysis">对话分析</string>
+    <string name="intimacy_analyse_tab_scan_image_reply">识图回复</string>
+
     <string name="intimacy_analyse">亲密度分析</string>
     <string name="intimacy_analyse_upload_card_tip">上传与对方的聊天记录,揭秘文字后的真实想法</string>
     <string name="intimacy_analyse_switch_ta_test">换TA测测</string>

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

@@ -46,8 +46,12 @@ import '../module/intimacy_analyse/analyse_report/intimacy_analyse_report_view_c
 import '../module/intimacy_analyse/intimacy_analyse_controller.dart' as _i977;
 import '../module/intimacy_analyse/intimacy_analyse_upload/intimacy_analyse_upload_controller.dart'
     as _i666;
+import '../module/intimacy_analyse/screenshot_reply/conversation_analysis/conversation_analysis_controller.dart'
+    as _i510;
 import '../module/intimacy_analyse/screenshot_reply/intimacy_analyse_screenshot_reply_controller.dart'
     as _i279;
+import '../module/intimacy_analyse/screenshot_reply/scan_image_reply/scan_image_reply_controller.dart'
+    as _i464;
 import '../module/keyboard/keyboard_controller.dart' as _i161;
 import '../module/keyboard_guide/keyboard_guide_controller.dart' as _i248;
 import '../module/keyboard_manage/keyboard_manage_controller.dart' as _i922;
@@ -103,6 +107,12 @@ extension GetItInjectableX on _i174.GetIt {
     gh.factory<_i415.KeyboardMethodHandler>(
       () => _i415.KeyboardMethodHandler(),
     );
+    gh.factory<_i510.ConversationAnalysisController>(
+      () => _i510.ConversationAnalysisController(),
+    );
+    gh.factory<_i464.ScanImageReplyController>(
+      () => _i464.ScanImageReplyController(),
+    );
     gh.singleton<_i361.Dio>(
       () => networkModule.createStreamDio(),
       instanceName: 'streamDio',

+ 6 - 16
lib/module/intimacy_analyse/intimacy_analyse_controller.dart

@@ -30,11 +30,6 @@ class IntimacyAnalyseController extends BaseController
   }
 
   @override
-  void onInit() {
-    super.onInit();
-  }
-
-  @override
   void onClose() {
     tabController.dispose();
     pageController.dispose();
@@ -43,20 +38,15 @@ class IntimacyAnalyseController extends BaseController
 
   /// 处理Tab切换,联动PageView
   void handleTabChange(int index) {
-    if (!tabController.indexIsChanging) {
-      pageController.animateToPage(
-        index,
-        duration: const Duration(milliseconds: 300),
-        curve: Curves.easeInToLinear,
-      );
-    }
+    pageController.animateToPage(
+      index,
+      duration: const Duration(milliseconds: 300),
+      curve: Curves.easeInToLinear,
+    );
   }
 
   /// 处理PageView切换,联动Tab
   void handlePageChange(int index) {
-    tabController.animateTo(
-      index,
-      duration: const Duration(milliseconds: 300),
-    );
+    tabController.animateTo(index, duration: const Duration(milliseconds: 300));
   }
 }

+ 2 - 1
lib/module/intimacy_analyse/intimacy_analyse_page.dart

@@ -3,6 +3,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get.dart';
 import 'package:keyboard/base/base_page.dart';
 import 'package:keyboard/module/intimacy_analyse/screenshot_reply/intimacy_analyse_screenshot_reply_view.dart';
+import 'package:nested_scroll_views/material.dart';
 import '../../resource/assets.gen.dart';
 import '../../resource/colors.gen.dart';
 import '../../router/app_pages.dart';
@@ -146,7 +147,7 @@ class IntimacyAnalysePage extends BasePage<IntimacyAnalyseController> {
   /// PageView
   Widget _buildContent() {
     return Expanded(
-      child: PageView(
+      child: NestedPageView(
         controller: controller.pageController,
         onPageChanged: (index) {
           controller.handlePageChange(index);

+ 7 - 0
lib/module/intimacy_analyse/screenshot_reply/conversation_analysis/conversation_analysis_controller.dart

@@ -0,0 +1,7 @@
+import 'package:injectable/injectable.dart';
+import 'package:keyboard/base/base_controller.dart';
+
+/// 对话分析Controller
+@injectable
+class ConversationAnalysisController extends BaseController {
+}

+ 25 - 0
lib/module/intimacy_analyse/screenshot_reply/conversation_analysis/conversation_analysis_view.dart

@@ -0,0 +1,25 @@
+import 'package:flutter/material.dart';
+import 'package:keyboard/base/base_view.dart';
+
+import 'conversation_analysis_controller.dart';
+
+/// 对话分析Tab页
+class ConversationAnalysisView
+    extends BaseView<ConversationAnalysisController> {
+  const ConversationAnalysisView({super.key});
+
+  @override
+  Color backgroundColor() {
+    return Colors.transparent;
+  }
+
+  @override
+  Widget buildBody(BuildContext context) {
+    return Center(
+      child: Text(
+        '对话分析',
+        style: TextStyle(fontSize: 20, color: Color(0xFF000000)),
+      ),
+    );
+  }
+}

+ 44 - 2
lib/module/intimacy_analyse/screenshot_reply/intimacy_analyse_screenshot_reply_controller.dart

@@ -1,7 +1,49 @@
+import 'package:flutter/material.dart';
+import 'package:get/get_rx/src/rx_types/rx_types.dart';
+import 'package:get/get_state_manager/src/rx_flutter/rx_ticket_provider_mixin.dart';
 import 'package:injectable/injectable.dart';
 import 'package:keyboard/base/base_controller.dart';
 
+import '../../../resource/string.gen.dart';
+
 /// 亲密度分析-截图回复Tab页-controller
 @injectable
-class IntimacyAnalyseScreenshotReplyController extends BaseController {
-}
+class IntimacyAnalyseScreenshotReplyController extends BaseController
+    with GetTickerProviderStateMixin {
+  /// Tab列表
+  RxList<String> tabBarList =
+      <String>[
+        StringName.intimacyAnalyseTabConversationAnalysis,
+        StringName.intimacyAnalyseTabScanImageReply,
+      ].obs;
+
+  /// Tab控制器
+  late final TabController tabController = TabController(
+    length: tabBarList.length,
+    vsync: this,
+  );
+
+  /// PageView控制器
+  final PageController pageController = PageController();
+
+  @override
+  void onClose() {
+    tabController.dispose();
+    pageController.dispose();
+    super.onClose();
+  }
+
+  /// 处理Tab切换,联动PageView
+  void handleTabChange(int index) {
+    pageController.animateToPage(
+      index,
+      duration: const Duration(milliseconds: 300),
+      curve: Curves.easeInToLinear,
+    );
+  }
+
+  /// 处理PageView切换,联动Tab
+  void handlePageChange(int index) {
+    tabController.animateTo(index, duration: const Duration(milliseconds: 300));
+  }
+}

+ 86 - 2
lib/module/intimacy_analyse/screenshot_reply/intimacy_analyse_screenshot_reply_view.dart

@@ -1,7 +1,12 @@
 import 'package:flutter/material.dart';
+import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:keyboard/base/base_view.dart';
+import 'package:keyboard/module/intimacy_analyse/screenshot_reply/scan_image_reply/scan_image_reply_view.dart';
+import 'package:nested_scroll_views/material.dart';
 
-import '../../../resource/string.gen.dart';
+import '../../../resource/colors.gen.dart';
+import '../../../widget/tabbar/custom_tab_indicator.dart';
+import 'conversation_analysis/conversation_analysis_view.dart';
 import 'intimacy_analyse_screenshot_reply_controller.dart';
 
 /// 亲密度分析-截图回复Tab页
@@ -16,6 +21,85 @@ class IntimacyAnalyseScreenshotReplyView
 
   @override
   Widget buildBody(BuildContext context) {
-    return Center(child: Text(StringName.intimacyAnalyseTabScreenshotReply));
+    return Column(
+      children: [
+        // TabBar
+        _buildTabBar(),
+        // 内容
+        _buildContent(),
+      ],
+    );
+  }
+
+  /// TabBar
+  TabBar _buildTabBar() {
+    return TabBar(
+      // 是否可以滚动
+      isScrollable: true,
+      // 去除底部的黑线
+      dividerHeight: 0,
+      // 去除左边的边距,让Tab居中
+      tabAlignment: TabAlignment.start,
+      // 指示器的颜色
+      indicator: _buildGradientLineIndicator(),
+      // 选中时的颜色
+      labelStyle: TextStyle(
+        fontSize: 17.sp,
+        fontWeight: FontWeight.bold,
+        color: ColorName.white,
+      ),
+      // 未选中时的颜色
+      unselectedLabelStyle: TextStyle(
+        fontSize: 17.sp,
+        color: ColorName.white70,
+      ),
+      // 配置Tab数据
+      tabs:
+          controller.tabBarList.map((tab) {
+            return Tab(text: tab);
+          }).toList(),
+      controller: controller.tabController,
+      onTap: (index) {
+        controller.handleTabChange(index);
+      },
+    );
+  }
+
+  // 自定义渐变指示器
+  CustomTabIndicator _buildGradientLineIndicator() {
+    return CustomTabIndicator(
+      // 指示器的宽度
+      width: 16.0,
+      // 指示器的形状,圆角
+      strokeCap: StrokeCap.round,
+      // 设置渐变色
+      gradient: LinearGradient(
+        colors: [ColorName.colorBrand, ColorName.colorAuxiliary1],
+        begin: Alignment.centerLeft,
+        end: Alignment.centerRight,
+      ),
+      // 指示器距离Tab的外边距
+      insets: EdgeInsets.only(top: 9),
+      // 指示器的高度
+      borderSide: BorderSide(width: 4),
+    );
+  }
+
+  /// PageView
+  Widget _buildContent() {
+    return Expanded(
+      child: NestedPageView(
+        controller: controller.pageController,
+        onPageChanged: (index) {
+          controller.handlePageChange(index);
+        },
+        children: [
+          // 对话分析Tab
+          ConversationAnalysisView(),
+          // 识图回复Tab
+          ScanImageReplyView(),
+        ],
+      ),
+    );
   }
 }

+ 6 - 0
lib/module/intimacy_analyse/screenshot_reply/scan_image_reply/scan_image_reply_controller.dart

@@ -0,0 +1,6 @@
+import 'package:injectable/injectable.dart';
+import 'package:keyboard/base/base_controller.dart';
+
+/// 识图回复Controller
+@injectable
+class ScanImageReplyController extends BaseController {}

+ 23 - 0
lib/module/intimacy_analyse/screenshot_reply/scan_image_reply/scan_image_reply_view.dart

@@ -0,0 +1,23 @@
+import 'package:flutter/material.dart';
+import 'package:keyboard/base/base_view.dart';
+import 'package:keyboard/module/intimacy_analyse/screenshot_reply/scan_image_reply/scan_image_reply_controller.dart';
+
+/// 识图回复Tab页
+class ScanImageReplyView extends BaseView<ScanImageReplyController> {
+  const ScanImageReplyView({super.key});
+
+  @override
+  Color backgroundColor() {
+    return Colors.transparent;
+  }
+
+  @override
+  Widget buildBody(BuildContext context) {
+    return Center(
+      child: Text(
+        '识图回复',
+        style: TextStyle(fontSize: 20, color: Color(0xFF000000)),
+      ),
+    );
+  }
+}

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

@@ -164,6 +164,8 @@ class StringName {
   static final String keyboardGuideTaReply3 = 'keyboard_guide_ta_reply3'.tr; // 我先去吃饭了,一会聊
   static final String intimacyAnalyseTabReport = 'intimacy_analyse_tab_report'.tr; // 亲密分析报告
   static final String intimacyAnalyseTabScreenshotReply = 'intimacy_analyse_tab_screenshot_reply'.tr; // 截图回复
+  static final String intimacyAnalyseTabConversationAnalysis = 'intimacy_analyse_tab_conversation_analysis'.tr; // 对话分析
+  static final String intimacyAnalyseTabScanImageReply = 'intimacy_analyse_tab_scan_image_reply'.tr; // 识图回复
   static final String intimacyAnalyse = 'intimacy_analyse'.tr; // 亲密度分析
   static final String intimacyAnalyseUploadCardTip = 'intimacy_analyse_upload_card_tip'.tr; // 上传与对方的聊天记录,揭秘文字后的真实想法
   static final String intimacyAnalyseSwitchTaTest = 'intimacy_analyse_switch_ta_test'.tr; // 换TA测测
@@ -356,6 +358,8 @@ class StringMultiSource {
       'keyboard_guide_ta_reply3': '我先去吃饭了,一会聊',
       'intimacy_analyse_tab_report': '亲密分析报告',
       'intimacy_analyse_tab_screenshot_reply': '截图回复',
+      'intimacy_analyse_tab_conversation_analysis': '对话分析',
+      'intimacy_analyse_tab_scan_image_reply': '识图回复',
       'intimacy_analyse': '亲密度分析',
       'intimacy_analyse_upload_card_tip': '上传与对方的聊天记录,揭秘文字后的真实想法',
       'intimacy_analyse_switch_ta_test': '换TA测测',

+ 4 - 0
lib/router/app_pages.dart

@@ -35,7 +35,9 @@ import '../module/feedback/feedback_page.dart';
 import '../module/intimacy_analyse/analyse_report/intimacy_analyse_report_view_controller.dart';
 import '../module/intimacy_analyse/intimacy_analyse_upload/intimacy_analyse_upload_controller.dart';
 import '../module/intimacy_analyse/intimacy_analyse_upload/intimacy_analyse_upload_page.dart';
+import '../module/intimacy_analyse/screenshot_reply/conversation_analysis/conversation_analysis_controller.dart';
 import '../module/intimacy_analyse/screenshot_reply/intimacy_analyse_screenshot_reply_controller.dart';
+import '../module/intimacy_analyse/screenshot_reply/scan_image_reply/scan_image_reply_controller.dart';
 import '../module/keyboard_guide/keyboard_guide_controller.dart';
 import '../module/keyboard_guide/keyboard_guide_page.dart';
 import '../module/keyboard_manage/keyboard_manage_page.dart';
@@ -109,6 +111,8 @@ class AppBinding extends Bindings {
     lazyPut(() => getIt.get<ChangeNicknameController>());
     lazyPut(() => getIt.get<ChangeGenderController>());
     lazyPut(() => getIt.get<ChangeBirthdayController>());
+    lazyPut(() => getIt.get<ConversationAnalysisController>());
+    lazyPut(() => getIt.get<ScanImageReplyController>());
   }
 
   void lazyPut<S>(InstanceBuilderCallback<S> builder) {

+ 24 - 0
lib/widget/tabbar/page_keep_alive_wrapper.dart

@@ -0,0 +1,24 @@
+import 'package:flutter/cupertino.dart';
+
+/// 用于PageView的缓存使用的包装组件
+class PageKeepAliveWrapper extends StatefulWidget {
+  final Widget child;
+
+  const PageKeepAliveWrapper({super.key, required this.child});
+
+  @override
+  PageKeepAliveWrapperState createState() => PageKeepAliveWrapperState();
+}
+
+class PageKeepAliveWrapperState extends State<PageKeepAliveWrapper>
+    with AutomaticKeepAliveClientMixin {
+  /// 返回需要缓存
+  @override
+  bool get wantKeepAlive => true;
+
+  @override
+  Widget build(BuildContext context) {
+    super.build(context);
+    return widget.child;
+  }
+}

+ 10 - 2
pubspec.lock

@@ -478,10 +478,10 @@ packages:
     dependency: "direct main"
     description:
       name: flutter_markdown
-      sha256: "04c4722cc36ec5af38acc38ece70d22d3c2123c61305d555750a091517bbe504"
+      sha256: "634622a3a826d67cb05c0e3e576d1812c430fa98404e95b60b131775c73d76ec"
       url: "https://pub.dev"
     source: hosted
-    version: "0.6.23"
+    version: "0.7.7"
   flutter_screenutil:
     dependency: "direct main"
     description:
@@ -947,6 +947,14 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "1.0.0"
+  nested_scroll_views:
+    dependency: "direct main"
+    description:
+      name: nested_scroll_views
+      sha256: "37d0f35682441a4cdf5f50bd5767a53b7192780a085c9dc728fc273df8a3443a"
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.0.12"
   octo_image:
     dependency: transitive
     description:

+ 3 - 0
pubspec.yaml

@@ -76,6 +76,9 @@ dependencies:
   # MarkDown文档渲染
   flutter_markdown: ^0.7.7
 
+  # 解决PageView嵌套和缓存问题
+  nested_scroll_views: ^0.0.12
+
   #QR
   qr_flutter: ^4.1.0