From eb51a6f6eec3c6e440e4eba7353622910edff1f5 Mon Sep 17 00:00:00 2001 From: eld_master Date: Thu, 30 Jan 2025 01:34:46 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B0=9C=EC=A7=90=ED=98=84=EC=83=81=EB=93=A4?= =?UTF-8?q?=20=EC=A1=B0=EC=B9=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/dialogs/score_edit_dialog.dart | 16 +++-- lib/dialogs/survey_dialog.dart | 52 ++++++++++---- lib/dialogs/team_name_edit_dialog.dart | 4 +- lib/dialogs/user_info_private_dialog.dart | 69 +++++++++++-------- lib/dialogs/user_info_team_dialog.dart | 21 ++++-- lib/views/login/id_finding_page.dart | 8 ++- lib/views/login/pw_finding_page.dart | 6 +- lib/views/login/signup_page.dart | 55 ++++++++++++--- lib/views/room/finish_private_page.dart | 2 + lib/views/room/finish_team_page.dart | 1 + lib/views/room/main_page.dart | 2 +- lib/views/room/playing_private_page.dart | 1 + lib/views/room/playing_team_page.dart | 1 + lib/views/room/room_search_list_page.dart | 6 +- lib/views/room/waiting_room_private_page.dart | 5 ++ lib/views/room/waiting_room_team_page.dart | 2 + lib/views/user/my_page.dart | 4 +- 17 files changed, 178 insertions(+), 77 deletions(-) diff --git a/lib/dialogs/score_edit_dialog.dart b/lib/dialogs/score_edit_dialog.dart index a11ee19..3e46fd7 100644 --- a/lib/dialogs/score_edit_dialog.dart +++ b/lib/dialogs/score_edit_dialog.dart @@ -174,8 +174,8 @@ class _ScoreEditDialogState extends State { child: GridView.count( crossAxisCount: 2, mainAxisSpacing: 8, - crossAxisSpacing: 8, - childAspectRatio: 2.0, + crossAxisSpacing: 12, + childAspectRatio: 3.0, shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), children: [ @@ -222,14 +222,18 @@ class _ScoreEditDialogState extends State { Widget _buildDeltaButton(int delta) { final label = (delta >= 0) ? '+$delta' : '$delta'; - return ElevatedButton( - onPressed: () => _onDelta(delta), - style: ElevatedButton.styleFrom( + return SizedBox( + width: 50, + height: 30, + child: ElevatedButton( + onPressed: () => _onDelta(delta), + style: ElevatedButton.styleFrom( backgroundColor: Colors.white, foregroundColor: Colors.black, side: const BorderSide(color: Colors.black), ), - child: Text(label), + child: Text(label), + ), ); } } diff --git a/lib/dialogs/survey_dialog.dart b/lib/dialogs/survey_dialog.dart index a4eb00e..bc3bb2a 100644 --- a/lib/dialogs/survey_dialog.dart +++ b/lib/dialogs/survey_dialog.dart @@ -28,38 +28,60 @@ class _SurveyDialogState extends State { bool _todayNotSee = false; // "오늘 하루 보지 않기" 체크 여부 + // Scale factor for font size (폰트 크기 조절 스케일 인자) + double scaleFactor = 1.0; + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + _updateScaleFactor(); + } + + // Adjust font size by screen width (화면 크기에 따라 폰트 크기 조절) + void _updateScaleFactor() { + final screenWidth = MediaQuery.of(context).size.width; + const baseWidth = 400.0; + setState(() { + scaleFactor = (screenWidth / baseWidth).clamp(0.8, 1.4); + }); + } + @override Widget build(BuildContext context) { return AlertDialog( - title: const Text('Survey Participation Notice'), + title: Text('Survey Participation Notice', style: TextStyle(fontSize: 24 * scaleFactor)), // '설문 참여 안내' content: SingleChildScrollView( child: Column( mainAxisSize: MainAxisSize.min, children: [ - const Text( + Text( 'Hello, thank you for using the "ALLSCORE" app.\n\n' 'We have prepared a simple survey to provide better service.\n' 'Your participation will greatly help the app’s improvement!\n' - '(It takes about 1 minute.)' + '(It takes about 1 minute.)', // '안녕하세요, "올스코어" 앱을 이용해주셔서 감사합니다.\n\n' // '더 나은 서비스 제공을 위해 간단한 설문조사를 준비했습니다.\n' // '설문조사에 참여해주시면 앱 발전에 큰 도움이 됩니다!\n' // '(약 1분 소요)' + style: TextStyle(fontSize: 15 * scaleFactor), ), const SizedBox(height: 16), // "Today do not see again" checkbox ("오늘 하루 보지 않기" 체크박스) Row( children: [ - Checkbox( - value: _todayNotSee, - onChanged: (val) { - setState(() { - _todayNotSee = val ?? false; - }); - }, + Transform.scale( + scale: scaleFactor, + child: Checkbox( + value: _todayNotSee, + onChanged: (val) { + setState(() { + _todayNotSee = val ?? false; + }); + }, + ), ), - const Text('Do not show again today'), + Text('Do not show again today', style: TextStyle(fontSize: 12 * scaleFactor)), // '오늘 하루 보지 않기' ], ), @@ -80,10 +102,10 @@ class _SurveyDialogState extends State { Navigator.pop(context); // close popup (팝업 닫기) }, style: TextButton.styleFrom(backgroundColor: Colors.grey), - child: const Text( + child: Text( 'Close', // '닫기' - style: TextStyle(color: Colors.white), + style: TextStyle(color: Colors.white, fontSize: 12 * scaleFactor), ), ), // "Participate in Survey" button ("설문 참여" 버튼) @@ -103,10 +125,10 @@ class _SurveyDialogState extends State { ); }, style: TextButton.styleFrom(backgroundColor: Colors.black), - child: const Text( + child: Text( 'Participate in Survey', // '설문 참여' - style: TextStyle(color: Colors.white), + style: TextStyle(color: Colors.white, fontSize: 12 * scaleFactor), ), ), ], diff --git a/lib/dialogs/team_name_edit_dialog.dart b/lib/dialogs/team_name_edit_dialog.dart index ce0121e..83f6dd6 100644 --- a/lib/dialogs/team_name_edit_dialog.dart +++ b/lib/dialogs/team_name_edit_dialog.dart @@ -152,7 +152,7 @@ class _TeamNameEditModalState extends State { width: 80, child: ElevatedButton( onPressed: _onUpdateTeamName, - style: ElevatedButton.styleFrom(backgroundColor: Colors.black), + style: ElevatedButton.styleFrom(backgroundColor: Colors.black, padding: EdgeInsets.zero, minimumSize: Size(0, 30), tapTargetSize: MaterialTapTargetSize.shrinkWrap), child: const Text( 'Update' // '수정' @@ -165,7 +165,7 @@ class _TeamNameEditModalState extends State { width: 80, child: ElevatedButton( onPressed: () => Navigator.pop(context), - style: ElevatedButton.styleFrom(backgroundColor: Colors.black), + style: ElevatedButton.styleFrom(backgroundColor: Colors.black, padding: EdgeInsets.zero, minimumSize: Size(0, 30), tapTargetSize: MaterialTapTargetSize.shrinkWrap), child: const Text( 'Cancel' // '취소' diff --git a/lib/dialogs/user_info_private_dialog.dart b/lib/dialogs/user_info_private_dialog.dart index f09b6cc..b4c6bd0 100644 --- a/lib/dialogs/user_info_private_dialog.dart +++ b/lib/dialogs/user_info_private_dialog.dart @@ -234,11 +234,15 @@ class _UserInfoPrivateDialogState extends State { Text( userName, style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + overflow: TextOverflow.ellipsis, + maxLines: 1, ), const SizedBox(height: 6), Text( department, style: const TextStyle(fontSize: 14), + overflow: TextOverflow.ellipsis, + maxLines: 2, ), ], ), @@ -329,41 +333,50 @@ class _UserInfoPrivateDialogState extends State { mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ SizedBox( - width: scaleFactor==0.8 ? 50 : 90, + width: 80 * scaleFactor, + height: 40 * scaleFactor, child: ElevatedButton( onPressed: _onUpdateUserInfo, - style: ElevatedButton.styleFrom(backgroundColor: Colors.black), - child: AutoSizeText( - 'Update' - /* '수정' */, - maxLines: 1, - style: const TextStyle(color: Colors.white), + style: ElevatedButton.styleFrom(backgroundColor: Colors.black, padding: EdgeInsets.zero, minimumSize: Size(0, 30), tapTargetSize: MaterialTapTargetSize.shrinkWrap), + child: FittedBox( + fit: BoxFit.contain, + child: Text( + 'Update' + /* '수정' */, + style: TextStyle(color: Colors.white, fontSize: 12 * scaleFactor), + ), ), ), ), SizedBox( - width: scaleFactor==0.8 ? 50 : 90, + width: 80 * scaleFactor, + height: 40 * scaleFactor, child: ElevatedButton( onPressed: _onKickParticipant, - style: ElevatedButton.styleFrom(backgroundColor: Colors.black), - child: AutoSizeText( - 'Kick' - /* '추방' */, - maxLines: 1, - style: const TextStyle(color: Colors.white), + style: ElevatedButton.styleFrom(backgroundColor: Colors.black, padding: EdgeInsets.zero, minimumSize: Size(0, 30), tapTargetSize: MaterialTapTargetSize.shrinkWrap), + child: FittedBox( + fit: BoxFit.contain, + child: Text( + 'Kick' + /* '추방' */, + style: TextStyle(color: Colors.white, fontSize: 12 * scaleFactor), + ), ), ), ), SizedBox( - width: scaleFactor==0.8 ? 50 : 90, + width: 80 * scaleFactor, + height: 40 * scaleFactor, child: ElevatedButton( onPressed: () => Navigator.pop(context), - style: ElevatedButton.styleFrom(backgroundColor: Colors.black), - child: AutoSizeText( - 'OK' - /* '확인' */, - maxLines: 1, - style: const TextStyle(color: Colors.white), + style: ElevatedButton.styleFrom(backgroundColor: Colors.black, padding: EdgeInsets.zero, minimumSize: Size(0, 30), tapTargetSize: MaterialTapTargetSize.shrinkWrap), + child: FittedBox( + fit: BoxFit.contain, + child: Text( + 'OK' + /* '확인' */, + style: TextStyle(color: Colors.white, fontSize: 12 * scaleFactor), + ), ), ), ), @@ -372,12 +385,14 @@ class _UserInfoPrivateDialogState extends State { ] else ...[ ElevatedButton( onPressed: () => Navigator.pop(context), - style: ElevatedButton.styleFrom(backgroundColor: Colors.black), - child: AutoSizeText( - 'OK' - /* '확인' */, - maxLines: 1, - style: const TextStyle(color: Colors.white), + style: ElevatedButton.styleFrom(backgroundColor: Colors.black, padding: EdgeInsets.zero, minimumSize: Size(0, 30), tapTargetSize: MaterialTapTargetSize.shrinkWrap), + child: FittedBox( + fit: BoxFit.contain, + child: Text( + 'OK' + /* '확인' */, + style: TextStyle(color: Colors.white, fontSize: 12 * scaleFactor), + ), ), ), ], diff --git a/lib/dialogs/user_info_team_dialog.dart b/lib/dialogs/user_info_team_dialog.dart index 13a97e6..4f7227c 100644 --- a/lib/dialogs/user_info_team_dialog.dart +++ b/lib/dialogs/user_info_team_dialog.dart @@ -250,11 +250,15 @@ class _UserInfoTeamDialogState extends State { Text( userName, style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + overflow: TextOverflow.ellipsis, + maxLines: 1, ), const SizedBox(height: 6), Text( department, style: const TextStyle(fontSize: 14), + overflow: TextOverflow.ellipsis, + maxLines: 2, ), ], ), @@ -378,10 +382,11 @@ class _UserInfoTeamDialogState extends State { children: [ // "Update" (수정하기) SizedBox( - width: scaleFactor==0.8 ? 75 : 90, + width: 80 * scaleFactor, + height: 40 * scaleFactor, child: ElevatedButton( onPressed: _onUpdateUserInfo, - style: ElevatedButton.styleFrom(backgroundColor: Colors.black), + style: ElevatedButton.styleFrom(backgroundColor: Colors.black, padding: EdgeInsets.zero, minimumSize: Size(0, 30), tapTargetSize: MaterialTapTargetSize.shrinkWrap), child: AutoSizeText( 'Update' /* '수정' */, @@ -392,10 +397,11 @@ class _UserInfoTeamDialogState extends State { ), // "Kick" (추방하기) SizedBox( - width: scaleFactor==0.8 ? 75 : 90, + width: 80 * scaleFactor, + height: 40 * scaleFactor, child: ElevatedButton( onPressed: _onKickParticipant, - style: ElevatedButton.styleFrom(backgroundColor: Colors.black), + style: ElevatedButton.styleFrom(backgroundColor: Colors.black, padding: EdgeInsets.zero, minimumSize: Size(0, 30), tapTargetSize: MaterialTapTargetSize.shrinkWrap), child: AutoSizeText( 'Kick' /* '추방' */, @@ -406,10 +412,11 @@ class _UserInfoTeamDialogState extends State { ), // "OK" (확인) SizedBox( - width: scaleFactor==0.8 ? 75 : 90, + width: 80 * scaleFactor, + height: 40 * scaleFactor, child: ElevatedButton( onPressed: () => Navigator.pop(context), - style: ElevatedButton.styleFrom(backgroundColor: Colors.black), + style: ElevatedButton.styleFrom(backgroundColor: Colors.black, padding: EdgeInsets.zero, minimumSize: Size(0, 30), tapTargetSize: MaterialTapTargetSize.shrinkWrap), child: AutoSizeText( 'OK' /* '확인' */, @@ -424,7 +431,7 @@ class _UserInfoTeamDialogState extends State { // If not the master, only "OK" (일반 유저는 "확인"만) ElevatedButton( onPressed: () => Navigator.pop(context), - style: ElevatedButton.styleFrom(backgroundColor: Colors.black), + style: ElevatedButton.styleFrom(backgroundColor: Colors.black, padding: EdgeInsets.zero, minimumSize: Size(0, 30), tapTargetSize: MaterialTapTargetSize.shrinkWrap), child: AutoSizeText( 'OK' /* '확인' */, diff --git a/lib/views/login/id_finding_page.dart b/lib/views/login/id_finding_page.dart index b89408c..5da8860 100644 --- a/lib/views/login/id_finding_page.dart +++ b/lib/views/login/id_finding_page.dart @@ -194,10 +194,12 @@ class _IdFindingPageState extends State { return Scaffold( backgroundColor: Colors.white, appBar: AppBar( - title: const Text('ALL SCORE' - /* ALL SCORE */, - style: TextStyle(color: Colors.white)), + title: const Text('ALL SCORE', style: TextStyle(color: Colors.white)), backgroundColor: Colors.black, + leading: IconButton( + icon: const Icon(Icons.chevron_left, color: Colors.white), + onPressed: () => Navigator.pushAndRemoveUntil(context, MaterialPageRoute(builder: (_) => const LoginPage()), (route) => false), + ), ), body: Padding( padding: const EdgeInsets.all(16.0), diff --git a/lib/views/login/pw_finding_page.dart b/lib/views/login/pw_finding_page.dart index c1317ea..0917be0 100644 --- a/lib/views/login/pw_finding_page.dart +++ b/lib/views/login/pw_finding_page.dart @@ -119,8 +119,12 @@ class _PwFindingPageState extends State { return Scaffold( backgroundColor: Colors.white, appBar: AppBar( - title: const Text('ALL SCORE' /* ALL SCORE */, style: TextStyle(color: Colors.white)), + title: const Text('ALL SCORE', style: TextStyle(color: Colors.white)), backgroundColor: Colors.black, + leading: IconButton( + icon: const Icon(Icons.chevron_left, color: Colors.white), + onPressed: () => Navigator.pushAndRemoveUntil(context, MaterialPageRoute(builder: (_) => const LoginPage()), (route) => false), + ), ), body: Padding( padding: const EdgeInsets.all(16.0), diff --git a/lib/views/login/signup_page.dart b/lib/views/login/signup_page.dart index 892548f..cb2200c 100644 --- a/lib/views/login/signup_page.dart +++ b/lib/views/login/signup_page.dart @@ -24,6 +24,24 @@ class _SignUpPageState extends State { // 오류 메시지 (유효성 검사) String? _usernameError, _passwordError, _confirmPasswordError, _nicknameError, _emailError; + // Scale factor for font size (폰트 크기 조절 스케일 인자) + double scaleFactor = 1.0; + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + _updateScaleFactor(); + } + + // Adjust font size by screen width (화면 크기에 따라 폰트 크기 조절) + void _updateScaleFactor() { + final screenWidth = MediaQuery.of(context).size.width; + const baseWidth = 400.0; + setState(() { + scaleFactor = (screenWidth / baseWidth).clamp(0.8, 1.4); + }); + } + // 유효성 검사 (아이디, 비밀번호, 이메일, 닉네임) bool _isUsernameValid(String username) => RegExp(r'^(?![0-9])[A-Za-z0-9]{6,20}$').hasMatch(username); @@ -33,7 +51,7 @@ class _SignUpPageState extends State { bool _isEmailValid(String email) => RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$').hasMatch(email); bool _isNicknameValid(String nickname) => - RegExp(r'^[A-Za-z가-힣0-9]{2,20}$').hasMatch(nickname); + RegExp(r'^[A-Za-z가-힣0-9\s]{2,20}$').hasMatch(nickname); // label에 따른 입력값 검사 void _validateInput(String label) { @@ -41,7 +59,7 @@ class _SignUpPageState extends State { if (label == 'Username') { // '아이디' _usernameError = _isUsernameValid(_username) ? null - : 'Username must be 6–20 characters, letters and digits, and cannot start with a digit.'; + : 'Nickname must be 2–20 characters, letters and digits. Spaces are also allowed'; } else if (label == 'Password') { // '비밀번호' _passwordError = _isPasswordValidPattern(_password) ? null @@ -176,7 +194,7 @@ class _SignUpPageState extends State { backgroundColor: Colors.black, leading: IconButton( icon: const Icon(Icons.chevron_left, color: Colors.white), - onPressed: () => Navigator.pop(context), + onPressed: () => Navigator.pushAndRemoveUntil(context, MaterialPageRoute(builder: (_) => const LoginPage()), (route) => false), ), ), body: Padding( @@ -232,15 +250,30 @@ class _SignUpPageState extends State { // 동의 체크박스 Row( children: [ - Checkbox( - value: _isAgreed, - onChanged: (value) { - setState(() { - _isAgreed = value ?? false; - }); - }, + Transform.scale( + scale: scaleFactor, + child: Checkbox( + value: _isAgreed, + onChanged: (value) { + setState(() { + _isAgreed = value ?? false; + }); + }, + ), + ), + // Checkbox와 텍스트 사이 간격 + const SizedBox(width: 8), + + // Expanded로 Text 감싸기 + Expanded( + child: Text( + 'I agree to the collection and use of my personal information.', + style: const TextStyle(fontSize: 12), + maxLines: 2, + overflow: TextOverflow.ellipsis, + // softWrap: true, // 기본값이 true이므로 생략 가능 + ), ), - const Text('I agree to the collection and use of my personal information.'), ], ), const SizedBox(height: 16), diff --git a/lib/views/room/finish_private_page.dart b/lib/views/room/finish_private_page.dart index 36b0d17..2bc8f9f 100644 --- a/lib/views/room/finish_private_page.dart +++ b/lib/views/room/finish_private_page.dart @@ -223,6 +223,8 @@ class _FinishPrivatePageState extends State { child: Text( nickname, style: const TextStyle(fontSize: 14, fontWeight: FontWeight.bold), + overflow: TextOverflow.ellipsis, + maxLines: 1, ), ), Text('$score pt', // '$score 점' diff --git a/lib/views/room/finish_team_page.dart b/lib/views/room/finish_team_page.dart index f61c0f5..9427c94 100644 --- a/lib/views/room/finish_team_page.dart +++ b/lib/views/room/finish_team_page.dart @@ -280,6 +280,7 @@ class _FinishTeamPageState extends State { nickname, style: const TextStyle(fontSize: 11), overflow: TextOverflow.ellipsis, + maxLines: 1, ), ], ), diff --git a/lib/views/room/main_page.dart b/lib/views/room/main_page.dart index 1e28cf6..01ff7fa 100644 --- a/lib/views/room/main_page.dart +++ b/lib/views/room/main_page.dart @@ -277,7 +277,7 @@ class _MainPageState extends State { ), child: Text( label, - style: const TextStyle(color: Colors.black), + style: TextStyle(color: Colors.black, fontSize: 12 * scaleFactor), textAlign: TextAlign.center, ), ), diff --git a/lib/views/room/playing_private_page.dart b/lib/views/room/playing_private_page.dart index 18cd301..f3bac98 100644 --- a/lib/views/room/playing_private_page.dart +++ b/lib/views/room/playing_private_page.dart @@ -435,6 +435,7 @@ class _PlayingPrivatePageState extends State { nickname, style: TextStyle(fontSize: 11, color: hasExited ? Colors.redAccent : Colors.black), overflow: TextOverflow.ellipsis, + maxLines: 1, ), ], ), diff --git a/lib/views/room/playing_team_page.dart b/lib/views/room/playing_team_page.dart index 9070d66..b87dbab 100644 --- a/lib/views/room/playing_team_page.dart +++ b/lib/views/room/playing_team_page.dart @@ -628,6 +628,7 @@ class _PlayingTeamPageState extends State { color: hasExited ? Colors.redAccent : Colors.black, ), overflow: TextOverflow.ellipsis, + maxLines: 1, ), ], ), diff --git a/lib/views/room/room_search_list_page.dart b/lib/views/room/room_search_list_page.dart index 05930b9..c03a194 100644 --- a/lib/views/room/room_search_list_page.dart +++ b/lib/views/room/room_search_list_page.dart @@ -307,12 +307,14 @@ class _RoomSearchListPageState extends State { Text( roomTitle, style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + overflow: TextOverflow.ellipsis, + maxLines: 1, ), const SizedBox(height: 4), - Text('$nickname / $roomStatus / $openYn / $nowPeople/$maxPeople'), + Text('$nickname / $roomStatus / $openYn / $nowPeople/$maxPeople', overflow: TextOverflow.ellipsis, maxLines: 1), // ex) '유저 / 대기중 / 공개 / 3/10명' const SizedBox(height: 4), - Text(roomIntro, style: const TextStyle(fontSize: 12)), + Text(roomIntro, style: const TextStyle(fontSize: 12), overflow: TextOverflow.ellipsis, maxLines: 1), ], ), ), diff --git a/lib/views/room/waiting_room_private_page.dart b/lib/views/room/waiting_room_private_page.dart index 891bb34..bcfed03 100644 --- a/lib/views/room/waiting_room_private_page.dart +++ b/lib/views/room/waiting_room_private_page.dart @@ -415,6 +415,9 @@ class _WaitingRoomPrivatePageState extends State { backgroundColor: Colors.white, foregroundColor: Colors.black, side: const BorderSide(color: Colors.black, width: 1), + padding: EdgeInsets.zero, + minimumSize: Size(0, 30), + tapTargetSize: MaterialTapTargetSize.shrinkWrap, ); if (roomMasterYn == 'Y') { @@ -810,6 +813,8 @@ class _WaitingRoomPrivatePageState extends State { Text( displayName, style: const TextStyle(fontSize: 12, color: Colors.black), + overflow: TextOverflow.ellipsis, + maxLines: 1, ), ], ), diff --git a/lib/views/room/waiting_room_team_page.dart b/lib/views/room/waiting_room_team_page.dart index 7b563d5..bfc34da 100644 --- a/lib/views/room/waiting_room_team_page.dart +++ b/lib/views/room/waiting_room_team_page.dart @@ -961,6 +961,8 @@ class _WaitingRoomTeamPageState extends State { Text( displayName, style: const TextStyle(fontSize: 12, color: Colors.black), + overflow: TextOverflow.ellipsis, + maxLines: 1, ), ], ), diff --git a/lib/views/user/my_page.dart b/lib/views/user/my_page.dart index 2eca2dd..ce392dc 100644 --- a/lib/views/user/my_page.dart +++ b/lib/views/user/my_page.dart @@ -198,8 +198,8 @@ class _MyPageState extends State { user_nickname = newNickname; // 닉네임 패턴 검증 if (!_isNicknameValidPattern(user_nickname)) { - _nicknameError = 'Nickname must be 2-20 characters (letters, Korean, digits).'; - // '닉네임은 2~20자 (영문, 한글, 숫자)만 허용' + _nicknameError = 'Nickname must be 2-20 characters (letters, Korean, digits, spaces).'; + // '닉네임은 2~20자 (영문, 한글, 숫자, 공백)만 허용' } else { _nicknameError = null; }