diff --git a/lib/pages/dynamics/widgets/action_panel.dart b/lib/pages/dynamics/widgets/action_panel.dart index 8cad2382d..03183d233 100644 --- a/lib/pages/dynamics/widgets/action_panel.dart +++ b/lib/pages/dynamics/widgets/action_panel.dart @@ -61,7 +61,8 @@ class ActionPanel extends StatelessWidget { ), Expanded( child: TextButton.icon( - onPressed: () => PageUtils.pushDynDetail(item, isPush: true), + onPressed: () => + PageUtils.pushDynDetail(item, isPush: true, viewReply: true), icon: Icon( FontAwesomeIcons.comment, size: 16, diff --git a/lib/pages/dynamics_detail/controller.dart b/lib/pages/dynamics_detail/controller.dart index 1374d0c34..e4147ab64 100644 --- a/lib/pages/dynamics_detail/controller.dart +++ b/lib/pages/dynamics_detail/controller.dart @@ -3,6 +3,8 @@ import 'package:PiliPlus/models/dynamics/result.dart'; import 'package:PiliPlus/pages/common/dyn/common_dyn_controller.dart'; import 'package:PiliPlus/utils/id_utils.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; +import 'package:flutter/material.dart' show GlobalKey, Scrollable; +import 'package:flutter/scheduler.dart' show SchedulerBinding; import 'package:get/get.dart'; class DynamicDetailController extends CommonDynController { @@ -17,12 +19,18 @@ class DynamicDetailController extends CommonDynController { @override dynamic get sourceId => replyType == 1 ? IdUtils.av2bv(oid) : oid; + GlobalKey? replyKey; + @override void onInit() { super.onInit(); - dynItem = Get.arguments['item']; - var commentType = dynItem.basic?.commentType; - var commentIdStr = dynItem.basic?.commentIdStr; + final args = Get.arguments; + dynItem = args['item']; + if (args['viewReply'] ?? false) { + replyKey = GlobalKey(); + } + final commentType = dynItem.basic?.commentType; + final commentIdStr = dynItem.basic?.commentIdStr; if (commentType != null && commentType != 0 && commentIdStr != null && @@ -43,6 +51,17 @@ class DynamicDetailController extends CommonDynController { void _init(String commentIdStr, int commentType) { oid = int.parse(commentIdStr); replyType = commentType; - queryData(); + queryData().whenComplete(() { + if (replyKey != null && count.value > 0) { + SchedulerBinding.instance.addPostFrameCallback((_) { + if (replyKey?.currentContext != null) { + Scrollable.ensureVisible( + replyKey!.currentContext!, + duration: const Duration(milliseconds: 200), + ); + } + }); + } + }); } } diff --git a/lib/pages/dynamics_detail/view.dart b/lib/pages/dynamics_detail/view.dart index eb09ccdf6..977021e86 100644 --- a/lib/pages/dynamics_detail/view.dart +++ b/lib/pages/dynamics_detail/view.dart @@ -113,7 +113,10 @@ class _DynamicDetailPageState extends CommonDynPageState { ), ), buildReplyHeader(theme), - Obx(() => replyList(theme, controller.loadingState.value)), + Obx( + key: controller.replyKey, + () => replyList(theme, controller.loadingState.value), + ), ], ), ); diff --git a/lib/utils/page_utils.dart b/lib/utils/page_utils.dart index 2d5eca8f0..a9d472cfa 100644 --- a/lib/utils/page_utils.dart +++ b/lib/utils/page_utils.dart @@ -372,6 +372,7 @@ abstract final class PageUtils { static Future pushDynDetail( DynamicItemModel item, { bool isPush = false, + bool viewReply = false, }) async { feedBack(); @@ -389,6 +390,7 @@ abstract final class PageUtils { '/dynamicDetail', arguments: { 'item': item, + 'viewReply': viewReply, }, ); }