空奖励reward弹窗

This commit is contained in:
roxy 2026-05-16 04:08:51 +08:00
parent 0da4fe7922
commit a44b7394fe
3 changed files with 69 additions and 6 deletions

View File

@ -724,7 +724,7 @@
"roomRocketNoteTitle": "Note",
"roomRocketNoteSectionTitle": "Each time a VIP",
"roomRocketNoteSectionBody": "1. Each time a VIP level is purchased, it is valid for 30 days, and can be manually renewed after expiration.",
"roomRocketRewardEmptyText": "No rewards earned. Better luck next time.",
"roomRocketRewardEmptyText": "No reward",
"roomRocketRecordEmptyText": "No reward records",
"launchRocket": "Launch Rocket",
"roomRocketFuelFullNotice": "Rocket fuel is full! Launching in {1}s!"

View File

@ -35,7 +35,7 @@ class RoomRocketRewardDialog extends StatelessWidget {
final emptyText = _translate(
localizations,
'roomRocketRewardEmptyText',
'No rewards earned. Better luck next time.',
'No reward',
);
final contentDirection = Directionality.of(context);
final resolvedRewards = _normalizeRewards(
@ -257,7 +257,7 @@ class _RewardDialogCanvas extends StatelessWidget {
if (isEmpty)
_buildEmptyState()
else ...[
_buildRewardGrid(),
rewards.isEmpty ? _buildRewardEmptyState() : _buildRewardGrid(),
_buildWinnerList(),
],
_buildLoadingText(),
@ -380,9 +380,6 @@ class _RewardDialogCanvas extends StatelessWidget {
}
Widget _buildRewardGrid() {
if (rewards.isEmpty) {
return const SizedBox.shrink();
}
final columns = math.max(3, (rewards.length / 2).ceil());
return Positioned(
left: s(28),
@ -425,6 +422,45 @@ class _RewardDialogCanvas extends StatelessWidget {
);
}
Widget _buildRewardEmptyState() {
return Positioned(
left: s(0),
top: s(268),
width: s(_designWidth),
height: s(178),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image.asset(
_RewardDialogAssets.empty,
width: s(72),
height: s(72),
fit: BoxFit.contain,
),
SizedBox(height: s(10)),
SizedBox(
width: s(250),
child: Text(
emptyText,
textDirection: contentDirection,
textScaler: TextScaler.noScaling,
maxLines: 2,
overflow: TextOverflow.ellipsis,
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white.withValues(alpha: 0.72),
fontSize: s(13),
height: 1.25,
fontWeight: FontWeight.w600,
decoration: TextDecoration.none,
),
),
),
],
),
);
}
Widget _buildWinnerList() {
return Positioned(
left: s(12),

View File

@ -1,5 +1,8 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:yumi/shared/business_logic/models/res/sc_room_rocket_api_res.dart';
import 'package:yumi/ui_kit/widgets/room/rocket/room_rocket_dialog.dart';
import 'package:yumi/ui_kit/widgets/room/rocket/room_rocket_reward_dialog.dart';
import 'package:yumi/ui_kit/widgets/room/rocket/room_rocket_reward_dialog_loader.dart';
void main() {
@ -27,6 +30,30 @@ void main() {
expect(records.map((item) => item.rewardAmount), [5000, 5200]);
});
});
group('room rocket reward dialog', () {
testWidgets('shows reward empty state when room winners exist', (
tester,
) async {
await tester.pumpWidget(
const MaterialApp(
home: Scaffold(
body: RoomRocketRewardDialog(
rewards: <RoomRocketRewardItem>[],
winners: <RoomRocketRewardWinner>[
RoomRocketRewardWinner(nickname: 'test man'),
],
loadingText: '',
useMockFallback: false,
),
),
),
);
expect(find.text('No reward'), findsOneWidget);
expect(find.text('test man'), findsOneWidget);
});
});
}
SCRoomRocketRewardRecordRes _rewardRecord({