opt: pages

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2024-11-21 18:06:33 +08:00
parent 5b2a4fa681
commit c5f5c00d37
66 changed files with 1504 additions and 1534 deletions

View File

@@ -349,63 +349,68 @@ class _DynamicDetailPageState extends State<DynamicDetailPage>
}
Widget replyList(LoadingState loadingState) {
return loadingState is Success
? SliverList(
delegate: SliverChildBuilderDelegate(
(context, index) {
if (index == loadingState.response.replies.length) {
return Container(
padding: EdgeInsets.only(
bottom: MediaQuery.of(context).padding.bottom),
height: MediaQuery.of(context).padding.bottom + 100,
child: Center(
child: Obx(
() => Text(
_dynamicDetailController.noMore.value,
style: TextStyle(
fontSize: 12,
color: Theme.of(context).colorScheme.outline,
return switch (loadingState) {
Loading() => SliverList(
delegate: SliverChildBuilderDelegate(
(context, index) {
return const VideoReplySkeleton();
},
childCount: 8,
),
),
Success() => (loadingState.response.replies as List?)?.isNotEmpty == true
? SliverList(
delegate: SliverChildBuilderDelegate(
(context, index) {
if (index == loadingState.response.replies.length) {
return Container(
padding: EdgeInsets.only(
bottom: MediaQuery.of(context).padding.bottom),
height: MediaQuery.of(context).padding.bottom + 100,
child: Center(
child: Obx(
() => Text(
_dynamicDetailController.noMore.value,
style: TextStyle(
fontSize: 12,
color: Theme.of(context).colorScheme.outline,
),
),
),
),
),
);
} else {
return ReplyItemGrpc(
replyItem: loadingState.response.replies[index],
showReplyRow: true,
replyLevel: '1',
replyReply: replyReply,
replyType: ReplyType.values[replyType],
onReply: () {
_dynamicDetailController.onReply(
context,
replyItem: loadingState.response.replies[index],
index: index,
);
},
onDelete: _dynamicDetailController.onMDelete,
isTop: _dynamicDetailController.hasUpTop && index == 0,
upMid: loadingState.response.subjectControl.upMid,
);
}
},
childCount: loadingState.response.replies.length + 1,
);
} else {
return ReplyItemGrpc(
replyItem: loadingState.response.replies[index],
showReplyRow: true,
replyLevel: '1',
replyReply: replyReply,
replyType: ReplyType.values[replyType],
onReply: () {
_dynamicDetailController.onReply(
context,
replyItem: loadingState.response.replies[index],
index: index,
);
},
onDelete: _dynamicDetailController.onMDelete,
isTop: _dynamicDetailController.hasUpTop && index == 0,
upMid: loadingState.response.subjectControl.upMid,
);
}
},
childCount: loadingState.response.replies.length + 1,
),
)
: HttpError(
callback: _dynamicDetailController.onReload,
),
)
: loadingState is Error
? HttpError(
errMsg: loadingState.errMsg,
fn: _dynamicDetailController.onReload,
)
: SliverList(
delegate: SliverChildBuilderDelegate(
(context, index) {
return const VideoReplySkeleton();
},
childCount: 8,
),
);
Error() => HttpError(
errMsg: loadingState.errMsg,
callback: _dynamicDetailController.onReload,
),
LoadingState() => throw UnimplementedError(),
};
}
}

View File

@@ -55,11 +55,7 @@ class DynamicsTabController extends CommonController {
if (res['status']) {
List list = (loadingState.value as Success).response;
list.removeWhere((item) => item.idStr == dynamicId);
if (list.isNotEmpty) {
loadingState.value = LoadingState.success(list);
} else {
loadingState.value = LoadingState.empty();
}
loadingState.value = LoadingState.success(list);
SmartDialog.showToast('删除成功');
} else {
SmartDialog.showToast(res['msg']);

View File

@@ -10,7 +10,6 @@ import 'package:flutter/rendering.dart';
import 'package:get/get.dart';
import 'package:PiliPalaX/common/constants.dart';
import 'package:PiliPalaX/common/widgets/http_error.dart';
import 'package:PiliPalaX/common/widgets/no_data.dart';
import 'package:waterfall_flow/waterfall_flow.dart';
import '../../../common/skeleton/dynamic_card.dart';
@@ -146,71 +145,74 @@ class _DynamicsTabPageState extends State<DynamicsTabPage>
}
Widget _buildBody(LoadingState loadingState) {
return loadingState is Success
? dynamicsWaterfallFlow
? SliverWaterfallFlow.extent(
maxCrossAxisExtent: Grid.maxRowWidth * 2,
//cacheExtent: 0.0,
crossAxisSpacing: StyleString.cardSpace / 2,
mainAxisSpacing: StyleString.cardSpace / 2,
return switch (loadingState) {
Loading() => skeleton(),
Success() => (loadingState.response as List?)?.isNotEmpty == true
? dynamicsWaterfallFlow
? SliverWaterfallFlow.extent(
maxCrossAxisExtent: Grid.maxRowWidth * 2,
//cacheExtent: 0.0,
crossAxisSpacing: StyleString.cardSpace / 2,
mainAxisSpacing: StyleString.cardSpace / 2,
lastChildLayoutTypeBuilder: (index) =>
index == loadingState.response.length
? LastChildLayoutType.foot
: LastChildLayoutType.none,
children: [
if (dynamicsController.tabController.index == 4 &&
dynamicsController.mid.value != -1) ...[
for (var i in loadingState.response)
DynamicPanel(
item: i,
onRemove: _dynamicsTabController.onRemove,
),
] else ...[
for (var i in loadingState.response)
if (!dynamicsController.tempBannedList
.contains(i.modules?.moduleAuthor?.mid))
lastChildLayoutTypeBuilder: (index) =>
index == loadingState.response.length
? LastChildLayoutType.foot
: LastChildLayoutType.none,
children: [
if (dynamicsController.tabController.index == 4 &&
dynamicsController.mid.value != -1) ...[
for (var i in loadingState.response)
DynamicPanel(
item: i,
onRemove: _dynamicsTabController.onRemove,
),
]
],
)
: SliverCrossAxisGroup(
slivers: [
const SliverFillRemaining(),
SliverConstrainedCrossAxis(
maxExtent: Grid.maxRowWidth * 2,
sliver: SliverList(
delegate: SliverChildBuilderDelegate(
(context, index) {
if ((dynamicsController.tabController.index == 4 &&
dynamicsController.mid.value != -1) ||
!dynamicsController.tempBannedList.contains(
loadingState.response[index].modules
?.moduleAuthor?.mid)) {
return DynamicPanel(
item: loadingState.response[index],
onRemove: _dynamicsTabController.onRemove,
);
}
return const SizedBox();
},
childCount: loadingState.response.length,
] else ...[
for (var i in loadingState.response)
if (!dynamicsController.tempBannedList
.contains(i.modules?.moduleAuthor?.mid))
DynamicPanel(
item: i,
onRemove: _dynamicsTabController.onRemove,
),
]
],
)
: SliverCrossAxisGroup(
slivers: [
const SliverFillRemaining(),
SliverConstrainedCrossAxis(
maxExtent: Grid.maxRowWidth * 2,
sliver: SliverList(
delegate: SliverChildBuilderDelegate(
(context, index) {
if ((dynamicsController.tabController.index == 4 &&
dynamicsController.mid.value != -1) ||
!dynamicsController.tempBannedList.contains(
loadingState.response[index].modules
?.moduleAuthor?.mid)) {
return DynamicPanel(
item: loadingState.response[index],
onRemove: _dynamicsTabController.onRemove,
);
}
return const SizedBox();
},
childCount: loadingState.response.length,
),
),
),
),
const SliverFillRemaining(),
],
)
: loadingState is Empty
? const NoData()
: loadingState is Error
? HttpError(
errMsg: loadingState.errMsg,
fn: _dynamicsTabController.onReload,
)
: skeleton();
const SliverFillRemaining(),
],
)
: HttpError(
callback: _dynamicsTabController.onReload,
),
Error() => HttpError(
errMsg: loadingState.errMsg,
callback: _dynamicsTabController.onReload,
),
LoadingState() => throw UnimplementedError(),
};
}
}

View File

@@ -15,6 +15,7 @@ import 'package:PiliPalaX/utils/feed_back.dart';
import 'package:PiliPalaX/utils/storage.dart';
import 'package:image_picker/image_picker.dart';
import 'package:intl/intl.dart';
import 'package:nil/nil.dart';
import 'controller.dart';
import 'widgets/up_panel.dart';
@@ -98,7 +99,7 @@ class _DynamicsPageState extends State<DynamicsPage>
});
upPanelPosition = UpPanelPosition.values[setting.get(
SettingBoxKey.upPanelPosition,
defaultValue: UpPanelPosition.leftFixed.code)];
defaultValue: UpPanelPosition.leftFixed.index)];
debugPrint('upPanelPosition: $upPanelPosition');
if (GStorage.setting
.get(SettingBoxKey.dynamicsShowAllFollowedUp, defaultValue: false)) {
@@ -128,7 +129,7 @@ class _DynamicsPageState extends State<DynamicsPage>
padding: const EdgeInsets.symmetric(horizontal: 4),
child: Container(
//抽屉模式增加底色
color: upPanelPosition.code > 1
color: upPanelPosition.index > 1
? Theme.of(context).colorScheme.surface
: Colors.transparent,
width: 56,
@@ -137,20 +138,27 @@ class _DynamicsPageState extends State<DynamicsPage>
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.data == null) {
return const SizedBox();
return nil;
}
Map data = snapshot.data;
if (data['status']) {
return Obx(() => UpPanel(_dynamicsController.upData.value,
_dynamicsController.scrollController));
} else {
return const SizedBox();
return Center(
child: IconButton(
icon: Icon(Icons.refresh),
onPressed: () {
setState(() {
_futureBuilderFutureUp =
_dynamicsController.queryFollowUp();
});
},
),
);
}
} else {
return const SizedBox(
width: 56,
child: UpPanelSkeleton(),
);
return nil;
}
},
),