feat(mobile): UI-01 theme system, shared components and navigation

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-09-21 14:55:29 +08:00
parent 8f4ad11bd5
commit c94b9e5e58
27 changed files with 2067 additions and 555 deletions
+60
View File
@@ -0,0 +1,60 @@
/// EmptyState widget 测试(UI-01 Task 3)。
///
/// 覆盖:图标 + 标题 + 说明 + 可选操作按钮全量渲染;操作回调触发;
/// 无说明/无按钮时不占位。
library;
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:photo_live/app/theme.dart';
import 'package:photo_live/ui/components/empty_state.dart';
void main() {
Future<void> pumpState(
WidgetTester tester, {
String? subtitle,
String? actionLabel,
VoidCallback? onAction,
}) {
return tester.pumpWidget(
MaterialApp(
theme: AppTheme.light,
home: Scaffold(
body: EmptyState(
icon: Icons.photo_library_outlined,
title: 'No albums yet',
subtitle: subtitle,
actionLabel: actionLabel,
onAction: onAction,
),
),
),
);
}
testWidgets('渲染图标 + 标题 + 说明 + 操作按钮', (tester) async {
var taps = 0;
await pumpState(
tester,
subtitle: 'Create one to get started',
actionLabel: 'Create album',
onAction: () => taps++,
);
expect(find.byIcon(Icons.photo_library_outlined), findsOneWidget);
expect(find.text('No albums yet'), findsOneWidget);
expect(find.text('Create one to get started'), findsOneWidget);
expect(find.text('Create album'), findsOneWidget);
await tester.tap(find.text('Create album'));
expect(taps, 1, reason: '操作回调触发');
});
testWidgets('无说明/无按钮 → 仅图标与标题', (tester) async {
await pumpState(tester);
expect(find.byIcon(Icons.photo_library_outlined), findsOneWidget);
expect(find.text('No albums yet'), findsOneWidget);
expect(find.byType(FilledButton), findsNothing);
});
}