하단 내비게이션 바 여백 · 인증 칩 · 위치 선택 지도 · 퀘스트 상세 값 정렬
This commit is contained in:
@@ -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,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
|
||||
Reference in New Issue
Block a user