Browse Source

[modify]调整首页数据展示逻辑

zk 1 year ago
parent
commit
a84bcee376

+ 1 - 1
lib/data/api/response/agenda_response.dart

@@ -10,7 +10,7 @@ class AgendaResponse {
   int count;
 
   @JsonKey(name: 'list')
-  List<Agenda> list;
+  List<Agenda>? list;
 
   AgendaResponse({required this.count, required this.list});
 

+ 34 - 0
lib/data/repositories/agenda_repository.dart

@@ -1,4 +1,6 @@
 import 'package:electronic_assistant/data/api/request/talk_request.dart';
+import 'package:electronic_assistant/data/bean/agenda.dart';
+import 'package:get/get_rx/src/rx_types/rx_types.dart';
 
 import '../../utils/http_handler.dart';
 import '../api/atmob_api.dart';
@@ -12,6 +14,38 @@ import '../api/response/agenda_response.dart';
 class AgendaRepository {
   AgendaRepository._();
 
+  final RxList<Rxn<Agenda>> _agendaList = <Rxn<Agenda>>[].obs;
+
+  RxList<Rxn<Agenda>> get agendaList => _agendaList;
+
+  clearAgendaList() {
+    _agendaList.clear();
+  }
+
+  removeItem(Agenda item) {
+    _agendaList.removeWhere((element) => element.value?.id == item.id);
+  }
+
+  Future<AgendaResponse> requestHomeAgendaData(
+      {int pageSize = 999, TaskStatus completeStatus = TaskStatus.TODO}) {
+    return requestAgendaPagePaginate(1, pageSize,
+        completeStatus: completeStatus);
+  }
+
+  Future<AgendaResponse> requestAgendaPagePaginate(int page, int pageSize,
+      {TaskStatus? completeStatus}) {
+    return agendaPage(page, pageSize, completeStatus: completeStatus)
+        .then((response) {
+      if (page == 1) {
+        _agendaList.clear();
+      }
+      if (response.list != null) {
+        _agendaList.addAll(response.list!.map((e) => Rxn<Agenda>(e)).toList());
+      }
+      return response;
+    });
+  }
+
   Future<AgendaResponse> agendaPage(int page, int pageSize,
       {int? startTime, int? endTime, TaskStatus? completeStatus}) {
     return atmobApi

+ 5 - 0
lib/data/repositories/talk_repository.dart

@@ -41,6 +41,11 @@ class TalkRepository {
     _talkList.clear();
   }
 
+  Future<TalkPaginateResponse> requestHomeTalkData(
+      {int pageSize = 10, int? sortType = 1}) {
+    return requestTalkPagePaginate(1, pageSize, sortType: sortType);
+  }
+
   Future<TalkPaginateResponse> requestTalkPagePaginate(int page, int pageSize,
       {String? searchKeyword, int? sortType = 1}) {
     return talkPagePaginate(page, pageSize,

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

@@ -2,19 +2,16 @@ import 'package:electronic_assistant/base/base_controller.dart';
 import 'package:electronic_assistant/data/bean/talks.dart';
 import 'package:electronic_assistant/data/repositories/agenda_repository.dart';
 import 'package:electronic_assistant/data/repositories/talk_repository.dart';
-import 'package:electronic_assistant/module/home/view.dart';
 import 'package:electronic_assistant/module/main/controller.dart';
 import 'package:electronic_assistant/resource/string.gen.dart';
 import 'package:electronic_assistant/utils/event_bus.dart';
-import 'package:electronic_assistant/utils/toast_util.dart';
 import 'package:electronic_assistant/widget/pull_to_refresh.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:get/get.dart';
 import '../../data/bean/agenda.dart';
 import '../../data/repositories/account_repository.dart';
-import '../../data/repositories/home_repository.dart';
-import '../../utils/animated_list_controller.dart';
 import '../../utils/error_handler.dart';
+import '../../utils/toast_util.dart';
 
 class HomePageController extends BaseController {
   get isLogin => accountRepository.isLogin.value;
@@ -23,13 +20,14 @@ class HomePageController extends BaseController {
       ? accountRepository.getUserSubName(accountRepository.phone)
       : StringName.homeGoLogin.tr;
 
-  final taskList = AnimatedListController<TalkBean>();
-  final agendaList = AnimatedListController<Agenda>();
-
   final refreshController = PullToRefreshController();
 
   BuildContext? todoTargetContext;
 
+  RxList<Rxn<TalkBean>> get talkList => talkRepository.talkList;
+
+  RxList<Rxn<Agenda>> get agendaList => agendaRepository.agendaList;
+
   @override
   void onReady() {
     super.onReady();
@@ -52,28 +50,27 @@ class HomePageController extends BaseController {
     eventBus.off(EventUserLogout);
   }
 
-  void requestHomeData() {
-    homeRepository.homeInfo().then((data) {
-      taskList.clearAll();
-      taskList.addAll(data.talks);
-      agendaList.clearAll();
-      agendaList.addAll(data.agendas,
-          duration: const Duration(milliseconds: 500));
-    }).whenComplete(() {
+  void requestHomeData() async {
+    try {
+      await Future.wait([
+        talkRepository.requestHomeTalkData(),
+        agendaRepository.requestHomeAgendaData(),
+      ]);
+    } catch (e) {
+      // Handle errors if necessary
+    } finally {
       refreshController.refreshCompleted();
-    }).catchError((e) {
-      // accountRepository.logout();
-    });
+    }
   }
 
   void requestName(String? newName, TalkBean bean) {
     talkRepository.talkRename(bean.id, newName).then((data) {
       bean.title = newName;
-      int index = taskList.indexOf(bean);
+      int index = talkList.indexOf(bean);
       if (index != -1) {
-        taskList.update(index, bean);
-        ToastUtil.showToast(StringName.talkRenameSuccess.tr);
+        talkList[index].value = bean;
       }
+      ToastUtil.showToast(StringName.talkRenameSuccess.tr);
     }).catchError((error) {
       ErrorHandler.toastError(error, message: StringName.talkRenameFail.tr);
     });
@@ -97,11 +94,7 @@ class HomePageController extends BaseController {
 
   void agendaComplete(Agenda item) {
     agendaRepository.agendaFinish(item.id, true).then((data) {
-      item.isDone = true;
-      agendaList.removeItem(
-          item,
-          (context, animation, item) =>
-              buildRemoveTodoItem(context, animation, item));
+      agendaRepository.removeItem(item);
     }).catchError((error) {
       ErrorHandler.toastError(error);
     });

+ 48 - 32
lib/module/home/view.dart

@@ -56,13 +56,13 @@ class HomePage extends BasePage<HomePageController> {
                       ),
                     ),
                     buildTalkTodoTitle(),
-                    SliverAnimatedList(
-                        key: controller.agendaList.listKey,
-                        itemBuilder: (context, index, animation) {
-                          return _buildInsertTodoItem(context, index, animation,
-                              controller.agendaList.items[index]);
-                        },
-                        initialItemCount: controller.agendaList.length),
+                    Obx(() {
+                      return SliverList.builder(
+                          itemBuilder: _builderAgendaItem,
+                          itemCount: controller.agendaList.length >= 10
+                              ? 10
+                              : controller.agendaList.length);
+                    }),
                     buildSeeMoreView(),
                   ],
                 ),
@@ -237,18 +237,52 @@ class HomePage extends BasePage<HomePageController> {
         slivers: [
           SliverToBoxAdapter(child: SizedBox(width: 12.w)),
           buildGoRecordView(),
-          SliverAnimatedList(
-              key: controller.taskList.listKey,
-              itemBuilder: (context, index, animation) {
-                return _buildInsertTalkItem(context, index, animation,
-                    controller.taskList.items[index]);
-              },
-              initialItemCount: controller.taskList.length),
+          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].value;
+      if (item == null) {
+        return Container();
+      }
+      return _buildTalkView(item, onLongPressStart: (details) {
+        showTalkPopup(details.globalPosition, Alignment.bottomRight,
+            onRename: () {
+          showRenameTalkDialog(item);
+        }, onDelete: () {
+          showDeleteTalkDialog(item);
+        });
+      }, onItemClick: () {
+        TalkPage.start(item);
+      });
+    });
+  }
+
+  Widget _builderAgendaItem(BuildContext context, int index) {
+    return Obx(() {
+      Agenda? item = controller.agendaList[index].value;
+      if (item == null) {
+        return Container();
+      }
+      return taskItemView(
+        item,
+        onCheckClick: () {
+          controller.agendaComplete(item);
+        },
+      );
+    });
+  }
+
   SliverToBoxAdapter buildGoRecordView() {
     return SliverToBoxAdapter(
         child: GestureDetector(
@@ -398,19 +432,6 @@ class HomePage extends BasePage<HomePageController> {
     );
   }
 
-  Widget _buildInsertTodoItem(BuildContext context, int index,
-      Animation<double> animation, Agenda item) {
-    HomePageController controller = Get.find();
-    return FadeTransition(
-      opacity: animation,
-      child: taskItemView(
-        item,
-        onCheckClick: () {
-          controller.agendaComplete(item);
-        },
-      ),
-    );
-  }
 
   Widget buildTitle(String titleName, VoidCallback? onTap) {
     return Padding(
@@ -495,8 +516,3 @@ class HomePage extends BasePage<HomePageController> {
     });
   }
 }
-
-Widget buildRemoveTodoItem(
-    BuildContext context, Animation<double> animation, Agenda item) {
-  return SizeTransition(sizeFactor: animation, child: taskItemView(item));
-}