diff --git a/lib/pages/msg_feed_top/at_me/controller.dart b/lib/pages/msg_feed_top/at_me/controller.dart index 604a2383..aafd0d30 100644 --- a/lib/pages/msg_feed_top/at_me/controller.dart +++ b/lib/pages/msg_feed_top/at_me/controller.dart @@ -23,12 +23,10 @@ class AtMeController extends CommonController { cursor = data.cursor?.id ?? -1; cursorTime = data.cursor?.time ?? -1; if (currentPage != 1 && loadingState.value is Success) { - loadingState.value = LoadingState.success( - (loadingState.value as Success).response as List - ..addAll(data.items ?? [])); - } else { - loadingState.value = LoadingState.success(data.items); + data.items ??= []; + data.items!.insertAll(0, (loadingState.value as Success).response); } + loadingState.value = LoadingState.success(data.items); return true; } diff --git a/lib/pages/msg_feed_top/like_me/controller.dart b/lib/pages/msg_feed_top/like_me/controller.dart index e4e32705..1cb499ff 100644 --- a/lib/pages/msg_feed_top/like_me/controller.dart +++ b/lib/pages/msg_feed_top/like_me/controller.dart @@ -27,14 +27,13 @@ class LikeMeController extends CommonController { List latest = data.latest?.items ?? []; List total = data.total?.items ?? []; if (currentPage != 1 && loadingState.value is Success) { - loadingState.value = LoadingState.success((loadingState.value as Success) - .response as Pair, List> - ..first.addAll(latest) - ..second.addAll(total)); - } else { - loadingState.value = - LoadingState.success(Pair(first: latest, second: total)); + Pair, List> pair = + (loadingState.value as Success).response; + latest.insertAll(0, pair.first); + total.insertAll(0, pair.second); } + loadingState.value = + LoadingState.success(Pair(first: latest, second: total)); return true; } diff --git a/lib/pages/msg_feed_top/reply_me/controller.dart b/lib/pages/msg_feed_top/reply_me/controller.dart index ffa8d878..d8fc47d0 100644 --- a/lib/pages/msg_feed_top/reply_me/controller.dart +++ b/lib/pages/msg_feed_top/reply_me/controller.dart @@ -23,12 +23,10 @@ class ReplyMeController extends CommonController { cursor = data.cursor?.id ?? -1; cursorTime = data.cursor?.time ?? -1; if (currentPage != 1 && loadingState.value is Success) { - loadingState.value = LoadingState.success( - (loadingState.value as Success).response as List - ..addAll(data.items ?? [])); - } else { - loadingState.value = LoadingState.success(data.items); + data.items ??= []; + data.items!.insertAll(0, (loadingState.value as Success).response); } + loadingState.value = LoadingState.success(data.items); return true; } diff --git a/lib/pages/msg_feed_top/sys_msg/controller.dart b/lib/pages/msg_feed_top/sys_msg/controller.dart index e5317066..83a16e9a 100644 --- a/lib/pages/msg_feed_top/sys_msg/controller.dart +++ b/lib/pages/msg_feed_top/sys_msg/controller.dart @@ -17,17 +17,19 @@ class SysMsgController extends CommonController { @override List? handleListResponse(List currentList, List dataList) { if (cursor == -1) { - msgSysUpdateCursor(dataList.first.cursor!); + msgSysUpdateCursor(dataList.firstOrNull?.cursor); } - cursor = dataList.last.cursor ?? -1; + cursor = dataList.lastOrNull?.cursor ?? -1; if (isEnd.not && dataList.length + 1 < pageSize) { isEnd = true; } return null; } - Future msgSysUpdateCursor(int cursor) async { - MsgHttp.msgSysUpdateCursor(cursor); + Future msgSysUpdateCursor(int? cursor) async { + if (cursor != null) { + MsgHttp.msgSysUpdateCursor(cursor); + } } @override diff --git a/lib/pages/video/detail/view_point/view_points_page.dart b/lib/pages/video/detail/view_point/view_points_page.dart index b0df8094..87278fc1 100644 --- a/lib/pages/video/detail/view_point/view_points_page.dart +++ b/lib/pages/video/detail/view_point/view_points_page.dart @@ -39,6 +39,7 @@ class _ViewPointsPageState automaticallyImplyLeading: false, titleSpacing: 16, title: const Text('分段信息'), + toolbarHeight: 45, actions: [ Text( '分段进度条', @@ -73,97 +74,95 @@ class _ViewPointsPageState ), const SizedBox(width: 16), ], + bottom: PreferredSize( + preferredSize: Size.fromHeight(1), + child: Divider( + height: 1, + color: Theme.of(context).dividerColor.withOpacity(0.1), + ), + ), ), body: enableSlide ? slideList() : buildList, ); @override - Widget get buildList => ListView( + Widget get buildList => ListView.separated( controller: ScrollController(), physics: const AlwaysScrollableScrollPhysics(), padding: EdgeInsets.only(bottom: MediaQuery.paddingOf(context).bottom + 80), - children: [ - ...List.generate( - videoDetailController.viewPointList.length * 2 - 1, - (rawIndex) { - if (rawIndex % 2 == 1) { - return Divider( - height: 1, - color: Theme.of(context).dividerColor.withOpacity(0.1), - ); - } - int index = rawIndex ~/ 2; - Segment segment = videoDetailController.viewPointList[index]; - if (currentIndex == -1 && - segment.from != null && - segment.to != null) { - if (videoDetailController - .plPlayerController.positionSeconds.value >= - segment.from! && - videoDetailController - .plPlayerController.positionSeconds.value < - segment.to!) { - currentIndex = index; - } - } - return ListTile( - dense: true, - onTap: segment.from != null - ? () { - currentIndex = index; - plPlayerController?.danmakuController?.clear(); - plPlayerController?.videoPlayerController - ?.seek(Duration(seconds: segment.from!)); - Get.back(); - } - : null, - leading: segment.url?.isNotEmpty == true - ? Container( - margin: const EdgeInsets.symmetric(vertical: 6), - decoration: currentIndex == index - ? BoxDecoration( - borderRadius: BorderRadius.circular(6), - border: Border.all( - width: 1.8, - strokeAlign: BorderSide.strokeAlignOutside, - color: Theme.of(context).colorScheme.primary, - ), - ) - : null, - child: LayoutBuilder( - builder: (context, constraints) => NetworkImgLayer( - radius: 6, - src: segment.url, - width: - constraints.maxHeight * StyleString.aspectRatio, - height: constraints.maxHeight, - ), - ), - ) - : null, - title: Text( - segment.title ?? '', - style: TextStyle( - fontSize: 14, - fontWeight: currentIndex == index ? FontWeight.bold : null, - color: currentIndex == index - ? Theme.of(context).colorScheme.primary + itemCount: videoDetailController.viewPointList.length, + itemBuilder: (context, index) { + Segment segment = videoDetailController.viewPointList[index]; + if (currentIndex == -1 && + segment.from != null && + segment.to != null) { + if (videoDetailController + .plPlayerController.positionSeconds.value >= + segment.from! && + videoDetailController.plPlayerController.positionSeconds.value < + segment.to!) { + currentIndex = index; + } + } + return ListTile( + dense: true, + onTap: segment.from != null + ? () { + currentIndex = index; + plPlayerController?.danmakuController?.clear(); + plPlayerController?.videoPlayerController + ?.seek(Duration(seconds: segment.from!)); + Get.back(); + } + : null, + leading: segment.url?.isNotEmpty == true + ? Container( + margin: const EdgeInsets.symmetric(vertical: 6), + decoration: currentIndex == index + ? BoxDecoration( + borderRadius: BorderRadius.circular(6), + border: Border.all( + width: 1.8, + strokeAlign: BorderSide.strokeAlignOutside, + color: Theme.of(context).colorScheme.primary, + ), + ) : null, - ), - ), - subtitle: Text( - '${segment.from != null ? Utils.timeFormat(segment.from) : ''} - ${segment.to != null ? Utils.timeFormat(segment.to) : ''}', - style: TextStyle( - fontSize: 13, - color: currentIndex == index - ? Theme.of(context).colorScheme.primary - : Theme.of(context).colorScheme.outline, - ), - ), - ); - }, - ), - ], + child: LayoutBuilder( + builder: (context, constraints) => NetworkImgLayer( + radius: 6, + src: segment.url, + width: constraints.maxHeight * StyleString.aspectRatio, + height: constraints.maxHeight, + ), + ), + ) + : null, + title: Text( + segment.title ?? '', + style: TextStyle( + fontSize: 14, + fontWeight: currentIndex == index ? FontWeight.bold : null, + color: currentIndex == index + ? Theme.of(context).colorScheme.primary + : null, + ), + ), + subtitle: Text( + '${segment.from != null ? Utils.timeFormat(segment.from) : ''} - ${segment.to != null ? Utils.timeFormat(segment.to) : ''}', + style: TextStyle( + fontSize: 13, + color: currentIndex == index + ? Theme.of(context).colorScheme.primary + : Theme.of(context).colorScheme.outline, + ), + ), + ); + }, + separatorBuilder: (context, index) => Divider( + height: 1, + color: Theme.of(context).dividerColor.withOpacity(0.1), + ), ); }