하단 내비게이션 바 여백 · 인증 칩 · 위치 선택 지도 · 퀘스트 상세 값 정렬

This commit is contained in:
Sn-Kinos
2026-10-06 01:32:25 +09:00
parent d441170dd7
commit 807e446b8b
8 changed files with 263 additions and 96 deletions
+69 -45
View File
@@ -327,7 +327,10 @@ class _QuestDetailScreenState extends State<QuestDetailScreen> {
Align(
alignment: Alignment.centerLeft,
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 4),
padding: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 4,
),
decoration: BoxDecoration(
color: Colors.black.withValues(alpha: 0.3),
borderRadius: BorderRadius.circular(9999),
@@ -335,7 +338,11 @@ class _QuestDetailScreenState extends State<QuestDetailScreen> {
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
const Icon(Icons.music_note_rounded, size: 18, color: AppColors.onCosmic),
const Icon(
Icons.music_note_rounded,
size: 18,
color: AppColors.onCosmic,
),
const SizedBox(width: 12),
Flexible(
child: Text(
@@ -790,14 +797,15 @@ class _QuestDetailScreenState extends State<QuestDetailScreen> {
}
if (!mounted) return;
setState(() => _stage = QuestStage.inProgress);
final run = await Navigator.of(context, rootNavigator: true).push<ShakeJudge>(
MaterialPageRoute(
builder: (_) => MusicShakePlayScreen(
setup: setup,
shakes: widget.repository.shakeEvents(),
),
),
);
final run = await Navigator.of(context, rootNavigator: true)
.push<ShakeJudge>(
MaterialPageRoute(
builder: (_) => MusicShakePlayScreen(
setup: setup,
shakes: widget.repository.shakeEvents(),
),
),
);
if (!mounted) return;
if (run != null) widget.repository.recordShake(run);
setState(() {
@@ -864,9 +872,10 @@ class _QuestDetailScreenState extends State<QuestDetailScreen> {
Future<PlaceProof?> _placeProof(List<String> methods) async {
String? qr;
if (methods.contains('qr')) {
qr = await Navigator.of(context, rootNavigator: true).push<String>(
MaterialPageRoute(builder: (_) => const QrScanScreen()),
);
qr = await Navigator.of(
context,
rootNavigator: true,
).push<String>(MaterialPageRoute(builder: (_) => const QrScanScreen()));
if (qr == null) return null;
}
Uint8List? photo;
@@ -913,7 +922,8 @@ class _QuestDetailScreenState extends State<QuestDetailScreen> {
setState(() {
_busy = false;
// Music Shake 판정 미달(B-24 — 보상 0) — 판정표는 소진됐으니 다시 하게 시작 전으로.
if (detail.card.type == QuestType.musicShake) _stage = QuestStage.notStarted;
if (detail.card.type == QuestType.musicShake)
_stage = QuestStage.notStarted;
});
_fail(error);
// 타임어택 창 밖(E-QST-01) — 서버가 본 상태로 다시 읽어 마감 · 완료를 반영한다.
@@ -996,12 +1006,14 @@ class _QuestDetailScreenState extends State<QuestDetailScreen> {
Future<String?> _watchAd(QuestReward reward) async {
RewardedAdHandle? ad;
BackendException? failure;
final loading = widget.repository.loadRewardedAd(reward).then<void>(
(handle) => ad = handle,
onError: (Object error) => failure = error is BackendException
? error
: BackendException('E-AD-01', context.l10n.adLoadFailed),
);
final loading = widget.repository
.loadRewardedAd(reward)
.then<void>(
(handle) => ad = handle,
onError: (Object error) => failure = error is BackendException
? error
: BackendException('E-AD-01', context.l10n.adLoadFailed),
);
await _warp(QuestAdWarpScreen.before(until: loading));
final loaded = ad;
if (!mounted) {
@@ -1095,35 +1107,47 @@ class _Row extends StatelessWidget {
color: AppColors.cosmicSurfaceContainer,
borderRadius: BorderRadius.circular(24),
),
// Figma `264:48835` — 라벨은 왼쪽, 값(번개 포함)은 오른쪽 끝. 예전에는 라벨 Expanded 와 값 Flexible 이
// 폭을 반씩 나눠 값이 가운데 놓였다(10/6 실기기).
child: Row(
children: [
Expanded(
child: Text(
label,
style: const TextStyle(
fontSize: 14,
fontWeight: FontWeight.w500,
height: 20 / 14,
color: AppColors.onCosmicVariant,
),
Text(
label,
style: const TextStyle(
fontSize: 14,
fontWeight: FontWeight.w500,
height: 20 / 14,
color: AppColors.onCosmicVariant,
),
),
if (bolt) ...[
Image.asset('assets/figma/icon-bolt.png', width: 16, height: 16.7),
const SizedBox(width: 4),
],
// 마감 줄처럼 값이 길면 줄을 바꾼다 — 좁은 화면에서 넘치지 않게.
Flexible(
child: Text(
value,
textAlign: TextAlign.end,
style: const TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
height: 1.4,
letterSpacing: -0.4,
color: AppColors.onCosmic,
),
const SizedBox(width: 12),
Expanded(
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
if (bolt) ...[
Image.asset(
'assets/figma/icon-bolt.png',
width: 16,
height: 16.7,
),
const SizedBox(width: 4),
],
// 마감 줄처럼 값이 길면 줄을 바꾼다 — 좁은 화면에서 넘치지 않게.
Flexible(
child: Text(
value,
textAlign: TextAlign.end,
style: const TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
height: 1.4,
letterSpacing: -0.4,
color: AppColors.onCosmic,
),
),
),
],
),
),
],