나머지 기능 화면들도 검정 AppBar를 둥근 제목 알약으로 통일

실시간 출석 현황과 같은 톤으로, 설정/교사 회원가입/관리자 시스템/
NFC 태그 쓰기·체크인/학생 통합 관리 센터/스마트기기 반출 신청·대장
화면의 검정 배경 AppBar를 투명 배경 + 가운데 둥근 제목 알약으로 교체.

출석 현황 화면과 달리 폰트 크기는 줄이지 않고 각 화면이 원래 쓰던
스타일(굵기 등)을 그대로 유지 - 공용 TitlePill 위젯이 스타일링된
Text를 그대로 감싸주기만 함.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-08 15:17:05 +09:00
co-authored by Claude Sonnet 5
parent d9ca4913d4
commit 527661b6e5
9 changed files with 108 additions and 36 deletions
+8 -3
View File
@@ -5,6 +5,7 @@ import '../function/admin_controller.dart';
import '../theme/app_palette.dart';
import 'app_notice.dart';
import 'login_screen.dart';
import 'title_pill.dart';
// ==========================================
// 🛠️ 5. 관리자 대시보드 (DB 초기화 암호 파라미터 보정 완료)
@@ -73,9 +74,13 @@ class _AdminDashboardState extends State<AdminDashboard> {
return Scaffold(
backgroundColor: AppPalette.mist,
appBar: AppBar(
title: const Text('관리자 시스템'),
backgroundColor: AppPalette.ink,
foregroundColor: AppPalette.paper,
backgroundColor: Colors.transparent,
foregroundColor: AppPalette.ink,
elevation: 0,
centerTitle: true,
title: const TitlePill(
child: Text('관리자 시스템', style: TextStyle(color: Colors.white)),
),
actions: [
IconButton(
icon: const Icon(Icons.logout),
+7 -3
View File
@@ -3,6 +3,7 @@
import 'package:flutter/material.dart';
import '../models/dashboard_tile_layout.dart';
import '../theme/app_palette.dart';
import 'title_pill.dart';
class DashboardSettingsPage extends StatelessWidget {
const DashboardSettingsPage({super.key});
@@ -12,10 +13,13 @@ class DashboardSettingsPage extends StatelessWidget {
return Scaffold(
backgroundColor: AppPalette.mist,
appBar: AppBar(
title: const Text('설정'),
backgroundColor: AppPalette.ink,
foregroundColor: AppPalette.paper,
backgroundColor: Colors.transparent,
foregroundColor: AppPalette.ink,
elevation: 0,
centerTitle: true,
title: const TitlePill(
child: Text('설정', style: TextStyle(color: Colors.white)),
),
),
body: ListView(
padding: const EdgeInsets.all(16),
+13 -6
View File
@@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
import '../function/device_checkout_ledger_controller.dart';
import '../theme/app_palette.dart';
import 'app_notice.dart';
import 'title_pill.dart';
class DeviceCheckoutLedgerPage extends StatefulWidget {
final String? teacherId;
@@ -89,13 +90,19 @@ class _DeviceCheckoutLedgerPageState extends State<DeviceCheckoutLedgerPage> {
return Scaffold(
backgroundColor: AppPalette.mist,
appBar: AppBar(
title: const Text(
'스마트기기 반출 대장',
style: TextStyle(fontWeight: FontWeight.bold),
),
backgroundColor: AppPalette.ink,
foregroundColor: Colors.white,
backgroundColor: Colors.transparent,
foregroundColor: AppPalette.ink,
elevation: 0,
centerTitle: true,
title: const TitlePill(
child: Text(
'스마트기기 반출 대장',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.white,
),
),
),
actions: [
IconButton(
icon: const Icon(Icons.refresh_rounded),
+13 -6
View File
@@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
import '../function/device_checkout_controller.dart';
import '../theme/app_palette.dart';
import 'app_notice.dart';
import 'title_pill.dart';
class DeviceCheckoutRequestScreen extends StatefulWidget {
final String studentId;
@@ -82,13 +83,19 @@ class _DeviceCheckoutRequestScreenState
return Scaffold(
backgroundColor: AppPalette.mist,
appBar: AppBar(
title: const Text(
'스마트기기 반출 신청',
style: TextStyle(fontWeight: FontWeight.bold),
),
backgroundColor: AppPalette.ink,
foregroundColor: Colors.white,
backgroundColor: Colors.transparent,
foregroundColor: AppPalette.ink,
elevation: 0,
centerTitle: true,
title: const TitlePill(
child: Text(
'스마트기기 반출 신청',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.white,
),
),
),
),
body: SingleChildScrollView(
padding: const EdgeInsets.all(24.0),
+13 -6
View File
@@ -5,7 +5,9 @@ import 'dart:io' show Platform;
import 'package:flutter/foundation.dart' show kIsWeb;
import 'package:flutter/material.dart';
import '../function/nfc_pocket_checkin_controller.dart';
import '../theme/app_palette.dart';
import 'app_notice.dart';
import 'title_pill.dart';
class NfcPocketCheckInScreen extends StatefulWidget {
final String studentId; // 로그인된 학생 학번 (예: "2061")
@@ -158,14 +160,19 @@ class _NfcPocketCheckInScreenState extends State<NfcPocketCheckInScreen> {
return Scaffold(
appBar: AppBar(
title: const Text(
"자습실 NFC 출석체크",
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
backgroundColor: Colors.transparent,
foregroundColor: AppPalette.ink,
elevation: 0,
centerTitle: true,
title: const TitlePill(
child: Text(
"자습실 NFC 출석체크",
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
),
),
),
backgroundColor: const Color.fromARGB(255, 48, 48, 52),
),
body: Center(
child: Padding(
+11 -3
View File
@@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
import '../function/nfc_tag_writer_controller.dart';
import '../theme/app_palette.dart';
import 'app_notice.dart';
import 'title_pill.dart';
class NfcTagWriterScreen extends StatefulWidget {
const NfcTagWriterScreen({super.key});
@@ -53,9 +54,16 @@ class _NfcTagWriterScreenState extends State<NfcTagWriterScreen> {
return Scaffold(
backgroundColor: AppPalette.mist,
appBar: AppBar(
title: const Text("NFC 주머니 태그 쓰기"),
backgroundColor: AppPalette.ink,
foregroundColor: AppPalette.paper,
backgroundColor: Colors.transparent,
foregroundColor: AppPalette.ink,
elevation: 0,
centerTitle: true,
title: const TitlePill(
child: Text(
"NFC 주머니 태그 쓰기",
style: TextStyle(color: Colors.white),
),
),
),
body: Padding(
padding: const EdgeInsets.all(24.0),
+8 -3
View File
@@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
import '../function/teacher_register_controller.dart';
import '../theme/app_palette.dart';
import 'app_notice.dart';
import 'title_pill.dart';
class TeacherRegisterScreen extends StatefulWidget {
const TeacherRegisterScreen({super.key});
@@ -61,9 +62,13 @@ class _TeacherRegisterScreenState extends State<TeacherRegisterScreen> {
return Scaffold(
backgroundColor: AppPalette.mist,
appBar: AppBar(
title: const Text('교사 회원가입'),
backgroundColor: AppPalette.ink,
foregroundColor: AppPalette.paper,
backgroundColor: Colors.transparent,
foregroundColor: AppPalette.ink,
elevation: 0,
centerTitle: true,
title: const TitlePill(
child: Text('교사 회원가입', style: TextStyle(color: Colors.white)),
),
),
body: SingleChildScrollView(
padding: const EdgeInsets.all(24.0),
+13 -6
View File
@@ -7,6 +7,7 @@ import '../function/excel_file_picker.dart';
import '../function/teacher_student_management_controller.dart';
import '../theme/app_palette.dart';
import 'app_notice.dart';
import 'title_pill.dart';
// 📐 "실시간 출석 확인" 목록(teacher_attendance_page.dart)의 타일 규격과 동일하게 맞춘다.
const double kAttendanceTileWidth = 220;
@@ -658,13 +659,19 @@ class _TeacherStudentManagementPageState
return Scaffold(
backgroundColor: AppPalette.mist,
appBar: AppBar(
title: const Text(
'학생 통합 관리 센터',
style: TextStyle(fontWeight: FontWeight.bold),
),
backgroundColor: AppPalette.ink,
foregroundColor: AppPalette.paper,
backgroundColor: Colors.transparent,
foregroundColor: AppPalette.ink,
elevation: 0,
centerTitle: true,
title: const TitlePill(
child: Text(
'학생 통합 관리 센터',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.white,
),
),
),
),
body: SingleChildScrollView(
padding: const EdgeInsets.all(24.0),
+22
View File
@@ -0,0 +1,22 @@
// 🪶 검정 AppBar 대신 쓰는 둥근 제목 알약. 실시간 출석 현황 화면과 톤을 맞추되,
// 크기는 줄이지 않고 각 화면이 원래 쓰던 폰트 스타일을 그대로 넘겨받는다.
import 'package:flutter/material.dart';
import '../theme/app_palette.dart';
class TitlePill extends StatelessWidget {
final Widget child;
const TitlePill({super.key, required this.child});
@override
Widget build(BuildContext context) {
return Container(
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10),
decoration: BoxDecoration(
color: AppPalette.ink,
borderRadius: BorderRadius.circular(999),
),
child: child,
);
}
}