refactor(app): 迁移 4 个页面到共享 EmptyStateWidget + ErrorStateWidget
迁移统计: - discover_page: _buildError → ErrorStateWidget, _buildEmptyHint → EmptyStateWidget - sticker_library_page: 错误 + 空列表 → 共享组件 - class_page: 错误/班级列表空/日记墙空/话题空 → 共享组件 (4 处) - calendar_page: CalendarError → ErrorStateWidget 统一体验: 所有页面空状态使用一致的 icon + title + subtitle + CTA 布局
This commit is contained in:
@@ -19,6 +19,8 @@ import '../../../core/theme/app_colors.dart';
|
||||
import '../../../core/theme/app_radius.dart';
|
||||
import '../../../core/theme/app_shadows.dart';
|
||||
import '../../../core/theme/app_typography.dart';
|
||||
import '../../../widgets/empty_state_widget.dart';
|
||||
import '../../../widgets/error_state_widget.dart';
|
||||
import '../bloc/discover_bloc.dart';
|
||||
import '../models/discover_models.dart';
|
||||
|
||||
@@ -126,66 +128,19 @@ class DiscoverPage extends StatelessWidget {
|
||||
|
||||
/// 错误状态
|
||||
Widget _buildError(BuildContext context, String message) {
|
||||
return Column(
|
||||
children: [
|
||||
const _LoadingSkeleton(height: 140),
|
||||
const SizedBox(height: DesignTokens.spacing24),
|
||||
Container(
|
||||
width: double.infinity,
|
||||
padding: const EdgeInsets.all(DesignTokens.spacing16),
|
||||
decoration: BoxDecoration(
|
||||
color: AppColors.rose.withValues(alpha: 0.1),
|
||||
borderRadius: AppRadius.mdBorder,
|
||||
),
|
||||
child: Column(
|
||||
children: [
|
||||
Icon(Icons.cloud_off_rounded,
|
||||
size: 32, color: AppColors.rose),
|
||||
const SizedBox(height: DesignTokens.spacing8),
|
||||
Text(message,
|
||||
style: TextStyle(
|
||||
fontSize: 13,
|
||||
color: Theme.of(context).colorScheme.onSurfaceVariant),
|
||||
textAlign: TextAlign.center),
|
||||
const SizedBox(height: DesignTokens.spacing12),
|
||||
TextButton.icon(
|
||||
onPressed: () => context
|
||||
.read<DiscoverBloc>()
|
||||
.add(const DiscoverLoadData()),
|
||||
icon: const Icon(Icons.refresh_rounded, size: 18),
|
||||
label: const Text('重试'),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
return ErrorStateWidget(
|
||||
message: message,
|
||||
onRetry: () =>
|
||||
context.read<DiscoverBloc>().add(const DiscoverLoadData()),
|
||||
);
|
||||
}
|
||||
|
||||
/// 空数据提示
|
||||
Widget _buildEmptyHint(BuildContext context) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: DesignTokens.spacing32),
|
||||
child: Center(
|
||||
child: Column(
|
||||
children: [
|
||||
const Text('✨', style: TextStyle(fontSize: 40)),
|
||||
const SizedBox(height: DesignTokens.spacing12),
|
||||
Text('还没有发现内容',
|
||||
style: TextStyle(
|
||||
fontSize: 15,
|
||||
color: Theme.of(context).colorScheme.onSurfaceVariant,
|
||||
)),
|
||||
const SizedBox(height: 4),
|
||||
Text('写下你的第一篇日记,出现在这里吧!',
|
||||
style: TextStyle(
|
||||
fontSize: 13,
|
||||
color: Theme.of(context).colorScheme.onSurfaceVariant
|
||||
.withValues(alpha: 0.7),
|
||||
)),
|
||||
],
|
||||
),
|
||||
),
|
||||
return const EmptyStateWidget(
|
||||
icon: Icons.explore_rounded,
|
||||
title: '还没有发现内容',
|
||||
subtitle: '试试写一篇日记分享给大家吧',
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user