yumi-flutter/lib/debug/room_rocket_dialog_preview.dart
roxy bd6d35ee1b 🚀 UI
2026-05-14 17:10:53 +08:00

161 lines
4.4 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:yumi/ui_kit/widgets/room/rocket/room_rocket_dialog.dart';
import 'package:yumi/ui_kit/widgets/room/rocket/room_rocket_note_dialog.dart';
import 'package:yumi/ui_kit/widgets/room/rocket/room_rocket_record_dialog.dart';
import 'package:yumi/ui_kit/widgets/room/rocket/room_rocket_reward_dialog.dart';
void main() {
runApp(const RoomRocketDialogPreviewApp());
}
class RoomRocketDialogPreviewApp extends StatelessWidget {
const RoomRocketDialogPreviewApp({super.key});
@override
Widget build(BuildContext context) {
return ScreenUtilInit(
designSize: const Size(375, 812),
minTextAdapt: true,
splitScreenMode: true,
builder:
(_, child) => MaterialApp(
debugShowCheckedModeBanner: false,
builder: FlutterSmartDialog.init(),
home: const _RoomRocketDialogPreviewPage(),
),
);
}
}
class _RoomRocketDialogPreviewPage extends StatefulWidget {
const _RoomRocketDialogPreviewPage();
@override
State<_RoomRocketDialogPreviewPage> createState() =>
_RoomRocketDialogPreviewPageState();
}
class _RoomRocketDialogPreviewPageState
extends State<_RoomRocketDialogPreviewPage> {
RoomRocketRewardItem? _selectedReward;
_PreviewDialog _dialog = _PreviewDialog.rocket;
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.black,
body: Stack(
fit: StackFit.expand,
children: [
const _RoomBackground(),
if (_dialog == _PreviewDialog.rocket)
RoomRocketDialog(
onRewardSelected:
(reward) => setState(() {
_selectedReward = reward;
_dialog = _PreviewDialog.reward;
}),
onOpenRecord:
() => setState(() => _dialog = _PreviewDialog.record),
onOpenNote: () => setState(() => _dialog = _PreviewDialog.note),
)
else if (_dialog == _PreviewDialog.reward)
RoomRocketRewardDialog(
selectedReward: _selectedReward,
onClose: _backToRocket,
)
else if (_dialog == _PreviewDialog.record)
RoomRocketRecordDialog(onClose: _backToRocket)
else
RoomRocketNoteDialog(onClose: _backToRocket),
],
),
);
}
void _backToRocket() {
setState(() {
_selectedReward = null;
_dialog = _PreviewDialog.rocket;
});
}
}
enum _PreviewDialog { rocket, reward, record, note }
class _RoomBackground extends StatelessWidget {
const _RoomBackground();
@override
Widget build(BuildContext context) {
return DecoratedBox(
decoration: const BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [Color(0xFF2A120E), Color(0xFF071917), Color(0xFF22140B)],
),
),
child: Stack(
children: [
Positioned(
left: 20.w,
top: 48.w,
child: _PreviewLine(width: 104.w, opacity: 0.42),
),
for (var index = 0; index < 8; index++)
Positioned(
left: (40 + (index % 4) * 72).w,
top: (146 + (index ~/ 4) * 84).w,
child: const _PreviewSeat(),
),
Positioned(
left: 0,
right: 0,
bottom: 118.w,
child: _PreviewLine(width: 330.w, opacity: 0.28),
),
],
),
);
}
}
class _PreviewSeat extends StatelessWidget {
const _PreviewSeat();
@override
Widget build(BuildContext context) {
return DecoratedBox(
decoration: BoxDecoration(
shape: BoxShape.circle,
border: Border.all(
color: const Color(0xFFFFCE7C).withValues(alpha: 0.32),
width: 2.w,
),
),
child: SizedBox(width: 44.w, height: 44.w),
);
}
}
class _PreviewLine extends StatelessWidget {
const _PreviewLine({required this.width, required this.opacity});
final double width;
final double opacity;
@override
Widget build(BuildContext context) {
return Center(
child: Container(
width: width,
height: 1.w,
color: Colors.white.withValues(alpha: opacity),
),
);
}
}