handle relation url

Closes #1566

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-10-15 18:25:15 +08:00
parent 32ce2b87db
commit c9de79532a
31 changed files with 634 additions and 393 deletions

View File

@@ -1,6 +1,7 @@
import 'package:PiliPlus/http/follow.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/member.dart';
import 'package:PiliPlus/http/user.dart';
import 'package:PiliPlus/models/common/follow_order_type.dart';
import 'package:PiliPlus/models_new/follow/data.dart';
import 'package:PiliPlus/models_new/follow/list.dart';
@@ -14,6 +15,11 @@ class FollowChildController
final FollowController? controller;
final int? tagid;
final int mid;
int? total;
late final loadSameFollow = controller?.isOwner == false;
late final Rx<LoadingState<List<FollowItemModel>?>> sameState =
LoadingState<List<FollowItemModel>?>.loading().obs;
late final Rx<FollowOrderType> orderType = FollowOrderType.def.obs;
@@ -21,13 +27,24 @@ class FollowChildController
void onInit() {
super.onInit();
queryData();
if (loadSameFollow) {
_loadSameFollow();
}
}
@override
List<FollowItemModel>? getDataList(FollowData response) {
total = response.total;
return response.list;
}
@override
void checkIsEnd(int length) {
if (total != null && length >= total!) {
isEnd = true;
}
}
@override
bool customHandleResponse(bool isRefresh, Success<FollowData> response) {
if (controller != null) {
@@ -57,4 +74,11 @@ class FollowChildController
orderType: orderType.value.type,
);
}
Future<void> _loadSameFollow() async {
final res = await UserHttp.sameFollowing(mid: mid);
if (res.isSuccess) {
sameState.value = Success(res.data.list);
}
}
}

View File

@@ -1,4 +1,5 @@
import 'package:PiliPlus/common/skeleton/msg_feed_top.dart';
import 'package:PiliPlus/common/widgets/button/more_btn.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/refresh_indicator.dart';
import 'package:PiliPlus/http/loading_state.dart';
@@ -42,7 +43,24 @@ class _FollowChildPageState extends State<FollowChildPage>
@override
Widget build(BuildContext context) {
super.build(context);
final colorScheme = ColorScheme.of(context);
final padding = MediaQuery.viewPaddingOf(context);
Widget sliver = Obx(
() => _buildBody(_followController.loadingState.value),
);
if (_followController.loadSameFollow) {
sliver = SliverMainAxisGroup(
slivers: [
Obx(
() => _buildSameFollowing(
colorScheme,
_followController.sameState.value,
),
),
sliver,
],
);
}
Widget child = refreshIndicator(
onRefresh: _followController.onRefresh,
child: CustomScrollView(
@@ -55,9 +73,7 @@ class _FollowChildPageState extends State<FollowChildPage>
right: padding.right,
bottom: padding.bottom + 100,
),
sliver: Obx(
() => _buildBody(_followController.loadingState.value),
),
sliver: sliver,
),
],
),
@@ -122,6 +138,68 @@ class _FollowChildPageState extends State<FollowChildPage>
};
}
Widget _buildSameFollowing(
ColorScheme colorScheme,
LoadingState<List<FollowItemModel>?> state,
) {
return switch (state) {
Success(:var response) =>
response?.isNotEmpty == true
? SliverMainAxisGroup(
slivers: [
SliverToBoxAdapter(
child: Padding(
padding: const EdgeInsets.only(
left: 16,
right: 16,
bottom: 6,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'我们的共同关注',
style: TextStyle(
color: colorScheme.onSurfaceVariant,
),
),
moreTextButton(
onTap: () => Get.toNamed(
'/sameFollowing?mid=${_followController.mid}&name=${widget.controller?.name.value}',
),
color: colorScheme.outline,
),
],
),
),
),
SliverList.builder(
itemCount: response!.length,
itemBuilder: (_, index) =>
FollowItem(item: response[index]),
),
SliverToBoxAdapter(
child: Padding(
padding: const EdgeInsets.only(
left: 16,
top: 16,
bottom: 6,
),
child: Text(
'全部关注',
style: TextStyle(
color: colorScheme.onSurfaceVariant,
),
),
),
),
],
)
: const SliverToBoxAdapter(),
_ => const SliverToBoxAdapter(),
};
}
@override
bool get wantKeepAlive =>
widget.onSelect != null || widget.controller?.tabController != null;