Procházet zdrojové kódy

[Fix]谈话详情页面重复打开导致的数据未刷新&事件无响应问题

zhipeng před 1 rokem
rodič
revize
87930ed3a0

+ 5 - 0
lib/data/bean/talks.dart

@@ -97,6 +97,11 @@ class TalkBean {
     progress.value = talkBean.progress.value;
     progressContent.value = talkBean.progressContent.value;
   }
+
+  @override
+  String toString() {
+    return 'TalkBean{id: $id, taskId: $taskId, ssid: $ssid, audioUrl: $audioUrl, duration: $duration, characters: $characters, localAudioUrl: $localAudioUrl, status: $status, title: $title, summary: $summary, createTime: $createTime, isExample: $isExample, oversizeFile: $oversizeFile, uploadType: $uploadType, progress: $progress, progressContent: $progressContent}';
+  }
 }
 
 class TalkStatus {

+ 9 - 7
lib/module/talk/controller.dart

@@ -1,5 +1,5 @@
 import 'dart:async';
-import 'dart:ffi';
+import 'dart:developer';
 import 'dart:io';
 
 import 'package:connectivity_plus/connectivity_plus.dart';
@@ -7,19 +7,20 @@ import 'package:electronic_assistant/base/base_controller.dart';
 import 'package:electronic_assistant/data/consts/event_report_id.dart';
 import 'package:electronic_assistant/data/repositories/account_repository.dart';
 import 'package:electronic_assistant/data/repositories/task_repository.dart';
-import 'package:electronic_assistant/module/record/record_handler.dart';
-import 'package:electronic_assistant/router/app_pages.dart';
-import 'package:electronic_assistant/utils/audio_picker_utils.dart';
 import 'package:electronic_assistant/handler/event_handler.dart';
 import 'package:electronic_assistant/module/chat/view.dart';
 import 'package:electronic_assistant/module/login/view.dart';
+import 'package:electronic_assistant/module/record/record_handler.dart';
 import 'package:electronic_assistant/module/store/view.dart';
 import 'package:electronic_assistant/module/talk/summary/view.dart';
 import 'package:electronic_assistant/module/talk/todo/controller.dart';
 import 'package:electronic_assistant/module/talk/todo/view.dart';
+import 'package:electronic_assistant/module/talk/view.dart';
 import 'package:electronic_assistant/resource/assets.gen.dart';
 import 'package:electronic_assistant/resource/colors.gen.dart';
 import 'package:electronic_assistant/resource/string.gen.dart';
+import 'package:electronic_assistant/router/app_pages.dart';
+import 'package:electronic_assistant/utils/audio_picker_utils.dart';
 import 'package:electronic_assistant/utils/error_handler.dart';
 import 'package:electronic_assistant/utils/expand.dart';
 import 'package:electronic_assistant/utils/file_upload_check_helper.dart';
@@ -30,7 +31,9 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
 import 'package:get/get.dart';
 import 'package:just_audio/just_audio.dart';
+import 'package:share_plus/share_plus.dart';
 import 'package:wakelock_plus/wakelock_plus.dart';
+
 import '../../data/api/request/agenda_update_bean.dart';
 import '../../data/bean/agenda.dart';
 import '../../data/bean/agenda_list_all_bean.dart';
@@ -45,7 +48,6 @@ import '../../utils/event_bus.dart';
 import '../../utils/system_share_util.dart';
 import '../../utils/toast_util.dart';
 import 'original/view.dart';
-import 'package:share_plus/share_plus.dart';
 
 class TalkController extends BaseController {
   static const String argumentItem = 'argument_item';
@@ -101,8 +103,6 @@ class TalkController extends BaseController {
 
   StreamSubscription? _talkBeanListener;
 
-  final pages = [const SummaryView(), const TodoView(), const OriginalView()];
-
   TextEditingController? _agendaContentController;
   TextEditingController? _agendaNameController;
 
@@ -167,6 +167,7 @@ class TalkController extends BaseController {
     });
 
     _audioPlayer.positionStream.listen((duration) {
+      debugPrint('音频播放时长 == ${duration.inMilliseconds}');
       playingDuration.value = duration;
       if (audioDuration.value.inMilliseconds > 0) {
         audioProgressValue.value =
@@ -177,6 +178,7 @@ class TalkController extends BaseController {
   }
 
   void _dealTalk(TalkBean? bean) async {
+    debugPrint('talkBean == $bean');
     String? id = bean?.id;
     if (id == null) {
       return;

+ 6 - 3
lib/module/talk/original/controller.dart

@@ -3,6 +3,7 @@ import 'dart:async';
 import 'package:electronic_assistant/base/base_controller.dart';
 import 'package:electronic_assistant/data/consts/event_report_id.dart';
 import 'package:electronic_assistant/data/repositories/talk_repository.dart';
+import 'package:electronic_assistant/module/talk/controller.dart';
 import 'package:electronic_assistant/resource/string.gen.dart';
 import 'package:electronic_assistant/utils/error_handler.dart';
 import 'package:electronic_assistant/utils/toast_util.dart';
@@ -11,17 +12,19 @@ import 'package:get/get.dart';
 import '../../../data/bean/talk_original.dart';
 import '../../../data/bean/talks.dart';
 import '../../../data/repositories/account_repository.dart';
-import '../controller.dart';
 
 class OriginalController extends BaseController {
-  TalkController talkController = Get.find();
-
   final originalList = <TalkOriginal>[].obs;
+  final String? talkId;
 
   StreamSubscription? _talkBeanListener;
   StreamSubscription? _talkStatusListener;
   StreamSubscription? _audioPlayingListener;
 
+  OriginalController(this.talkId);
+
+  get talkController => Get.find<TalkController>(tag: talkId);
+
   @override
   void onReady() {
     super.onReady();

+ 8 - 2
lib/module/talk/original/view.dart

@@ -1,5 +1,4 @@
 import 'package:electronic_assistant/base/base_page.dart';
-import 'package:electronic_assistant/data/bean/store_item.dart';
 import 'package:electronic_assistant/data/bean/talks.dart';
 import 'package:electronic_assistant/resource/assets.gen.dart';
 import 'package:electronic_assistant/resource/colors.gen.dart';
@@ -14,7 +13,14 @@ import '../common_view.dart';
 import 'controller.dart';
 
 class OriginalView extends BasePage<OriginalController> {
-  const OriginalView({super.key});
+  final String? talkId;
+
+  OriginalView(this.talkId, {super.key}) {
+    Get.lazyPut(() => OriginalController(talkId), tag: talkId);
+  }
+
+  @override
+  get controller => Get.find<OriginalController>(tag: talkId);
 
   @override
   Widget buildBody(BuildContext context) {

+ 7 - 3
lib/module/talk/summary/controller.dart

@@ -5,19 +5,23 @@ import 'package:electronic_assistant/data/bean/agenda.dart';
 import 'package:electronic_assistant/data/bean/talks.dart';
 import 'package:electronic_assistant/data/consts/event_report_id.dart';
 import 'package:electronic_assistant/data/repositories/talk_repository.dart';
+import 'package:electronic_assistant/module/talk/controller.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:get/get.dart';
+
 import '../../../data/bean/agenda_list_all_bean.dart';
-import '../controller.dart';
 
 class SummaryController extends BaseController {
-  final TalkController talkController = Get.find();
-
   final Rxn<TalkBean> summaryBean = Rxn();
+  final String? talkId;
 
   StreamSubscription? _talkStatusListener;
   StreamSubscription? _talkBeanListener;
 
+  SummaryController(this.talkId);
+
+  get talkController => Get.find<TalkController>(tag: talkId);
+
   RxList<AgendaListAllBean> get agendaAllList => talkController.agendaAllList;
 
   RxBool get _isEditModel => talkController.isEditModelRx;

+ 9 - 1
lib/module/talk/summary/view.dart

@@ -7,6 +7,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:flutter_widget_from_html/flutter_widget_from_html.dart';
 import 'package:get/get.dart';
 import 'package:markdown/markdown.dart' as md;
+
 import '../../../data/bean/talks.dart';
 import '../../browser/view.dart';
 import '../../home/view.dart';
@@ -14,7 +15,14 @@ import '../common_view.dart';
 import 'controller.dart';
 
 class SummaryView extends BasePage<SummaryController> {
-  const SummaryView({super.key});
+  final String? talkId;
+
+  SummaryView(this.talkId, {super.key}) {
+    Get.lazyPut(() => SummaryController(talkId), tag: talkId);
+  }
+
+  @override
+  get controller => Get.find<SummaryController>(tag: talkId);
 
   @override
   Widget buildBody(BuildContext context) {

+ 6 - 2
lib/module/talk/todo/controller.dart

@@ -8,6 +8,7 @@ import 'package:electronic_assistant/module/chat/view.dart';
 import 'package:electronic_assistant/utils/error_handler.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:get/get.dart';
+
 import '../../../data/bean/agenda_list_all_bean.dart';
 import '../../../data/bean/talks.dart';
 import '../../../utils/event_bus.dart';
@@ -15,8 +16,7 @@ import '../controller.dart';
 
 class TodoController extends BaseController {
   static String refreshTalkMineTask = "refreshTalkMineTask";
-
-  final TalkController _talkController = Get.find();
+  final String? talkId;
 
   StreamSubscription? _talkBeanListener;
 
@@ -24,6 +24,10 @@ class TodoController extends BaseController {
 
   final mineAgendaIsExpanded = true.obs;
 
+  TodoController(this.talkId);
+
+  get _talkController => Get.find<TalkController>(tag: talkId);
+
   RxList<AgendaListAllBean> get agendaAllList => _talkController.agendaAllList;
 
   Rxn<TalkBean> get talkBean => _talkController.talkBean;

+ 8 - 1
lib/module/talk/todo/view.dart

@@ -15,7 +15,14 @@ import '../common_view.dart';
 import 'controller.dart';
 
 class TodoView extends BasePage<TodoController> {
-  const TodoView({super.key});
+  final String? talkId;
+
+  TodoView(this.talkId, {super.key}) {
+    Get.lazyPut(() => TodoController(talkId), tag: talkId);
+  }
+
+  @override
+  get controller => Get.find<TodoController>(tag: talkId);
 
   @override
   Widget buildBody(BuildContext context) {

+ 41 - 15
lib/module/talk/view.dart

@@ -1,41 +1,67 @@
 import 'package:electronic_assistant/base/base_page.dart';
 import 'package:electronic_assistant/module/talk/controller.dart';
+import 'package:electronic_assistant/module/talk/summary/view.dart';
+import 'package:electronic_assistant/module/talk/todo/view.dart';
 import 'package:electronic_assistant/resource/colors.gen.dart';
 import 'package:electronic_assistant/utils/expand.dart';
 import 'package:electronic_assistant/utils/fixed_size_tab_indicator.dart';
-import 'package:electronic_assistant/utils/notification_util.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
 import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get.dart';
+
 import '../../data/bean/talks.dart';
 import '../../data/consts/event_report_id.dart';
 import '../../resource/assets.gen.dart';
 import '../../resource/string.gen.dart';
 import '../../router/app_pages.dart';
 import '../../utils/common_style.dart';
+import 'original/view.dart';
 
 class TalkPage extends BasePage<TalkController> {
-  const TalkPage({super.key});
+  final String? talkId;
+
+  late final List<Widget> _pages;
+
+  TalkPage({super.key})
+      : talkId = Get.arguments[TalkController.argumentTalkId] {
+    Get.lazyPut<TalkController>(() => TalkController(),
+        tag: talkId, fenix: true);
+    _pages = [
+      SummaryView(talkId),
+      TodoView(talkId),
+      OriginalView(talkId),
+    ];
+  }
+
+  @override
+  get controller => Get.find<TalkController>(tag: talkId);
 
   static void start(TalkBean item, {String eventTag = EventId.id_002}) {
-    if (Get.currentRoute == RoutePath.talkDetail) {
-      Get.back();
+    if (Get.currentRoute == RoutePath.talkDetail &&
+        Get.arguments[TalkController.argumentTalkId] == item.id) {
+      return;
     }
-    Get.toNamed(RoutePath.talkDetail, arguments: {
-      TalkController.argumentItem: item,
-      TalkController.argumentEventTag: eventTag,
-    });
+    Get.toNamed(RoutePath.talkDetail,
+        arguments: {
+          TalkController.argumentItem: item,
+          TalkController.argumentEventTag: eventTag,
+          TalkController.argumentTalkId: item.id,
+        },
+        preventDuplicates: false);
   }
 
   static void startById(String talkId, {String eventTag = ''}) {
-    if (Get.currentRoute == RoutePath.talkDetail) {
-      Get.back();
+    if (Get.currentRoute == RoutePath.talkDetail &&
+        Get.arguments[TalkController.argumentTalkId] == talkId) {
+      return;
     }
-    Get.toNamed(RoutePath.talkDetail, arguments: {
-      TalkController.argumentTalkId: talkId,
-      TalkController.argumentEventTag: eventTag,
-    });
+    Get.toNamed(RoutePath.talkDetail,
+        arguments: {
+          TalkController.argumentTalkId: talkId,
+          TalkController.argumentEventTag: eventTag,
+        },
+        preventDuplicates: false);
   }
 
   @override
@@ -231,7 +257,7 @@ class TalkPage extends BasePage<TalkController> {
         physics: controller.isEditModel
             ? const NeverScrollableScrollPhysics()
             : null,
-        children: controller.pages,
+        children: _pages,
       ),
     );
   }

+ 5 - 8
lib/router/app_pages.dart

@@ -13,9 +13,6 @@ import 'package:electronic_assistant/module/record/controller.dart';
 import 'package:electronic_assistant/module/splash/controller.dart';
 import 'package:electronic_assistant/module/store/controller.dart';
 import 'package:electronic_assistant/module/store/view.dart';
-import 'package:electronic_assistant/module/talk/controller.dart';
-import 'package:electronic_assistant/module/talk/summary/controller.dart';
-import 'package:electronic_assistant/module/talk/todo/controller.dart';
 import 'package:electronic_assistant/module/talk/view.dart';
 import 'package:get/get.dart';
 
@@ -34,7 +31,7 @@ import '../module/login/view.dart';
 import '../module/main/view.dart';
 import '../module/record/view.dart';
 import '../module/splash/view.dart';
-import '../module/talk/original/controller.dart';
+import '../module/talk/controller.dart';
 
 abstract class AppPage {
   static final pages = <GetPage>[
@@ -85,9 +82,6 @@ class AppBinding extends Bindings {
     lazyPut(() => ChatController());
     lazyPut(() => TalkController());
     lazyPut(() => RecordController());
-    lazyPut(() => OriginalController());
-    lazyPut(() => SummaryController());
-    lazyPut(() => TodoController());
     lazyPut(() => StoreController());
     lazyPut(() => FilesController());
     lazyPut(() => FileSearchController());
@@ -115,7 +109,10 @@ final generalPages = [
   GetPage(name: RoutePath.taskSearch, page: () => const AgendaSearchPage()),
   GetPage(name: RoutePath.record, page: () => const RecordPage()),
   GetPage(name: RoutePath.store, page: () => const StorePage()),
-  GetPage(name: RoutePath.talkDetail, page: () => const TalkPage()),
+  GetPage(
+      name: RoutePath.talkDetail,
+      page: () => TalkPage(),
+      preventDuplicates: false),
   GetPage(name: RoutePath.browser, page: () => const BrowserPage()),
   GetPage(name: RoutePath.agendaDetail, page: () => const AgendaDetailPage()),
   GetPage(name: RoutePath.audioPicker, page: () => const AudioPickerPage()),