Browse Source

[new]调整首页布局

zk 1 year ago
parent
commit
16bfa697f7

BIN
assets/images/icon_talk_home_small_record.webp


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

@@ -175,4 +175,7 @@
     <string name="guide_ai_secretary">AI秘书</string>
     <string name="guide_ai_secretary_desc">专属秘书,无限问答点这里</string>
     <string name="guide_ai_know">知道了</string>
+    <string name="talk_summary">总结</string>
+    <string name="home_talk_see_more_txt">想找更多谈话?查看</string>
+    <string name="home_talk_all">全部谈话</string>
 </resources>

+ 5 - 0
lib/base/base_page.dart

@@ -27,6 +27,7 @@ abstract class BasePage<T extends BaseController> extends GetView<T> {
           backgroundOnTapEvent();
         },
         child: Container(
+          height: pageHeight(),
           color: backgroundColor(),
           child: immersive()
               ? buildBody(context)
@@ -63,6 +64,10 @@ abstract class BasePage<T extends BaseController> extends GetView<T> {
     return false;
   }
 
+  double? pageHeight() {
+    return null;
+  }
+
   Widget buildBody(BuildContext context);
 
   Color backgroundColor() {

+ 4 - 5
lib/module/agenda/task_item_view.dart

@@ -61,12 +61,11 @@ Widget taskItemView(Agenda item,
           child: GestureDetector(
             onTap: onThinkingClick,
             child: Container(
-              decoration: getPrimaryBtnDecoration(6),
+              decoration: getAIBtnDecoration(6.w),
               padding: const EdgeInsets.symmetric(horizontal: 9, vertical: 5).w,
-              child: Text(
-                StringName.homeTalkThinking.tr,
-                style: TextStyle(fontSize: 13.sp, color: ColorName.white),
-              ),
+              child: Text(StringName.homeTalkThinking.tr,
+                  style: TextStyle(
+                      fontSize: 13.sp, color: ColorName.colorPrimary)),
             ),
           ),
         )

+ 83 - 0
lib/module/home/agenda/controller.dart

@@ -0,0 +1,83 @@
+import 'package:electronic_assistant/base/base_controller.dart';
+import 'package:electronic_assistant/utils/error_handler.dart';
+import 'package:get/get.dart';
+import 'package:get/get_core/src/get_main.dart';
+import 'package:get/get_rx/src/rx_types/rx_types.dart';
+import 'package:pull_to_refresh/pull_to_refresh.dart';
+import '../../../data/api/response/example_info_response.dart';
+import '../../../data/bean/agenda.dart';
+import '../../../data/repositories/account_repository.dart';
+import '../../../data/repositories/agenda_repository.dart';
+import '../../../data/repositories/config_repository.dart';
+import '../../../resource/string.gen.dart';
+import '../../../router/app_pages.dart';
+import '../../../utils/event_bus.dart';
+import '../../../utils/toast_util.dart';
+import '../../agenda/detail/view.dart';
+
+class HomeAgendaController extends BaseController {
+  final refreshController = RefreshController(initialRefresh: false);
+
+  RxList<Agenda> get agendaList => agendaRepository.agendaList;
+
+  @override
+  void onReady() {
+    super.onReady();
+    eventBus.on(EventUserLogin, (arg) {
+      requestHomeAgendaData();
+    });
+    eventBus.on(EventUserLogout, (arg) {
+      agendaRepository.setAgendaList([]);
+      requestHomeAgendaData();
+    });
+    requestHomeAgendaData();
+  }
+
+  @override
+  void onClose() {
+    eventBus.off(EventUserLogin);
+    eventBus.off(EventUserLogout);
+  }
+
+  void requestHomeAgendaData() async {
+    try {
+      if (accountRepository.isLogin.value) {
+        await agendaRepository.requestHomeAgendaData();
+      } else {
+        ExampleInfoResponse exampleInfo =
+            await configRepository.getExampleInfo();
+        agendaRepository.setAgendaList(
+            exampleInfo.agendaList != null ? exampleInfo.agendaList! : []);
+      }
+    } catch (e) {
+      ErrorHandler.toastError(e);
+    } finally {
+      refreshController.refreshCompleted();
+    }
+  }
+
+  onRefresh() {
+    requestHomeAgendaData();
+  }
+
+  void onGoAgendaSeeAll() {
+    if (!accountRepository.isLogin.value) {
+      Get.toNamed(RoutePath.login);
+      ToastUtil.showToast(StringName.errorCodeNoLogin.tr);
+      return;
+    }
+    Get.toNamed(RoutePath.task);
+  }
+
+  void onAgendaItemClick(Agenda item) {
+    AgendaDetailPage.start(item);
+  }
+
+  void agendaComplete(Agenda item) {
+    agendaRepository.agendaFinish(item.id, true).then((data) {
+      agendaRepository.requestHomeAgendaData();
+    }).catchError((error) {
+      ErrorHandler.toastError(error);
+    });
+  }
+}

+ 104 - 0
lib/module/home/agenda/view.dart

@@ -0,0 +1,104 @@
+import 'package:electronic_assistant/base/base_page.dart';
+import 'package:electronic_assistant/data/bean/agenda.dart';
+import 'package:electronic_assistant/utils/expand.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/gestures.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_state_manager/src/rx_flutter/rx_obx_widget.dart';
+import 'package:pull_to_refresh/pull_to_refresh.dart';
+
+import '../../../data/consts/Constants.dart';
+import '../../../resource/colors.gen.dart';
+import '../../../resource/string.gen.dart';
+import '../../agenda/task_item_view.dart';
+import '../../chat/view.dart';
+import 'controller.dart';
+
+class HomeAgendaView extends BasePage<HomeAgendaController> {
+  const HomeAgendaView({super.key});
+
+  @override
+  bool immersive() {
+    return true;
+  }
+
+  @override
+  Color backgroundColor() {
+    return '#F6F5F8'.color;
+  }
+
+  @override
+  Widget buildBody(BuildContext context) {
+    return Obx(() {
+      return SmartRefresher(
+          controller: controller.refreshController,
+          enablePullUp: false,
+          onRefresh: controller.onRefresh,
+          enablePullDown: true,
+          child: ListView(
+            padding: EdgeInsets.only(top: 4.w),
+            children: [
+              for (var value in controller.agendaList.length > 10
+                  ? controller.agendaList.sublist(0, 10)
+                  : controller.agendaList)
+                _buildAgendaView(value),
+              _buildSeeMoreView()
+            ],
+          ));
+    });
+  }
+
+  Widget _buildAgendaView(Agenda item) {
+    return GestureDetector(
+        onTap: () {
+          controller.onAgendaItemClick(item);
+        },
+        child: taskItemView(
+          item,
+          onThinkingClick: () {
+            ChatPage.startByTalkId(
+                item.isExample == true
+                    ? ChatFromType.fromTalkExample
+                    : ChatFromType.fromAnalysisBtn,
+                item.talkId,
+                agenda: item);
+          },
+          onCheckClick: () {
+            controller.agendaComplete(item);
+          },
+        ));
+  }
+
+  Widget _buildSeeMoreView() {
+    return Obx(() {
+      return Visibility(
+        visible: controller.agendaList.isNotEmpty,
+        child: Container(
+          alignment: Alignment.center,
+          padding: EdgeInsets.only(
+              top: 16.w, bottom: 100.w + Constants.bottomBarHeight),
+          child: RichText(
+            text: TextSpan(
+              text: StringName.homeTalkTodo1.tr,
+              style: TextStyle(
+                  color: ColorName.secondaryTextColor, fontSize: 12.sp),
+              children: <TextSpan>[
+                TextSpan(
+                    text: StringName.homeTalkTodo2.tr,
+                    style: TextStyle(
+                        color: ColorName.colorPrimary, fontSize: 12.sp),
+                    recognizer: TapGestureRecognizer()
+                      ..onTap = () {
+                        controller.onGoAgendaSeeAll();
+                      }),
+              ],
+            ),
+          ),
+        ),
+      );
+    });
+  }
+}

+ 19 - 99
lib/module/home/controller.dart

@@ -1,22 +1,18 @@
 import 'dart:io';
-
 import 'package:electronic_assistant/base/base_controller.dart';
-import 'package:electronic_assistant/data/bean/talks.dart';
 import 'package:electronic_assistant/data/consts/Constants.dart';
 import 'package:electronic_assistant/data/consts/event_report_id.dart';
 import 'package:electronic_assistant/data/repositories/agenda_repository.dart';
 import 'package:electronic_assistant/data/repositories/config_repository.dart';
 import 'package:electronic_assistant/data/repositories/talk_repository.dart';
 import 'package:electronic_assistant/handler/event_handler.dart';
+import 'package:electronic_assistant/module/home/talk/view.dart';
 import 'package:electronic_assistant/module/login/view.dart';
 import 'package:electronic_assistant/module/main/controller.dart';
-import 'package:electronic_assistant/module/talk/view.dart';
 import 'package:electronic_assistant/resource/string.gen.dart';
 import 'package:electronic_assistant/router/app_pages.dart';
-import 'package:electronic_assistant/utils/event_bus.dart';
 import 'package:electronic_assistant/utils/file_upload_check_helper.dart';
 import 'package:electronic_assistant/utils/mmkv_util.dart';
-import 'package:electronic_assistant/widget/pull_to_refresh.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:get/get.dart';
 import '../../data/api/response/example_info_response.dart';
@@ -28,6 +24,7 @@ import '../../utils/error_handler.dart';
 import '../../utils/toast_util.dart';
 import '../agenda/detail/view.dart';
 import '../audiopicker/view.dart';
+import 'agenda/view.dart';
 
 class HomePageController extends BaseController {
   get isLogin => accountRepository.isLogin.value;
@@ -36,33 +33,20 @@ class HomePageController extends BaseController {
       ? accountRepository.getUserSubName(accountRepository.phone)
       : StringName.homeGoLogin.tr;
 
-  final refreshController = PullToRefreshController();
-
-  BuildContext? todoTargetContext;
-
-  RxList<TalkBean> get talkList => talkRepository.talkList;
-
-  RxList<Agenda> get agendaList => agendaRepository.agendaList;
-
   final mainController = Get.find<MainController>();
 
   GlobalKey headGuideKey = GlobalKey();
 
+  //tab
+  final tabList = [
+    TabBean(StringName.homeTalkRecord.tr, TabType.talk, const HomeTalkView()),
+    TabBean(StringName.talkSummaryTodoTitle.tr, TabType.agenda,
+        const HomeAgendaView()),
+  ];
+
   @override
   void onReady() {
     super.onReady();
-    refreshController.requestRefresh();
-
-    eventBus.on(EventUserLogin, (arg) {
-      requestHomeData();
-    });
-
-    eventBus.on(EventUserLogout, (arg) {
-      talkRepository.setTalkList([]);
-      agendaRepository.setAgendaList([]);
-      requestHomeData();
-    });
-
     _checkMainGuide();
   }
 
@@ -76,68 +60,12 @@ class HomePageController extends BaseController {
     });
   }
 
-  @override
-  void dispose() {
-    super.dispose();
-    eventBus.off(EventUserLogin);
-    eventBus.off(EventUserLogout);
-  }
-
-  void requestHomeData() async {
-    try {
-      if (accountRepository.isLogin.value) {
-        await Future.wait([
-          talkRepository.refreshHomeTalkData(),
-          agendaRepository.requestHomeAgendaData(),
-        ]);
-      } else {
-        ExampleInfoResponse exampleInfo =
-            await configRepository.getExampleInfo();
-        talkRepository.setTalkList(
-            exampleInfo.talkInfoList != null ? exampleInfo.talkInfoList! : []);
-        agendaRepository.setAgendaList(
-            exampleInfo.agendaList != null ? exampleInfo.agendaList! : []);
-      }
-    } catch (e) {
-      refreshController.refreshCompleted();
-      // Handle errors if necessary
-    } finally {
-      refreshController.refreshCompleted();
-    }
-  }
-
-  void requestName(String? newName, TalkBean bean) {
-    talkRepository.talkRename(bean.id, newName).then((data) {
-      bean.title.value = newName;
-      ToastUtil.showToast(StringName.talkRenameSuccess.tr);
-    }).catchError((error) {
-      ErrorHandler.toastError(error, message: StringName.talkRenameFail.tr);
-    });
-  }
 
-  void goTalkRecordPage() {
-    mainController.updateIndexByPageName(StringName.mainTabFile);
-  }
 
   void showLoginDrawer() {
     mainController.openDrawer();
   }
 
-  void requestDelete(TalkBean item) {
-    talkRepository.talkDelete(item.id).then((data) {
-      requestHomeData();
-    }).catchError((error) {
-      ErrorHandler.toastError(error, message: StringName.talkDeleteFail.tr);
-    });
-  }
-
-  void agendaComplete(Agenda item) {
-    agendaRepository.agendaFinish(item.id, true).then((data) {
-      agendaRepository.requestHomeAgendaData();
-    }).catchError((error) {
-      ErrorHandler.toastError(error);
-    });
-  }
 
   void onPickerAudioFile() async {
     EventHandler.report(EventId.event_100030);
@@ -153,21 +81,6 @@ class HomePageController extends BaseController {
     }
   }
 
-  void onGoAgendaList() {
-    if (!accountRepository.isLogin.value) {
-      Get.toNamed(RoutePath.login);
-      ToastUtil.showToast(StringName.errorCodeNoLogin.tr);
-      return;
-    }
-    Get.toNamed(RoutePath.task);
-  }
-
-  void onTalkItemClick(TalkBean item) {
-    if (item.isExample == true) {
-      EventHandler.report(EventId.event_100001);
-    }
-    TalkPage.start(item);
-  }
 
   void onRecordClick() {
     Get.toNamed(RoutePath.record);
@@ -184,7 +97,14 @@ class HomePageController extends BaseController {
         backgroundColor: ColorName.transparent);
   }
 
-  void onAgendaItemClick(Agenda item) {
-    AgendaDetailPage.start(item);
-  }
 }
+
+class TabBean {
+  String title;
+  TabType type;
+  Widget view;
+
+  TabBean(this.title, this.type, this.view);
+}
+
+enum TabType { talk, agenda }

+ 122 - 0
lib/module/home/talk/controller.dart

@@ -0,0 +1,122 @@
+import 'package:electronic_assistant/base/base_controller.dart';
+import 'package:electronic_assistant/data/repositories/agenda_repository.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:get/get.dart';
+import 'package:get/get_rx/src/rx_types/rx_types.dart';
+import 'package:pull_to_refresh/pull_to_refresh.dart';
+import '../../../data/api/response/example_info_response.dart';
+import '../../../data/bean/talks.dart';
+import '../../../data/consts/event_report_id.dart';
+import '../../../data/repositories/account_repository.dart';
+import '../../../data/repositories/config_repository.dart';
+import '../../../data/repositories/talk_repository.dart';
+import '../../../dialog/rename_dialog.dart';
+import '../../../dialog/talk_delete_dialog.dart';
+import '../../../handler/event_handler.dart';
+import '../../../popup/talk_popup.dart';
+import '../../../resource/string.gen.dart';
+import '../../../utils/error_handler.dart';
+import '../../../utils/event_bus.dart';
+import '../../../utils/toast_util.dart';
+import '../../main/controller.dart';
+import '../../talk/view.dart';
+
+class HomeTalkController extends BaseController {
+  RxList<TalkBean> get talkList => talkRepository.talkList;
+
+  final refreshController = RefreshController(initialRefresh: false);
+
+  @override
+  void onReady() {
+    super.onReady();
+    eventBus.on(EventUserLogin, (arg) {
+      requestHomeTalkData();
+    });
+    eventBus.on(EventUserLogout, (arg) {
+      agendaRepository.setAgendaList([]);
+      requestHomeTalkData();
+    });
+    requestHomeTalkData();
+  }
+
+  @override
+  void onClose() {
+    eventBus.off(EventUserLogin);
+    eventBus.off(EventUserLogout);
+  }
+
+  requestHomeTalkData() async {
+    try {
+      if (accountRepository.isLogin.value) {
+        await talkRepository.refreshHomeTalkData();
+      } else {
+        ExampleInfoResponse exampleInfo =
+            await configRepository.getExampleInfo();
+        talkRepository.setTalkList(
+            exampleInfo.talkInfoList != null ? exampleInfo.talkInfoList! : []);
+      }
+    } catch (e) {
+      ErrorHandler.toastError(e);
+    } finally {
+      refreshController.refreshCompleted();
+    }
+  }
+
+  onRefresh() {
+    requestHomeTalkData();
+  }
+
+  onGoTalkSeeAll() {
+    Get.find<MainController>().updateIndexByPageName(StringName.mainTabFile);
+  }
+
+  void onTalkItemClick(TalkBean item) {
+    if (item.isExample == true) {
+      EventHandler.report(EventId.event_100001);
+    }
+    TalkPage.start(item);
+  }
+
+  void onLongPressTalkItem(TalkBean item, LongPressStartDetails details) {
+    if (!accountRepository.isLogin.value) {
+      return;
+    }
+    showTalkPopup(details.globalPosition, Alignment.bottomRight, onRename: () {
+      showRenameTalkDialog(item);
+    }, onDelete: () {
+      showDeleteTalkDialog(item);
+    });
+  }
+
+  void showRenameTalkDialog(TalkBean item) {
+    reNameDialog(StringName.talkRenameTitle.tr, item.title.value,
+        hintTxt: StringName.talkRenameTitleHint.tr,
+        maxLength: 15, returnBuilder: (newName) {
+      requestName(newName, item);
+    });
+  }
+
+  void showDeleteTalkDialog(TalkBean item) {
+    talkDeleteDialog(item.id, item.title.value, returnBuilder: () {
+      requestDelete(item);
+    });
+  }
+
+  void requestName(String? newName, TalkBean bean) {
+    talkRepository.talkRename(bean.id, newName).then((data) {
+      bean.title.value = newName;
+      ToastUtil.showToast(StringName.talkRenameSuccess.tr);
+    }).catchError((error) {
+      ErrorHandler.toastError(error, message: StringName.talkRenameFail.tr);
+    });
+  }
+
+  void requestDelete(TalkBean item) {
+    talkRepository.talkDelete(item.id).then((data) {
+      requestHomeTalkData();
+      agendaRepository.requestHomeAgendaData();
+    }).catchError((error) {
+      ErrorHandler.toastError(error, message: StringName.talkDeleteFail.tr);
+    });
+  }
+}

+ 208 - 0
lib/module/home/talk/view.dart

@@ -0,0 +1,208 @@
+import 'package:electronic_assistant/base/base_page.dart';
+import 'package:electronic_assistant/utils/expand.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/gestures.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_screenutil/flutter_screenutil.dart';
+import 'package:get/get.dart';
+import 'package:pull_to_refresh/pull_to_refresh.dart';
+import '../../../data/bean/talks.dart';
+import '../../../data/consts/Constants.dart';
+import '../../../resource/assets.gen.dart';
+import '../../../resource/colors.gen.dart';
+import '../../../resource/string.gen.dart';
+import 'controller.dart';
+
+class HomeTalkView extends BasePage<HomeTalkController> {
+  const HomeTalkView({super.key});
+
+  @override
+  bool immersive() {
+    return true;
+  }
+
+  @override
+  Color backgroundColor() {
+    return '#F6F5F8'.color;
+  }
+
+  @override
+  Widget buildBody(BuildContext context) {
+    return Obx(() {
+      return SmartRefresher(
+          controller: controller.refreshController,
+          enablePullUp: false,
+          onRefresh: controller.onRefresh,
+          enablePullDown: true,
+          child: ListView(
+            padding: EdgeInsets.only(left: 12.w, top: 4.w, right: 12.w),
+            children: [
+              for (var value in controller.talkList.length > 10
+                  ? controller.talkList.sublist(0, 10)
+                  : controller.talkList)
+                _buildTalkView(value),
+              _buildSeeMoreView()
+            ],
+          ));
+    });
+  }
+
+  Widget _buildSeeMoreView() {
+    return Obx(() {
+      return Visibility(
+        visible: controller.talkList.isNotEmpty,
+        child: Container(
+          alignment: Alignment.center,
+          padding: EdgeInsets.only(
+              top: 16.w, bottom: 100.w + Constants.bottomBarHeight),
+          child: RichText(
+            text: TextSpan(
+              text: StringName.homeTalkSeeMoreTxt.tr,
+              style: TextStyle(
+                  color: ColorName.secondaryTextColor, fontSize: 12.sp),
+              children: <TextSpan>[
+                TextSpan(
+                    text: StringName.homeTalkAll.tr,
+                    style: TextStyle(
+                        color: ColorName.colorPrimary, fontSize: 12.sp),
+                    recognizer: TapGestureRecognizer()
+                      ..onTap = () {
+                        controller.onGoTalkSeeAll();
+                      }),
+              ],
+            ),
+          ),
+        ),
+      );
+    });
+  }
+
+  Widget _buildTalkView(TalkBean item) {
+    return _buildTalkItem(item, onLongPressStart: (details) {
+      controller.onLongPressTalkItem(item, details);
+    }, onItemClick: () {
+      controller.onTalkItemClick(item);
+    });
+  }
+
+  Widget _buildTalkItem(TalkBean item,
+      {VoidCallback? onItemClick,
+      GestureLongPressStartCallback? onLongPressStart}) {
+    return GestureDetector(
+      onTap: onItemClick,
+      onLongPressStart: onLongPressStart,
+      child: Container(
+          margin: EdgeInsets.only(bottom: 8.w),
+          decoration: BoxDecoration(
+            color: Colors.white,
+            borderRadius: BorderRadius.all(Radius.circular(12.w)),
+          ),
+          child: Stack(
+            children: [
+              Padding(
+                padding: EdgeInsets.symmetric(horizontal: 12.w),
+                child: Column(
+                  crossAxisAlignment: CrossAxisAlignment.start,
+                  children: [
+                    SizedBox(height: 16.w),
+                    Text(
+                      item.title.value.orEmpty,
+                      style: TextStyle(
+                          fontSize: 15.sp,
+                          color: ColorName.primaryTextColor,
+                          fontWeight: FontWeight.bold),
+                      maxLines: 1,
+                      overflow: TextOverflow.ellipsis,
+                    ),
+                    SizedBox(height: 4.w),
+                    RichText(
+                      maxLines: 2,
+                      overflow: TextOverflow.ellipsis,
+                      text: TextSpan(
+                        children: [
+                          WidgetSpan(
+                            alignment: PlaceholderAlignment.middle,
+                            child: Container(
+                              decoration: BoxDecoration(
+                                  gradient: RadialGradient(
+                                      center: Alignment.centerRight,
+                                      colors: [
+                                        "#E7EEFF".toColor(),
+                                        "#F4E8FF".toColor()
+                                      ],
+                                      radius: 2),
+                                  borderRadius: BorderRadius.circular(4.w)),
+                              padding: EdgeInsets.symmetric(
+                                  horizontal: 5.w, vertical: 2.w),
+                              margin: EdgeInsets.only(right: 4.w),
+                              child: ShaderMask(
+                                shaderCallback: (bounds) {
+                                  return LinearGradient(
+                                    colors: ['#9075FF'.color, '#4366FF'.color],
+                                  ).createShader(bounds);
+                                },
+                                blendMode: BlendMode.srcIn,
+                                child: Text(
+                                  StringName.talkSummary.tr,
+                                  style: TextStyle(fontSize: 11.sp, height: 1),
+                                ),
+                              ),
+                            ),
+                          ),
+                          TextSpan(
+                            text: item.summary.value.orEmpty,
+                            style: TextStyle(
+                                fontSize: 12.sp, color: '#969699'.color),
+                          ),
+                        ],
+                      ),
+                    ),
+                    SizedBox(height: 6.w),
+                    Row(
+                      crossAxisAlignment: CrossAxisAlignment.center,
+                      children: [
+                        Assets.images.iconTalkHomeSmallRecord
+                            .image(width: 14.w, height: 14.w),
+                        SizedBox(width: 2.w),
+                        Text(item.duration.toFormattedDuration(),
+                            style: TextStyle(
+                                fontSize: 11.sp, color: '#969699'.color)),
+                        SizedBox(width: 2.w),
+                        Text('·',
+                            style: TextStyle(
+                                fontSize: 11.sp, color: '#969699'.color)),
+                        SizedBox(width: 2.w),
+                        Text(item.createTime.orEmpty,
+                            style: TextStyle(
+                                fontSize: 11.sp, color: '#969699'.color)),
+                      ],
+                    ),
+                    SizedBox(height: 15.w)
+                  ],
+                ),
+              ),
+              Visibility(
+                visible: item.isExample.isTrue,
+                child: Align(
+                  alignment: Alignment.topRight,
+                  child: Container(
+                    padding:
+                        EdgeInsets.symmetric(vertical: 2.w, horizontal: 10.w),
+                    decoration: BoxDecoration(
+                        color: "#F0F0FA".toColor(),
+                        borderRadius: const BorderRadius.only(
+                            topRight: Radius.circular(12),
+                            bottomLeft: Radius.circular(12))),
+                    child: Text(StringName.homeTalkExample.tr,
+                        style: TextStyle(
+                            height: 1,
+                            fontSize: 12.sp,
+                            color: '#A7ACBF'.color)),
+                  ),
+                ),
+              )
+            ],
+          )),
+    );
+  }
+}

+ 445 - 445
lib/module/home/view.dart

@@ -1,30 +1,29 @@
 import 'package:electronic_assistant/base/base_page.dart';
-import 'package:electronic_assistant/data/bean/talks.dart';
-import 'package:electronic_assistant/data/consts/constants.dart';
-import 'package:electronic_assistant/data/repositories/account_repository.dart';
-import 'package:electronic_assistant/dialog/rename_dialog.dart';
-import 'package:electronic_assistant/dialog/talk_delete_dialog.dart';
-import 'package:electronic_assistant/module/chat/view.dart';
 import 'package:electronic_assistant/module/store/view.dart';
-import 'package:electronic_assistant/popup/talk_popup.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/utils/expand.dart';
-import 'package:electronic_assistant/widget/pull_to_refresh.dart';
-import 'package:flutter/gestures.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get.dart';
-import '../../data/bean/agenda.dart';
-import '../../router/app_pages.dart';
-import '../agenda/task_item_view.dart';
+import '../../utils/fixed_size_tab_indicator.dart';
 import 'controller.dart';
 
 class HomePage extends BasePage<HomePageController> {
   const HomePage({super.key});
 
   @override
+  Color backgroundColor() {
+    return '#F6F5F8'.color;
+  }
+
+  @override
+  double? pageHeight() {
+    return double.infinity;
+  }
+
+  @override
   Widget buildBody(BuildContext context) {
     return Stack(
       children: [
@@ -39,151 +38,147 @@ class HomePage extends BasePage<HomePageController> {
                 child: buildOperationBar(),
               ),
               Expanded(
-                  child: Container(
-                color: "#F6F5F8".toColor(),
-                child: PullToRefresh(
-                  enableRefresh: true,
-                  controller: controller.refreshController,
-                  onRefresh: () {
-                    controller.requestHomeData();
-                  },
-                  child: CustomScrollView(
-                    slivers: [
-                      buildHeaderView(),
-                      buildTalkRecordTitle(),
-                      SliverToBoxAdapter(
-                        child: Container(
-                          decoration: BoxDecoration(
-                            gradient: LinearGradient(
-                              begin: Alignment.topCenter,
-                              end: Alignment.bottomCenter,
-                              colors: [
-                                "#FEFEFE".toColor(),
-                                "#FCFBFC".toColor()
-                              ],
-                            ),
-                          ),
-                          height: 0.3472222.sw,
-                          padding: EdgeInsets.only(bottom: 15.h),
-                          child: buildTalkRecord(),
-                        ),
-                      ),
-                      buildTalkTodoTitle(),
-                      buildTalkTodoContent(),
-                      buildSeeMoreView(),
-                    ],
-                  ),
-                ),
-              ))
+                child: DefaultTabController(
+                    length: controller.tabList.length,
+                    child: NestedScrollView(
+                        headerSliverBuilder:
+                            (BuildContext context, bool innerBoxIsScrolled) {
+                          return [
+                            SliverToBoxAdapter(child: _buildHeaderView()),
+                            SliverPersistentHeader(
+                                floating: true,
+                                pinned: true,
+                                delegate: CommonSliverHeaderDelegate(
+                                    backgroundColor: '#F6F5F8'.color,
+                                    child: PreferredSize(
+                                        preferredSize:
+                                            const Size(double.infinity, 52),
+                                        child: _buildTabBar()))),
+                          ];
+                        },
+                        body: _buildHomeTabView())),
+              ),
             ],
           ),
-        )
+        ),
       ],
     );
   }
 
