diff --git a/lib/common/skeleton/dynamic_card.dart b/lib/common/skeleton/dynamic_card.dart index 94063e3d..ddbc8026 100644 --- a/lib/common/skeleton/dynamic_card.dart +++ b/lib/common/skeleton/dynamic_card.dart @@ -1,4 +1,5 @@ import 'package:PiliPlus/common/skeleton/skeleton.dart'; +import 'package:PiliPlus/utils/global_data.dart'; import 'package:flutter/material.dart'; class DynamicCardSkeleton extends StatelessWidget { @@ -89,7 +90,7 @@ class DynamicCardSkeleton extends StatelessWidget { ], ), ), - const Spacer(), + if (GlobalData().dynamicsWaterfallFlow) const Spacer(), Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ diff --git a/lib/pages/dynamics_tab/view.dart b/lib/pages/dynamics_tab/view.dart index acef254f..f869248a 100644 --- a/lib/pages/dynamics_tab/view.dart +++ b/lib/pages/dynamics_tab/view.dart @@ -12,7 +12,6 @@ import 'package:PiliPlus/pages/dynamics/widgets/dynamic_panel.dart'; import 'package:PiliPlus/pages/dynamics_tab/controller.dart'; import 'package:PiliPlus/pages/main/controller.dart'; import 'package:PiliPlus/utils/global_data.dart'; -import 'package:PiliPlus/utils/grid.dart'; import 'package:PiliPlus/utils/waterfall.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -91,7 +90,9 @@ class _DynamicsTabPageState padding: EdgeInsets.only( bottom: MediaQuery.paddingOf(context).bottom + 80, ), - sliver: Obx(() => _buildBody(controller.loadingState.value)), + sliver: buildPage( + Obx(() => _buildBody(controller.loadingState.value)), + ), ), ], ), @@ -122,30 +123,21 @@ class _DynamicsTabPageState childCount: response!.length, ), ) - : SliverCrossAxisGroup( - slivers: [ - const SliverFillRemaining(), - SliverConstrainedCrossAxis( - maxExtent: Grid.smallCardWidth * 2, - sliver: SliverList.builder( - itemBuilder: (context, index) { - if (index == response.length - 1) { - controller.onLoadMore(); - } - final item = response[index]; - return DynamicPanel( - item: item, - onRemove: (idStr) => - controller.onRemove(index, idStr), - onBlock: () => controller.onBlock(index), - maxWidth: maxWidth, - ); - }, - itemCount: response!.length, - ), - ), - const SliverFillRemaining(), - ], + : SliverList.builder( + itemBuilder: (context, index) { + if (index == response.length - 1) { + controller.onLoadMore(); + } + final item = response[index]; + return DynamicPanel( + item: item, + onRemove: (idStr) => + controller.onRemove(index, idStr), + onBlock: () => controller.onBlock(index), + maxWidth: maxWidth, + ); + }, + itemCount: response!.length, ) : HttpError(onReload: controller.onReload), Error(:var errMsg) => HttpError( diff --git a/lib/pages/dynamics_topic/view.dart b/lib/pages/dynamics_topic/view.dart index 68a3058e..46ad17cd 100644 --- a/lib/pages/dynamics_topic/view.dart +++ b/lib/pages/dynamics_topic/view.dart @@ -13,7 +13,6 @@ import 'package:PiliPlus/pages/dynamics/widgets/dynamic_panel.dart'; import 'package:PiliPlus/pages/dynamics_create/view.dart'; import 'package:PiliPlus/pages/dynamics_topic/controller.dart'; import 'package:PiliPlus/utils/global_data.dart'; -import 'package:PiliPlus/utils/grid.dart'; import 'package:PiliPlus/utils/num_util.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; @@ -141,7 +140,9 @@ class _DynTopicPageState extends State with DynMixin { }), SliverPadding( padding: EdgeInsets.only(bottom: padding.bottom + 80), - sliver: Obx(() => _buildBody(_controller.loadingState.value)), + sliver: buildPage( + Obx(() => _buildBody(_controller.loadingState.value)), + ), ), ], ), @@ -371,31 +372,22 @@ class _DynTopicPageState extends State with DynMixin { childCount: response!.length, ), ) - : SliverCrossAxisGroup( - slivers: [ - const SliverFillRemaining(), - SliverConstrainedCrossAxis( - maxExtent: Grid.smallCardWidth * 2, - sliver: SliverList.builder( - itemBuilder: (context, index) { - if (index == response.length - 1) { - _controller.onLoadMore(); - } - final item = response[index]; - if (item.dynamicCardItem != null) { - return DynamicPanel( - item: item.dynamicCardItem!, - maxWidth: maxWidth, - ); - } else { - return Text(item.topicType ?? 'err'); - } - }, - itemCount: response!.length, - ), - ), - const SliverFillRemaining(), - ], + : SliverList.builder( + itemBuilder: (context, index) { + if (index == response.length - 1) { + _controller.onLoadMore(); + } + final item = response[index]; + if (item.dynamicCardItem != null) { + return DynamicPanel( + item: item.dynamicCardItem!, + maxWidth: maxWidth, + ); + } else { + return Text(item.topicType ?? 'err'); + } + }, + itemCount: response!.length, ) : HttpError(onReload: _controller.onReload), Error(:var errMsg) => HttpError( diff --git a/lib/pages/member_dynamics/view.dart b/lib/pages/member_dynamics/view.dart index 350d866d..fefbf035 100644 --- a/lib/pages/member_dynamics/view.dart +++ b/lib/pages/member_dynamics/view.dart @@ -5,7 +5,6 @@ import 'package:PiliPlus/models/dynamics/result.dart'; import 'package:PiliPlus/pages/dynamics/widgets/dynamic_panel.dart'; import 'package:PiliPlus/pages/member_dynamics/controller.dart'; import 'package:PiliPlus/utils/global_data.dart'; -import 'package:PiliPlus/utils/grid.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:PiliPlus/utils/waterfall.dart'; import 'package:flutter/material.dart'; @@ -64,8 +63,10 @@ class _MemberDynamicsPageState extends State padding: EdgeInsets.only( bottom: MediaQuery.paddingOf(context).bottom + 80, ), - sliver: Obx( - () => _buildContent(_memberDynamicController.loadingState.value), + sliver: buildPage( + Obx( + () => _buildContent(_memberDynamicController.loadingState.value), + ), ), ), ], @@ -95,28 +96,19 @@ class _MemberDynamicsPageState extends State childCount: response!.length, ), ) - : SliverCrossAxisGroup( - slivers: [ - const SliverFillRemaining(), - SliverConstrainedCrossAxis( - maxExtent: Grid.smallCardWidth * 2, - sliver: SliverList.builder( - itemBuilder: (context, index) { - if (index == response.length - 1) { - _memberDynamicController.onLoadMore(); - } - return DynamicPanel( - item: response[index], - onRemove: _memberDynamicController.onRemove, - onSetTop: _memberDynamicController.onSetTop, - maxWidth: maxWidth, - ); - }, - itemCount: response!.length, - ), - ), - const SliverFillRemaining(), - ], + : SliverList.builder( + itemBuilder: (context, index) { + if (index == response.length - 1) { + _memberDynamicController.onLoadMore(); + } + return DynamicPanel( + item: response[index], + onRemove: _memberDynamicController.onRemove, + onSetTop: _memberDynamicController.onSetTop, + maxWidth: maxWidth, + ); + }, + itemCount: response!.length, ) : HttpError(onReload: _memberDynamicController.onReload), Error(:var errMsg) => HttpError( diff --git a/lib/pages/member_search/child/view.dart b/lib/pages/member_search/child/view.dart index a6d806e8..5e78ece6 100644 --- a/lib/pages/member_search/child/view.dart +++ b/lib/pages/member_search/child/view.dart @@ -45,7 +45,14 @@ class _MemberSearchChildPageState extends State top: widget.searchType == MemberSearchType.archive ? 7 : 0, bottom: MediaQuery.paddingOf(context).bottom + 80, ), - sliver: Obx(() => _buildBody(_controller.loadingState.value)), + sliver: switch (widget.searchType) { + MemberSearchType.archive => Obx( + () => _buildBody(_controller.loadingState.value), + ), + MemberSearchType.dynamic => buildPage( + Obx(() => _buildBody(_controller.loadingState.value)), + ), + }, ), ], ), @@ -96,26 +103,17 @@ class _MemberSearchChildPageState extends State childCount: response!.length, ), ) - : SliverCrossAxisGroup( - slivers: [ - const SliverFillRemaining(), - SliverConstrainedCrossAxis( - maxExtent: Grid.smallCardWidth * 2, - sliver: SliverList.builder( - itemBuilder: (context, index) { - if (index == response.length - 1) { - _controller.onLoadMore(); - } - return DynamicPanel( - item: response[index], - maxWidth: maxWidth, - ); - }, - itemCount: response!.length, - ), - ), - const SliverFillRemaining(), - ], + : SliverList.builder( + itemBuilder: (context, index) { + if (index == response.length - 1) { + _controller.onLoadMore(); + } + return DynamicPanel( + item: response[index], + maxWidth: maxWidth, + ); + }, + itemCount: response!.length, ), }; }, diff --git a/lib/utils/waterfall.dart b/lib/utils/waterfall.dart index a292779d..66e7d76e 100644 --- a/lib/utils/waterfall.dart +++ b/lib/utils/waterfall.dart @@ -17,6 +17,29 @@ mixin DynMixin { callback: (value) => maxWidth = value, ); + Widget buildPage(Widget child) { + if (GlobalData().dynamicsWaterfallFlow) { + return child; + } + return SliverLayoutBuilder( + builder: (context, constraints) { + final maxWidth = constraints.crossAxisExtent; + final cardWidth = Grid.smallCardWidth * 2; + final flag = cardWidth < maxWidth; + this.maxWidth = flag ? cardWidth : maxWidth; + if (!flag) { + return child; + } + return SliverPadding( + padding: EdgeInsets.symmetric( + horizontal: (maxWidth - cardWidth) / 2, + ), + sliver: child, + ); + }, + ); + } + late final skeDelegate = SliverGridDelegateWithExtentAndRatio( crossAxisSpacing: 4, mainAxisSpacing: 4, @@ -33,18 +56,9 @@ mixin DynMixin { itemCount: 10, ); } - return SliverCrossAxisGroup( - slivers: [ - const SliverFillRemaining(), - SliverConstrainedCrossAxis( - maxExtent: Grid.smallCardWidth * 2, - sliver: SliverList.builder( - itemBuilder: (_, _) => const DynamicCardSkeleton(), - itemCount: 10, - ), - ), - const SliverFillRemaining(), - ], + return SliverList.builder( + itemBuilder: (_, _) => const DynamicCardSkeleton(), + itemCount: 10, ); } }