mirror of
https://github.com/bggRGjQaUbCoE/PiliPlus.git
synced 2026-08-04 09:40:09 +08:00
handle relation url
Closes #1566 Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -1,16 +1,15 @@
|
||||
import 'package:PiliPlus/http/loading_state.dart';
|
||||
import 'package:PiliPlus/http/member.dart';
|
||||
import 'package:PiliPlus/models/member/tags.dart';
|
||||
import 'package:PiliPlus/services/account_service.dart';
|
||||
import 'package:PiliPlus/utils/accounts.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||
import 'package:get/get.dart';
|
||||
|
||||
class FollowController extends GetxController with GetTickerProviderStateMixin {
|
||||
late int mid;
|
||||
String? name;
|
||||
late bool isOwner;
|
||||
late final int mid;
|
||||
late final RxnString name;
|
||||
late final bool isOwner;
|
||||
|
||||
late final Rx<LoadingState> followState = LoadingState.loading().obs;
|
||||
late final RxList<MemberTagItemModel> tabs = <MemberTagItemModel>[].obs;
|
||||
@@ -19,16 +18,26 @@ class FollowController extends GetxController with GetTickerProviderStateMixin {
|
||||
@override
|
||||
void onInit() {
|
||||
super.onInit();
|
||||
int ownerMid = Accounts.main.mid;
|
||||
final ownerMid = Accounts.main.mid;
|
||||
final mid = Get.parameters['mid'];
|
||||
this.mid = mid != null ? int.parse(mid) : ownerMid;
|
||||
isOwner = ownerMid == this.mid;
|
||||
name = Get.parameters['name'] ?? Get.find<AccountService>().name.value;
|
||||
if (isOwner) {
|
||||
queryFollowUpTags();
|
||||
} else {
|
||||
final name = Get.parameters['name'];
|
||||
this.name = RxnString(name);
|
||||
if (name == null) {
|
||||
_queryUserName();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _queryUserName() async {
|
||||
final res = await MemberHttp.memberCardInfo(mid: mid);
|
||||
name.value = res.dataOrNull?.card?.name;
|
||||
}
|
||||
|
||||
Future<void> queryFollowUpTags() async {
|
||||
var res = await MemberHttp.followUpTags();
|
||||
if (res.isSuccess) {
|
||||
|
||||
@@ -31,9 +31,13 @@ class _FollowPageState extends State<FollowPage> {
|
||||
return Scaffold(
|
||||
resizeToAvoidBottomInset: false,
|
||||
appBar: AppBar(
|
||||
title: Text(
|
||||
_followController.isOwner ? '我的关注' : '${_followController.name}的关注',
|
||||
),
|
||||
title: _followController.isOwner
|
||||
? const Text('我的关注')
|
||||
: Obx(() {
|
||||
final name = _followController.name.value;
|
||||
if (name != null) return Text('$name的关注');
|
||||
return const SizedBox.shrink();
|
||||
}),
|
||||
actions: _followController.isOwner
|
||||
? [
|
||||
IconButton(
|
||||
|
||||
Reference in New Issue
Block a user