-  @override
-  bool immersive() {
-    return true;
-  }
-
-  Widget buildHeaderView() {
-    return SliverToBoxAdapter(
-      child: Container(
-        decoration: BoxDecoration(
-          gradient: LinearGradient(
-            begin: Alignment.topCenter,
-            end: Alignment.bottomCenter,
-            colors: [ColorName.white, "#EEEFFB".toColor()],
-          ),
-        ),
-        padding:
-            EdgeInsets.only(left: 12.w, right: 12.w, top: 8.h, bottom: 16.h),
-        child: getHomeHeadView(
-          key: controller.headGuideKey,
-          recordClick: () {
-            controller.onRecordClick();
-          },
-          pickerAudioFileClick: () {
-            controller.onPickerAudioFile();
-          },
-        ),
-      ),
+  Widget _buildTabBar() {
+    return TabBar(
+      padding: EdgeInsets.only(left: 12.w, bottom: 6.h),
+      tabAlignment: TabAlignment.start,
+      labelPadding: EdgeInsets.only(right: 32.w),
+      isScrollable: true,
+      indicator: FixedSizeTabIndicator(
+          width: 11.w, height: 4.w, radius: 17, color: ColorName.colorPrimary),
+      dividerHeight: 0,
+      unselectedLabelStyle: TextStyle(fontSize: 16.sp, color: '#7C8191'.color),
+      labelStyle: TextStyle(
+          fontSize: 16.sp,
+          color: ColorName.primaryTextColor,
+          fontWeight: FontWeight.bold),
+      tabs: controller.tabList.map((bean) => Tab(text: bean.title)).toList(),
     );
   }
 
-  SliverToBoxAdapter buildSeeMoreView() {
-    return SliverToBoxAdapter(
-      child: Obx(() {
-        return Visibility(
-          visible: controller.agendaList.isNotEmpty,
-          child: Container(
-            alignment: Alignment.center,
-            padding: EdgeInsets.only(
-                top: 12.w, bottom: 56.w + Constants.bottomBarHeight),
-            child: RichText(
-              text: TextSpan(
-                text: StringName.homeTalkTodo1.tr,
-                style: TextStyle(
-                    color: ColorName.secondaryTextColor, fontSize: 12.sp),
-                children: <TextSpan>[
-                  TextSpan(
-                      text: StringName.homeTalkTodo2.tr,
-                      style: TextStyle(
-                          color: ColorName.colorPrimary, fontSize: 12.sp),
-                      recognizer: TapGestureRecognizer()
-                        ..onTap = () {
-                          controller.onGoAgendaList();
-                        }),
-                ],
-              ),
-            ),
-          ),
-        );
-      }),
-    );
+  Widget _buildHomeTabView() {
+    return TabBarView(children: controller.tabList.map((e) => e.view).toList());
   }
 
-  SliverToBoxAdapter buildTalkTodoTitle() {
-    return SliverToBoxAdapter(
-        child: Container(
-      decoration: BoxDecoration(
-        gradient: LinearGradient(
-          begin: Alignment.topCenter,
-          end: Alignment.bottomCenter,
-          colors: ["#FCFBFC".toColor(), "#F6F5F8".toColor()],
-        ),
-      ),
-      child: Column(
-        children: [
-          SizedBox(height: 12.w),
-          buildTitle(StringName.talkSummaryTodoTitle.tr, () {
-            controller.onGoAgendaList();
-          }),
-          SizedBox(height: 12.w)
-        ],
-      ),
-    ));
+  @override
+  bool immersive() {
+    return true;
   }
 
-  SliverToBoxAdapter buildTalkRecordTitle() {
-    return SliverToBoxAdapter(
-      child: Container(
-        decoration: BoxDecoration(
-          gradient: LinearGradient(
-            begin: Alignment.topCenter,
-            end: Alignment.bottomCenter,
-            colors: [ColorName.white, "#FEFEFE".toColor()],
-          ),
-        ),
-        padding: const EdgeInsets.symmetric(vertical: 12).w,
-        child: buildTitle(StringName.homeTalkRecord.tr, () {
-          controller.goTalkRecordPage();
-        }),
+  Widget _buildHeaderView() {
+    return Container(
+      padding: EdgeInsets.only(left: 12.w, right: 12.w, top: 8.h, bottom: 8.h),
+      child: getHomeHeadView(
+        key: controller.headGuideKey,
+        recordClick: () {
+          controller.onRecordClick();
+        },
+        pickerAudioFileClick: () {
+          controller.onPickerAudioFile();
+        },
       ),
     );
   }
 
+  // SliverToBoxAdapter buildSeeMoreView() {
+  //   return SliverToBoxAdapter(
+  //     child: Obx(() {
+  //       return Visibility(
+  //         visible: controller.agendaList.isNotEmpty,
+  //         child: Container(
+  //           alignment: Alignment.center,
+  //           padding: EdgeInsets.only(
+  //               top: 12.w, bottom: 56.w + Constants.bottomBarHeight),
+  //           child: RichText(
+  //             text: TextSpan(
+  //               text: StringName.homeTalkTodo1.tr,
+  //               style: TextStyle(
+  //                   color: ColorName.secondaryTextColor, fontSize: 12.sp),
+  //               children: <TextSpan>[
+  //                 TextSpan(
+  //                     text: StringName.homeTalkTodo2.tr,
+  //                     style: TextStyle(
+  //                         color: ColorName.colorPrimary, fontSize: 12.sp),
+  //                     recognizer: TapGestureRecognizer()
+  //                       ..onTap = () {
+  //                         controller.onGoAgendaList();
+  //                       }),
+  //               ],
+  //             ),
+  //           ),
+  //         ),
+  //       );
+  //     }),
+  //   );
+  // }
+
+  // SliverToBoxAdapter buildTalkTodoTitle() {
+  //   return SliverToBoxAdapter(
+  //       child: Container(
+  //     decoration: BoxDecoration(
+  //       gradient: LinearGradient(
+  //         begin: Alignment.topCenter,
+  //         end: Alignment.bottomCenter,
+  //         colors: ["#FCFBFC".toColor(), "#F6F5F8".toColor()],
+  //       ),
+  //     ),
+  //     child: Column(
+  //       children: [
+  //         SizedBox(height: 12.w),
+  //         buildTitle(StringName.talkSummaryTodoTitle.tr, () {
+  //           controller.onGoAgendaList();
+  //         }),
+  //         SizedBox(height: 12.w)
+  //       ],
+  //     ),
+  //   ));
+  // }
+  //
+  // SliverToBoxAdapter buildTalkRecordTitle() {
+  //   return SliverToBoxAdapter(
+  //     child: Container(
+  //       decoration: BoxDecoration(
+  //         gradient: LinearGradient(
+  //           begin: Alignment.topCenter,
+  //           end: Alignment.bottomCenter,
+  //           colors: [ColorName.white, "#FEFEFE".toColor()],
+  //         ),
+  //       ),
+  //       padding: const EdgeInsets.symmetric(vertical: 12).w,
+  //       child: buildTitle(StringName.homeTalkRecord.tr, () {
+  //         controller.goTalkRecordPage();
+  //       }),
+  //     ),
+  //   );
+  // }
+
   Row buildOperationBar() {
     return Row(children: [buildGoLogin(), const Spacer(), buildGoStore()]);
   }
@@ -254,325 +249,304 @@ class HomePage extends BasePage<HomePageController> {
     });
   }
 
-  DecoratedBox buildBgBox() {
-    return DecoratedBox(
-        decoration: const BoxDecoration(color: ColorName.white),
-        child: Container(
-          height: double.infinity,
-        ));
-  }
-
-  Widget buildTalkRecord() {
-    return SizedBox(
-      width: 1.sw,
-      child: CustomScrollView(
-        scrollDirection: Axis.horizontal,
-        slivers: [
-          SliverToBoxAdapter(child: SizedBox(width: 12.w)),
-          Obx(() {
-            return SliverList.builder(
-                itemBuilder: _builderTalkItem,
-                itemCount: controller.talkList.length >= 10
-                    ? 10
-                    : controller.talkList.length);
-          }),
-        ],
-      ),
-    );
-  }
-
-  Widget _builderTalkItem(BuildContext context, int index) {
-    return Obx(() {
-      TalkBean? item = controller.talkList[index];
-      return _buildTalkView(item, onLongPressStart: (details) {
-        if (!accountRepository.isLogin.value) {
-          return;
-        }
-        showTalkPopup(details.globalPosition, Alignment.bottomRight,
-            onRename: () {
-          showRenameTalkDialog(item);
-        }, onDelete: () {
-          showDeleteTalkDialog(item);
-        });
-      }, onItemClick: () {
-        controller.onTalkItemClick(item);
-      });
-    });
-  }
-
-  Widget _builderAgendaItem(BuildContext context, int index) {
-    return Obx(() {
-      Agenda item = controller.agendaList[index];
-      return GestureDetector(
-        onTap: () {
-          controller.onAgendaItemClick(item);
-        },
-        child: taskItemView(
-          item,
-          onThinkingClick: () {
-            ChatPage.startByTalkId(
-                item.isExample == true
-                    ? ChatFromType.fromTalkExample
-                    : ChatFromType.fromAnalysisBtn,
-                item.talkId,
-                agenda: item);
-          },
-          onCheckClick: () {
-            controller.agendaComplete(item);
-          },
-        ),
-      );
-    });
-  }
-
-  SliverToBoxAdapter buildGoRecordView() {
-    return SliverToBoxAdapter(
-        child: GestureDetector(
-      onTap: () => Get.toNamed(RoutePath.record),
+  Widget buildBgBox() {
+    return AspectRatio(
+      aspectRatio: 360 / 188,
       child: Container(
-        margin: EdgeInsets.only(right: 8.w),
         decoration: BoxDecoration(
-          color: Colors.white,
-          border: Border.all(color: '#EBEBFF'.toColor(), width: 1),
-          borderRadius: BorderRadius.circular(8.0),
-        ),
-        child: SizedBox(
-          width: 100.w,
-          height: double.infinity,
-          child: Stack(
-            children: [
-              Positioned(
-                right: 0,
-                bottom: 0,
-                child: SizedBox(
-                  width: 48.w,
-                  child: Assets.images.bgHomeQuickAudio.image(),
-                ),
-              ),
-              Positioned.fill(
-                  child: Align(
-                alignment: Alignment.center,
-                child: Column(
-                  children: [
-                    SizedBox(height: 20.h),
-                    SizedBox(
-                        width: 32.w,
-                        height: 32.w,
-                        child: Assets.images.iconAddTalk.image()),
-                    SizedBox(height: 6.h),
-                    Text(StringName.homeTalkAudio.tr,
-                        style: TextStyle(
-                            fontSize: 14.sp,
-                            color: ColorName.colorPrimary,
-                            fontWeight: FontWeight.bold)),
-                    Builder(builder: (context) {
-                      controller.todoTargetContext = context;
-                      return Text(StringName.homeTalkQuickAudio.tr,
-                          style: TextStyle(
-                              fontSize: 10.sp,
-                              color: ColorName.secondaryTextColor));
-                    })
-                  ],
-                ),
-              )),
-            ],
+          gradient: LinearGradient(
+            begin: Alignment.topCenter,
+            end: Alignment.bottomCenter,
+            colors: ['#CDD1FA'.color, '#FAFFFF'.color, '#F6F5F8'.color],
           ),
         ),
       ),
-    ));
-  }
-
-  Widget _buildTalkView(TalkBean item,
-      {VoidCallback? onItemClick,
-      GestureLongPressStartCallback? onLongPressStart}) {
-    return GestureDetector(
-      onTap: onItemClick,
-      onLongPressStart: onLongPressStart,
-      child: Container(
-          width: 258.w,
-          margin: EdgeInsets.only(right: 8.w),
-          decoration: BoxDecoration(
-            color: Colors.white,
-            border: Border.all(color: '#F0F0F0'.toColor(), width: 2),
-            borderRadius: const BorderRadius.only(
-                topLeft: Radius.circular(12),
-                topRight: Radius.circular(24),
-                bottomRight: Radius.circular(12),
-                bottomLeft: Radius.circular(12)),
-          ),
-          padding: EdgeInsets.only(left: 10.w, right: 16.w),
-          child: Row(
-            crossAxisAlignment: CrossAxisAlignment.start,
-            children: [
-              Padding(
-                padding: const EdgeInsets.only(top: 14).h,
-                child: Stack(
-                  children: [
-                    SizedBox(
-                        width: 35.w,
-                        height: 40.w,
-                        child: Assets.images.iconFilesFile.image()),
-                    Visibility(
-                      visible: item.isExample.isTrue,
-                      child: Container(
-                        margin: const EdgeInsets.only(top: 32).w,
-                        decoration: BoxDecoration(
-                            color: "#B2BAC4".toColor(),
-                            borderRadius: BorderRadius.circular(4)),
-                        padding: const EdgeInsets.symmetric(
-                                horizontal: 5.5, vertical: 2)
-                            .w,
-                        child: Text(StringName.homeTalkExample.tr,
-                            style: TextStyle(
-                                height: 1,
-                                fontSize: 12.sp,
-                                color: ColorName.white)),
-                      ),
-                    ),
-                  ],
-                ),
-              ),
-              SizedBox(width: 8.w),
-              Expanded(
-                child: Column(
-                  mainAxisAlignment: MainAxisAlignment.center,
-                  crossAxisAlignment: CrossAxisAlignment.start,
-                  children: [
-                    Text(item.title.value.orEmpty,
-                        maxLines: 1,
-                        overflow: TextOverflow.ellipsis,
-                        style: TextStyle(
-                            fontSize: 15.sp,
-                            color: ColorName.primaryTextColor,
-                            fontWeight: FontWeight.bold)),
-                    SizedBox(height: 5.h),
-                    Text(
-                      item.summary.value.orEmpty,
-                      style: TextStyle(
-                          fontSize: 12.sp, color: ColorName.secondaryTextColor),
-                      overflow: TextOverflow.ellipsis,
-                      maxLines: 2,
-                    ),
-                    SizedBox(height: 8.h),
-                    Row(
-                      crossAxisAlignment: CrossAxisAlignment.center,
-                      children: [
-                        Text(item.duration.toFormattedDuration(),
-                            style: TextStyle(
-                                fontSize: 12.sp,
-                                color: ColorName.tertiaryTextColor)),
-                        SizedBox(width: 6.w),
-                        Container(
-                            width: 1,
-                            height: 9,
-                            color: ColorName.tertiaryTextColor),
-                        SizedBox(width: 6.w),
-                        Text(item.createTime.orEmpty,
-                            style: TextStyle(
-                                fontSize: 12.sp,
-                                color: ColorName.tertiaryTextColor))
-                      ],
-                    )
-                  ],
-                ),
-              )
-            ],
-          )),
     );
   }
 
-  Widget buildTitle(String titleName, VoidCallback? onTap) {
-    return Padding(
-      padding: const EdgeInsets.symmetric(horizontal: 12).w,
-      child: Row(
-        crossAxisAlignment: CrossAxisAlignment.center,
-        children: [
-          Text(titleName,
-              style: TextStyle(
-                  fontWeight: FontWeight.bold,
-                  fontSize: 17.sp,
-                  color: ColorName.primaryTextColor)),
-          const Spacer(),
-          Visibility(
-            visible: onTap == null ? false : true,
-            child: GestureDetector(
-              onTap: onTap,
-              child: Padding(
-                padding: const EdgeInsets.symmetric(vertical: 6).w,
-                child: Row(
-                  crossAxisAlignment: CrossAxisAlignment.center,
-                  children: [
-                    Text(
-                      StringName.homeTalkSeeAll.tr,
-                      style: TextStyle(
-                          fontSize: 13.sp, color: ColorName.tertiaryTextColor),
-                    ),
-                    Container(
-                        margin: const EdgeInsets.only(bottom: 1),
-                        width: 16.w,
-                        height: 16.w,
-                        child: Assets.images.iconHomeTalkArrow.image()),
-                  ],
-                ),
-              ),
-            ),
-          )
-        ],
-      ),
-    );
-  }
+// Widget buildTalkRecord() {
+//   return SizedBox(
+//     width: 1.sw,
+//     child: CustomScrollView(
+//       scrollDirection: Axis.horizontal,
+//       slivers: [
+//         SliverToBoxAdapter(child: SizedBox(width: 12.w)),
+//         Obx(() {
+//           return SliverList.builder(
+//               itemBuilder: _builderTalkItem,
+//               itemCount: controller.talkList.length >= 10
+//                   ? 10
+//                   : controller.talkList.length);
+//         }),
+//       ],
+//     ),
+//   );
+// }
+//
+// Widget _builderTalkItem(BuildContext context, int index) {
+//   return Obx(() {
+//     TalkBean? item = controller.talkList[index];
+//     return _buildTalkView(item, onLongPressStart: (details) {
+//       if (!accountRepository.isLogin.value) {
+//         return;
+//       }
+//       showTalkPopup(details.globalPosition, Alignment.bottomRight,
+//           onRename: () {
+//         showRenameTalkDialog(item);
+//       }, onDelete: () {
+//         showDeleteTalkDialog(item);
+//       });
+//     }, onItemClick: () {
+//       controller.onTalkItemClick(item);
+//     });
+//   });
+// }
 
-  void showRenameTalkDialog(TalkBean item) {
-    reNameDialog(StringName.talkRenameTitle.tr, item.title.value,
-        hintTxt: StringName.talkRenameTitleHint.tr,
-        maxLength: 15, returnBuilder: (newName) {
-      controller.requestName(newName, item);
-    });
-  }
+// Widget _builderAgendaItem(BuildContext context, int index) {
+//   return Obx(() {
+//     Agenda item = controller.agendaList[index];
+//     return GestureDetector(
+//       onTap: () {
+//         controller.onAgendaItemClick(item);
+//       },
+//       child: taskItemView(
+//         item,
+//         onThinkingClick: () {
+//           ChatPage.startByTalkId(
+//               item.isExample == true
+//                   ? ChatFromType.fromTalkExample
+//                   : ChatFromType.fromAnalysisBtn,
+//               item.talkId,
+//               agenda: item);
+//         },
+//         onCheckClick: () {
+//           controller.agendaComplete(item);
+//         },
+//       ),
+//     );
+//   });
+// }
 
-  void showDeleteTalkDialog(TalkBean item) {
-    talkDeleteDialog(item.id, item.title.value, returnBuilder: () {
-      controller.requestDelete(item);
-    });
-  }
+// SliverToBoxAdapter buildGoRecordView() {
+//   return SliverToBoxAdapter(
+//       child: GestureDetector(
+//     onTap: () => Get.toNamed(RoutePath.record),
+//     child: Container(
+//       margin: EdgeInsets.only(right: 8.w),
+//       decoration: BoxDecoration(
+//         color: Colors.white,
+//         border: Border.all(color: '#EBEBFF'.toColor(), width: 1),
+//         borderRadius: BorderRadius.circular(8.0),
+//       ),
+//       child: SizedBox(
+//         width: 100.w,
+//         height: double.infinity,
+//         child: Stack(
+//           children: [
+//             Positioned(
+//               right: 0,
+//               bottom: 0,
+//               child: SizedBox(
+//                 width: 48.w,
+//                 child: Assets.images.bgHomeQuickAudio.image(),
+//               ),
+//             ),
+//             Positioned.fill(
+//                 child: Align(
+//               alignment: Alignment.center,
+//               child: Column(
+//                 children: [
+//                   SizedBox(height: 20.h),
+//                   SizedBox(
+//                       width: 32.w,
+//                       height: 32.w,
+//                       child: Assets.images.iconAddTalk.image()),
+//                   SizedBox(height: 6.h),
+//                   Text(StringName.homeTalkAudio.tr,
+//                       style: TextStyle(
+//                           fontSize: 14.sp,
+//                           color: ColorName.colorPrimary,
+//                           fontWeight: FontWeight.bold)),
+//                   Builder(builder: (context) {
+//                     controller.todoTargetContext = context;
+//                     return Text(StringName.homeTalkQuickAudio.tr,
+//                         style: TextStyle(
+//                             fontSize: 10.sp,
+//                             color: ColorName.secondaryTextColor));
+//                   })
+//                 ],
+//               ),
+//             )),
+//           ],
+//         ),
+//       ),
+//     ),
+//   ));
+// }
 
-  Widget buildTalkTodoContent() {
-    return Obx(() {
-      if (controller.agendaList.isEmpty) {
-        return SliverToBoxAdapter(child: buildAgendaEmptyView(50.h));
-      } else {
-        return SliverList.builder(
-            itemBuilder: _builderAgendaItem,
-            itemCount: controller.agendaList.length >= 10
-                ? 10
-                : controller.agendaList.length);
-      }
-    });
-  }
-}
+// Widget _buildTalkView(TalkBean item,
+//     {VoidCallback? onItemClick,
+//     GestureLongPressStartCallback? onLongPressStart}) {
+//   return GestureDetector(
+//     onTap: onItemClick,
+//     onLongPressStart: onLongPressStart,
+//     child: Container(
+//         width: 258.w,
+//         margin: EdgeInsets.only(right: 8.w),
+//         decoration: BoxDecoration(
+//           color: Colors.white,
+//           border: Border.all(color: '#F0F0F0'.toColor(), width: 2),
+//           borderRadius: const BorderRadius.only(
+//               topLeft: Radius.circular(12),
+//               topRight: Radius.circular(24),
+//               bottomRight: Radius.circular(12),
+//               bottomLeft: Radius.circular(12)),
+//         ),
+//         padding: EdgeInsets.only(left: 10.w, right: 16.w),
+//         child: Row(
+//           crossAxisAlignment: CrossAxisAlignment.start,
+//           children: [
+//             Padding(
+//               padding: const EdgeInsets.only(top: 14).h,
+//               child: Stack(
+//                 children: [
+//                   SizedBox(
+//                       width: 35.w,
+//                       height: 40.w,
+//                       child: Assets.images.iconFilesFile.image()),
+//                   Visibility(
+//                     visible: item.isExample.isTrue,
+//                     child: Container(
+//                       margin: const EdgeInsets.only(top: 32).w,
+//                       decoration: BoxDecoration(
+//                           color: "#B2BAC4".toColor(),
+//                           borderRadius: BorderRadius.circular(4)),
+//                       padding: const EdgeInsets.symmetric(
+//                               horizontal: 5.5, vertical: 2)
+//                           .w,
+//                       child: Text(StringName.homeTalkExample.tr,
+//                           style: TextStyle(
+//                               height: 1,
+//                               fontSize: 12.sp,
+//                               color: ColorName.white)),
+//                     ),
+//                   ),
+//                 ],
+//               ),
+//             ),
+//             SizedBox(width: 8.w),
+//             Expanded(
+//               child: Column(
+//                 mainAxisAlignment: MainAxisAlignment.center,
+//                 crossAxisAlignment: CrossAxisAlignment.start,
+//                 children: [
+//                   Text(item.title.value.orEmpty,
+//                       maxLines: 1,
+//                       overflow: TextOverflow.ellipsis,
+//                       style: TextStyle(
+//                           fontSize: 15.sp,
+//                           color: ColorName.primaryTextColor,
+//                           fontWeight: FontWeight.bold)),
+//                   SizedBox(height: 5.h),
+//                   Text(
+//                     item.summary.value.orEmpty,
+//                     style: TextStyle(
+//                         fontSize: 12.sp, color: ColorName.secondaryTextColor),
+//                     overflow: TextOverflow.ellipsis,
+//                     maxLines: 2,
+//                   ),
+//                   SizedBox(height: 8.h),
+//                   Row(
+//                     crossAxisAlignment: CrossAxisAlignment.center,
+//                     children: [
+//                       Text(item.duration.toFormattedDuration(),
+//                           style: TextStyle(
+//                               fontSize: 12.sp,
+//                               color: ColorName.tertiaryTextColor)),
+//                       SizedBox(width: 6.w),
+//                       Container(
+//                           width: 1,
+//                           height: 9,
+//                           color: ColorName.tertiaryTextColor),
+//                       SizedBox(width: 6.w),
+//                       Text(item.createTime.orEmpty,
+//                           style: TextStyle(
+//                               fontSize: 12.sp,
+//                               color: ColorName.tertiaryTextColor))
+//                     ],
+//                   )
+//                 ],
+//               ),
+//             )
+//           ],
+//         )),
+//   );
+// }
 
-Widget buildAgendaEmptyView(double top, {bool isVisible = true}) {
-  return Visibility(
-    visible: isVisible,
-    child: Container(
-      width: double.infinity,
-      padding: EdgeInsets.symmetric(vertical: top),
-      child: Column(
-        children: [
-          SizedBox(
-              width: 100.w,
-              height: 100.w,
-              child: Assets.images.iconNoTask.image()),
-          SizedBox(height: 4.h),
-          Text(StringName.agendaNoData.tr,
-              style: TextStyle(
-                  color: ColorName.secondaryTextColor, fontSize: 14.sp)),
-        ],
-      ),
-    ),
-  );
+// Widget buildTitle(String titleName, VoidCallback? onTap) {
+//   return Padding(
+//     padding: const EdgeInsets.symmetric(horizontal: 12).w,
+//     child: Row(
+//       crossAxisAlignment: CrossAxisAlignment.center,
+//       children: [
+//         Text(titleName,
+//             style: TextStyle(
+//                 fontWeight: FontWeight.bold,
+//                 fontSize: 17.sp,
+//                 color: ColorName.primaryTextColor)),
+//         const Spacer(),
+//         Visibility(
+//           visible: onTap == null ? false : true,
+//           child: GestureDetector(
+//             onTap: onTap,
+//             child: Padding(
+//               padding: const EdgeInsets.symmetric(vertical: 6).w,
+//               child: Row(
+//                 crossAxisAlignment: CrossAxisAlignment.center,
+//                 children: [
+//                   Text(
+//                     StringName.homeTalkSeeAll.tr,
+//                     style: TextStyle(
+//                         fontSize: 13.sp, color: ColorName.tertiaryTextColor),
+//                   ),
+//                   Container(
+//                       margin: const EdgeInsets.only(bottom: 1),
+//                       width: 16.w,
+//                       height: 16.w,
+//                       child: Assets.images.iconHomeTalkArrow.image()),
+//                 ],
+//               ),
+//             ),
+//           ),
+//         )
+//       ],
+//     ),
+//   );
+// }
 }
 
+// Widget buildAgendaEmptyView(double top, {bool isVisible = true}) {
+//   return Visibility(
+//     visible: isVisible,
+//     child: Container(
+//       width: double.infinity,
+//       padding: EdgeInsets.symmetric(vertical: top),
+//       child: Column(
+//         children: [
+//           SizedBox(
+//               width: 100.w,
+//               height: 100.w,
+//               child: Assets.images.iconNoTask.image()),
+//           SizedBox(height: 4.h),
+//           Text(StringName.agendaNoData.tr,
+//               style: TextStyle(
+//                   color: ColorName.secondaryTextColor, fontSize: 14.sp)),
+//         ],
+//       ),
+//     ),
+//   );
+// }
+
 Widget getHomeHeadView(
     {GlobalKey? key,
     VoidCallback? recordClick,
@@ -666,3 +640,29 @@ Widget _buildHeaderCard(
     ),
   );
 }
+
+class CommonSliverHeaderDelegate extends SliverPersistentHeaderDelegate {
+  PreferredSize child; //传入preferredsize组件,因为此组件需要固定高度
+  Color? backgroundColor; //需要设置的背景色
+  CommonSliverHeaderDelegate({required this.child, this.backgroundColor});
+
+  @override
+  Widget build(
+      BuildContext context, double shrinkOffset, bool overlapsContent) {
+    return Container(
+      color: backgroundColor,
+      child: child,
+    );
+  }
+
+  @override
+  double get maxExtent => child.preferredSize.height;
+
+  @override
+  double get minExtent => child.preferredSize.height;
+
+  @override
+  bool shouldRebuild(covariant SliverPersistentHeaderDelegate oldDelegate) {
+    return true;
+  }
+}

+ 22 - 2
lib/module/talk/common_view.dart

@@ -5,10 +5,8 @@ import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get.dart';
-
 import '../../data/bean/agenda.dart';
 import '../../data/bean/template_bean.dart';
-import '../../popup/talk_add_template_popup.dart';
 import '../../resource/assets.gen.dart';
 import '../../resource/colors.gen.dart';
 import '../../resource/string.gen.dart';
@@ -450,3 +448,25 @@ Widget buildAddTemplateView({
     ),
   );
 }
+
+Widget buildAgendaEmptyView(double top, {bool isVisible = true}) {
+  return Visibility(
+    visible: isVisible,
+    child: Container(
+      width: double.infinity,
+      padding: EdgeInsets.symmetric(vertical: top),
+      child: Column(
+        children: [
+          SizedBox(
+              width: 100.w,
+              height: 100.w,
+              child: Assets.images.iconNoTask.image()),
+          SizedBox(height: 4.h),
+          Text(StringName.agendaNoData.tr,
+              style: TextStyle(
+                  color: ColorName.secondaryTextColor, fontSize: 14.sp)),
+        ],
+      ),
+    ),
+  );
+}

+ 3 - 4
lib/module/talk/todo/view.dart

@@ -5,12 +5,10 @@ import 'package:electronic_assistant/utils/expand.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get.dart';
-
 import '../../../data/bean/agenda.dart';
 import '../../../data/bean/talks.dart';
 import '../../../resource/assets.gen.dart';
 import '../../../utils/common_style.dart';
-import '../../home/view.dart';
 import '../common_view.dart';
 import 'controller.dart';
 
@@ -171,11 +169,12 @@ class TodoView extends BasePage<TodoController> {
               controller.onClickThinking(agenda);
             },
             child: Container(
-              decoration: getPrimaryBtnDecoration(6),
+              decoration: getAIBtnDecoration(6.w),
               padding: const EdgeInsets.symmetric(horizontal: 9, vertical: 4).w,
               child: Text(
                 StringName.homeTalkThinking.tr,
-                style: TextStyle(fontSize: 13.sp, color: ColorName.white),
+                style:
+                    TextStyle(fontSize: 13.sp, color: ColorName.colorPrimary),
               ),
             ),
           )

+ 4 - 0
lib/router/app_pages.dart

@@ -28,7 +28,9 @@ import '../module/chat/controller.dart';
 import '../module/chat/view.dart';
 import '../module/files/search/view.dart';
 import '../module/files/view.dart';
+import '../module/home/agenda/controller.dart';
 import '../module/home/controller.dart';
+import '../module/home/talk/controller.dart';
 import '../module/login/controller.dart';
 import '../module/login/view.dart';
 import '../module/main/view.dart';
@@ -110,6 +112,8 @@ class AppBinding extends Bindings {
     lazyPut(() => TemplateEditController());
     lazyPut(() => TemplateListController());
     lazyPut(() => TemplateDetailController());
+    lazyPut(() => HomeTalkController());
+    lazyPut(() => HomeAgendaController());
   }
 
   void lazyPut<S>(InstanceBuilderCallback<S> builder) {

+ 10 - 0
lib/utils/common_style.dart

@@ -1,6 +1,16 @@
 import 'package:electronic_assistant/utils/expand.dart';
 import 'package:flutter/cupertino.dart';
 
+Decoration getAIBtnDecoration(double radius) {
+  return BoxDecoration(
+    borderRadius: BorderRadius.circular(radius),
+    gradient: RadialGradient(
+        center: Alignment.centerRight,
+        colors: ["#E7EEFF".toColor(), "#F4E8FF".toColor()],
+        radius: 2),
+  );
+}
+
 Decoration getPrimaryBtnDecoration(double radius) {
   return BoxDecoration(
     gradient: LinearGradient(