Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-08-17 17:41:08 +08:00
parent ab610e9da5
commit 470545337d
6 changed files with 101 additions and 112 deletions

View File

@@ -1,4 +1,5 @@
import 'package:PiliPlus/common/skeleton/skeleton.dart'; import 'package:PiliPlus/common/skeleton/skeleton.dart';
import 'package:PiliPlus/utils/global_data.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class DynamicCardSkeleton extends StatelessWidget { class DynamicCardSkeleton extends StatelessWidget {
@@ -89,7 +90,7 @@ class DynamicCardSkeleton extends StatelessWidget {
], ],
), ),
), ),
const Spacer(), if (GlobalData().dynamicsWaterfallFlow) const Spacer(),
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceAround, mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [ children: [

View File

@@ -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/dynamics_tab/controller.dart';
import 'package:PiliPlus/pages/main/controller.dart'; import 'package:PiliPlus/pages/main/controller.dart';
import 'package:PiliPlus/utils/global_data.dart'; import 'package:PiliPlus/utils/global_data.dart';
import 'package:PiliPlus/utils/grid.dart';
import 'package:PiliPlus/utils/waterfall.dart'; import 'package:PiliPlus/utils/waterfall.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
@@ -91,7 +90,9 @@ class _DynamicsTabPageState
padding: EdgeInsets.only( padding: EdgeInsets.only(
bottom: MediaQuery.paddingOf(context).bottom + 80, 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, childCount: response!.length,
), ),
) )
: SliverCrossAxisGroup( : SliverList.builder(
slivers: [ itemBuilder: (context, index) {
const SliverFillRemaining(), if (index == response.length - 1) {
SliverConstrainedCrossAxis( controller.onLoadMore();
maxExtent: Grid.smallCardWidth * 2, }
sliver: SliverList.builder( final item = response[index];
itemBuilder: (context, index) { return DynamicPanel(
if (index == response.length - 1) { item: item,
controller.onLoadMore(); onRemove: (idStr) =>
} controller.onRemove(index, idStr),
final item = response[index]; onBlock: () => controller.onBlock(index),
return DynamicPanel( maxWidth: maxWidth,
item: item, );
onRemove: (idStr) => },
controller.onRemove(index, idStr), itemCount: response!.length,
onBlock: () => controller.onBlock(index),
maxWidth: maxWidth,
);
},
itemCount: response!.length,
),
),
const SliverFillRemaining(),
],
) )
: HttpError(onReload: controller.onReload), : HttpError(onReload: controller.onReload),
Error(:var errMsg) => HttpError( Error(:var errMsg) => HttpError(

View File

@@ -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_create/view.dart';
import 'package:PiliPlus/pages/dynamics_topic/controller.dart'; import 'package:PiliPlus/pages/dynamics_topic/controller.dart';
import 'package:PiliPlus/utils/global_data.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/num_util.dart';
import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart';
import 'package:PiliPlus/utils/utils.dart'; import 'package:PiliPlus/utils/utils.dart';
@@ -141,7 +140,9 @@ class _DynTopicPageState extends State<DynTopicPage> with DynMixin {
}), }),
SliverPadding( SliverPadding(
padding: EdgeInsets.only(bottom: padding.bottom + 80), 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<DynTopicPage> with DynMixin {
childCount: response!.length, childCount: response!.length,
), ),
) )
: SliverCrossAxisGroup( : SliverList.builder(
slivers: [ itemBuilder: (context, index) {
const SliverFillRemaining(), if (index == response.length - 1) {
SliverConstrainedCrossAxis( _controller.onLoadMore();
maxExtent: Grid.smallCardWidth * 2, }
sliver: SliverList.builder( final item = response[index];
itemBuilder: (context, index) { if (item.dynamicCardItem != null) {
if (index == response.length - 1) { return DynamicPanel(
_controller.onLoadMore(); item: item.dynamicCardItem!,
} maxWidth: maxWidth,
final item = response[index]; );
if (item.dynamicCardItem != null) { } else {
return DynamicPanel( return Text(item.topicType ?? 'err');
item: item.dynamicCardItem!, }
maxWidth: maxWidth, },
); itemCount: response!.length,
} else {
return Text(item.topicType ?? 'err');
}
},
itemCount: response!.length,
),
),
const SliverFillRemaining(),
],
) )
: HttpError(onReload: _controller.onReload), : HttpError(onReload: _controller.onReload),
Error(:var errMsg) => HttpError( Error(:var errMsg) => HttpError(

View File

@@ -5,7 +5,6 @@ import 'package:PiliPlus/models/dynamics/result.dart';
import 'package:PiliPlus/pages/dynamics/widgets/dynamic_panel.dart'; import 'package:PiliPlus/pages/dynamics/widgets/dynamic_panel.dart';
import 'package:PiliPlus/pages/member_dynamics/controller.dart'; import 'package:PiliPlus/pages/member_dynamics/controller.dart';
import 'package:PiliPlus/utils/global_data.dart'; import 'package:PiliPlus/utils/global_data.dart';
import 'package:PiliPlus/utils/grid.dart';
import 'package:PiliPlus/utils/utils.dart'; import 'package:PiliPlus/utils/utils.dart';
import 'package:PiliPlus/utils/waterfall.dart'; import 'package:PiliPlus/utils/waterfall.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@@ -64,8 +63,10 @@ class _MemberDynamicsPageState extends State<MemberDynamicsPage>
padding: EdgeInsets.only( padding: EdgeInsets.only(
bottom: MediaQuery.paddingOf(context).bottom + 80, bottom: MediaQuery.paddingOf(context).bottom + 80,
), ),
sliver: Obx( sliver: buildPage(
() => _buildContent(_memberDynamicController.loadingState.value), Obx(
() => _buildContent(_memberDynamicController.loadingState.value),
),
), ),
), ),
], ],
@@ -95,28 +96,19 @@ class _MemberDynamicsPageState extends State<MemberDynamicsPage>
childCount: response!.length, childCount: response!.length,
), ),
) )
: SliverCrossAxisGroup( : SliverList.builder(
slivers: [ itemBuilder: (context, index) {
const SliverFillRemaining(), if (index == response.length - 1) {
SliverConstrainedCrossAxis( _memberDynamicController.onLoadMore();
maxExtent: Grid.smallCardWidth * 2, }
sliver: SliverList.builder( return DynamicPanel(
itemBuilder: (context, index) { item: response[index],
if (index == response.length - 1) { onRemove: _memberDynamicController.onRemove,
_memberDynamicController.onLoadMore(); onSetTop: _memberDynamicController.onSetTop,
} maxWidth: maxWidth,
return DynamicPanel( );
item: response[index], },
onRemove: _memberDynamicController.onRemove, itemCount: response!.length,
onSetTop: _memberDynamicController.onSetTop,
maxWidth: maxWidth,
);
},
itemCount: response!.length,
),
),
const SliverFillRemaining(),
],
) )
: HttpError(onReload: _memberDynamicController.onReload), : HttpError(onReload: _memberDynamicController.onReload),
Error(:var errMsg) => HttpError( Error(:var errMsg) => HttpError(

View File

@@ -45,7 +45,14 @@ class _MemberSearchChildPageState extends State<MemberSearchChildPage>
top: widget.searchType == MemberSearchType.archive ? 7 : 0, top: widget.searchType == MemberSearchType.archive ? 7 : 0,
bottom: MediaQuery.paddingOf(context).bottom + 80, 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<MemberSearchChildPage>
childCount: response!.length, childCount: response!.length,
), ),
) )
: SliverCrossAxisGroup( : SliverList.builder(
slivers: [ itemBuilder: (context, index) {
const SliverFillRemaining(), if (index == response.length - 1) {
SliverConstrainedCrossAxis( _controller.onLoadMore();
maxExtent: Grid.smallCardWidth * 2, }
sliver: SliverList.builder( return DynamicPanel(
itemBuilder: (context, index) { item: response[index],
if (index == response.length - 1) { maxWidth: maxWidth,
_controller.onLoadMore(); );
} },
return DynamicPanel( itemCount: response!.length,
item: response[index],
maxWidth: maxWidth,
);
},
itemCount: response!.length,
),
),
const SliverFillRemaining(),
],
), ),
}; };
}, },

View File

@@ -17,6 +17,29 @@ mixin DynMixin {
callback: (value) => maxWidth = value, 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( late final skeDelegate = SliverGridDelegateWithExtentAndRatio(
crossAxisSpacing: 4, crossAxisSpacing: 4,
mainAxisSpacing: 4, mainAxisSpacing: 4,
@@ -33,18 +56,9 @@ mixin DynMixin {
itemCount: 10, itemCount: 10,
); );
} }
return SliverCrossAxisGroup( return SliverList.builder(
slivers: [ itemBuilder: (_, _) => const DynamicCardSkeleton(),
const SliverFillRemaining(), itemCount: 10,
SliverConstrainedCrossAxis(
maxExtent: Grid.smallCardWidth * 2,
sliver: SliverList.builder(
itemBuilder: (_, _) => const DynamicCardSkeleton(),
itemCount: 10,
),
),
const SliverFillRemaining(),
],
); );
} }
} }