Files
PiliPlus/lib/pages/dynamics_tab/view.dart
2026-06-24 13:18:17 +08:00

91 lines
3.4 KiB
Dart

import 'package:PiliPlus/common/widgets/flutter/refresh_indicator.dart';
import 'package:PiliPlus/common/widgets/loading_widget/http_error.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/dynamics/result.dart';
import 'package:PiliPlus/pages/dynamics/widgets/dynamic_panel.dart';
import 'package:PiliPlus/pages/dynamics_tab/controller.dart';
import 'package:PiliPlus/utils/global_data.dart';
import 'package:PiliPlus/utils/waterfall.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:waterfall_flow/waterfall_flow.dart'
hide SliverWaterfallFlowDelegateWithMaxCrossAxisExtent;
class DynamicsTabPage extends StatelessWidget with DynMixin {
DynamicsTabPage({
super.key,
required this.controller,
});
final DynamicsTabController controller;
@override
Widget build(BuildContext context) {
return refreshIndicator(
onRefresh: controller.outerController.onRefresh,
child: CustomScrollView(
physics: ReloadScrollPhysics(controller: controller),
controller: controller.scrollController,
slivers: [
SliverPadding(
padding: const .only(bottom: 100),
sliver: buildPage(
Obx(() => _buildBody(controller.loadingState.value)),
),
),
],
),
);
}
Widget _buildBody(LoadingState<List<DynamicItemModel>?> loadingState) {
return switch (loadingState) {
Loading() => dynSkeleton,
Success(:final response) =>
response != null && response.isNotEmpty
? GlobalData.dynamicsWaterfallFlow
? SliverWaterfallFlow(
gridDelegate: dynGridDelegate,
delegate: SliverChildBuilderDelegate(
(_, 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),
onUnfold: () => controller.onUnfold(item, index),
);
},
childCount: response.length,
),
)
: 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),
onUnfold: () => controller.onUnfold(item, index),
);
},
itemCount: response.length,
)
: HttpError(onReload: controller.onReload),
Error(:final errMsg) => HttpError(
errMsg: errMsg,
onReload: controller.onReload,
),
};
}
}