161 lines
4.4 KiB
Dart
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),
|
|
),
|
|
);
|
|
}
|
|
}
|