LCOV - code coverage report
Current view: top level - lib/screens/auth - register_screen.dart Coverage Total Hit
Test: lcov.info Lines: 1.3 % 76 1
Test Date: 2025-08-12 03:21:51 Functions: - 0 0

            Line data    Source code
       1              : import 'package:flutter/material.dart';
       2              : import 'package:provider/provider.dart';
       3              : import '../../services/auth_service.dart';
       4              : 
       5              : class RegisterScreen extends StatefulWidget {
       6           24 :   const RegisterScreen({super.key});
       7              : 
       8            0 :   @override
       9            0 :   State<RegisterScreen> createState() => _RegisterScreenState();
      10              : }
      11              : 
      12              : class _RegisterScreenState extends State<RegisterScreen> {
      13              :   final _formKey = GlobalKey<FormState>();
      14              :   final _nameController = TextEditingController();
      15              :   final _emailController = TextEditingController();
      16              :   final _passwordController = TextEditingController();
      17              :   final _confirmPasswordController = TextEditingController();
      18              :   bool _isPasswordVisible = false;
      19              :   bool _isConfirmPasswordVisible = false;
      20              : 
      21            0 :   @override
      22              :   void dispose() {
      23            0 :     _nameController.dispose();
      24            0 :     _emailController.dispose();
      25            0 :     _passwordController.dispose();
      26            0 :     _confirmPasswordController.dispose();
      27            0 :     super.dispose();
      28              :   }
      29              : 
      30              :   // 회원가입 처리 함수
      31            0 :   Future<void> _register() async {
      32            0 :     if (_formKey.currentState!.validate()) {
      33            0 :       final authService = Provider.of<AuthService>(context, listen: false);
      34            0 :       final success = await authService.register(
      35            0 :         _nameController.text.trim(),
      36            0 :         _emailController.text.trim(),
      37            0 :         _passwordController.text,
      38              :       );
      39              : 
      40            0 :       if (success && mounted) {
      41            0 :         ScaffoldMessenger.of(context).showSnackBar(
      42              :           const SnackBar(
      43              :             content: Text('회원가입이 완료되었습니다. 로그인해주세요.'),
      44              :             backgroundColor: Colors.green,
      45              :           ),
      46              :         );
      47            0 :         Navigator.pop(context); // 로그인 화면으로 돌아가기
      48            0 :       } else if (mounted) {
      49            0 :         ScaffoldMessenger.of(context).showSnackBar(
      50              :           const SnackBar(
      51              :             content: Text('회원가입에 실패했습니다. 다시 시도해주세요.'),
      52              :             backgroundColor: Colors.red,
      53              :           ),
      54              :         );
      55              :       }
      56              :     }
      57              :   }
      58              : 
      59            0 :   @override
      60              :   Widget build(BuildContext context) {
      61            0 :     final authService = Provider.of<AuthService>(context);
      62              : 
      63            0 :     return Scaffold(
      64            0 :       appBar: AppBar(
      65              :         title: const Text('회원가입'),
      66              :       ),
      67            0 :       body: SafeArea(
      68            0 :         child: Center(
      69            0 :           child: SingleChildScrollView(
      70              :             padding: const EdgeInsets.all(24.0),
      71            0 :             child: Form(
      72            0 :               key: _formKey,
      73            0 :               child: Column(
      74              :                 mainAxisAlignment: MainAxisAlignment.center,
      75              :                 crossAxisAlignment: CrossAxisAlignment.stretch,
      76            0 :                 children: [
      77              :                   // 이름 입력 필드
      78            0 :                   TextFormField(
      79            0 :                     controller: _nameController,
      80              :                     decoration: const InputDecoration(
      81              :                       labelText: '이름',
      82              :                       prefixIcon: Icon(Icons.person),
      83              :                       border: OutlineInputBorder(),
      84              :                     ),
      85            0 :                     validator: (value) {
      86            0 :                       if (value == null || value.isEmpty) {
      87              :                         return '이름을 입력해주세요';
      88              :                       }
      89              :                       return null;
      90              :                     },
      91              :                   ),
      92              :                   const SizedBox(height: 16),
      93              : 
      94              :                   // 이메일 입력 필드
      95            0 :                   TextFormField(
      96            0 :                     controller: _emailController,
      97              :                     keyboardType: TextInputType.emailAddress,
      98              :                     decoration: const InputDecoration(
      99              :                       labelText: '이메일',
     100              :                       prefixIcon: Icon(Icons.email),
     101              :                       border: OutlineInputBorder(),
     102              :                     ),
     103            0 :                     validator: (value) {
     104            0 :                       if (value == null || value.isEmpty) {
     105              :                         return '이메일을 입력해주세요';
     106              :                       }
     107            0 :                       if (!RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$').hasMatch(value)) {
     108              :                         return '유효한 이메일 주소를 입력해주세요';
     109              :                       }
     110              :                       return null;
     111              :                     },
     112              :                   ),
     113              :                   const SizedBox(height: 16),
     114              : 
     115              :                   // 비밀번호 입력 필드
     116            0 :                   TextFormField(
     117            0 :                     controller: _passwordController,
     118            0 :                     obscureText: !_isPasswordVisible,
     119            0 :                     decoration: InputDecoration(
     120              :                       labelText: '비밀번호',
     121              :                       prefixIcon: const Icon(Icons.lock),
     122              :                       border: const OutlineInputBorder(),
     123            0 :                       suffixIcon: IconButton(
     124            0 :                         icon: Icon(
     125            0 :                           _isPasswordVisible ? Icons.visibility : Icons.visibility_off,
     126              :                         ),
     127            0 :                         onPressed: () {
     128            0 :                           setState(() {
     129            0 :                             _isPasswordVisible = !_isPasswordVisible;
     130              :                           });
     131              :                         },
     132              :                       ),
     133              :                     ),
     134            0 :                     validator: (value) {
     135            0 :                       if (value == null || value.isEmpty) {
     136              :                         return '비밀번호를 입력해주세요';
     137              :                       }
     138            0 :                       if (value.length < 6) {
     139              :                         return '비밀번호는 6자 이상이어야 합니다';
     140              :                       }
     141              :                       return null;
     142              :                     },
     143              :                   ),
     144              :                   const SizedBox(height: 16),
     145              : 
     146              :                   // 비밀번호 확인 입력 필드
     147            0 :                   TextFormField(
     148            0 :                     controller: _confirmPasswordController,
     149            0 :                     obscureText: !_isConfirmPasswordVisible,
     150            0 :                     decoration: InputDecoration(
     151              :                       labelText: '비밀번호 확인',
     152              :                       prefixIcon: const Icon(Icons.lock_outline),
     153              :                       border: const OutlineInputBorder(),
     154            0 :                       suffixIcon: IconButton(
     155            0 :                         icon: Icon(
     156            0 :                           _isConfirmPasswordVisible ? Icons.visibility : Icons.visibility_off,
     157              :                         ),
     158            0 :                         onPressed: () {
     159            0 :                           setState(() {
     160            0 :                             _isConfirmPasswordVisible = !_isConfirmPasswordVisible;
     161              :                           });
     162              :                         },
     163              :                       ),
     164              :                     ),
     165            0 :                     validator: (value) {
     166            0 :                       if (value == null || value.isEmpty) {
     167              :                         return '비밀번호를 다시 입력해주세요';
     168              :                       }
     169            0 :                       if (value != _passwordController.text) {
     170              :                         return '비밀번호가 일치하지 않습니다';
     171              :                       }
     172              :                       return null;
     173              :                     },
     174              :                   ),
     175              :                   const SizedBox(height: 24),
     176              : 
     177              :                   // 회원가입 버튼
     178            0 :                   ElevatedButton(
     179            0 :                     onPressed: authService.isLoading ? null : _register,
     180            0 :                     style: ElevatedButton.styleFrom(
     181              :                       padding: const EdgeInsets.symmetric(vertical: 16),
     182              :                       backgroundColor: Colors.blue,
     183              :                       foregroundColor: Colors.white,
     184              :                     ),
     185            0 :                     child: authService.isLoading
     186              :                         ? const SizedBox(
     187              :                             width: 20,
     188              :                             height: 20,
     189              :                             child: CircularProgressIndicator(
     190              :                               strokeWidth: 2,
     191              :                               color: Colors.white,
     192              :                             ),
     193              :                           )
     194              :                         : const Text(
     195              :                             '회원가입',
     196              :                             style: TextStyle(fontSize: 16),
     197              :                           ),
     198              :                   ),
     199              :                   const SizedBox(height: 16),
     200              : 
     201              :                   // 로그인 화면으로 돌아가기
     202            0 :                   Row(
     203              :                     mainAxisAlignment: MainAxisAlignment.center,
     204            0 :                     children: [
     205              :                       const Text('이미 계정이 있으신가요?'),
     206            0 :                       TextButton(
     207            0 :                         onPressed: () {
     208            0 :                           Navigator.pop(context); // 로그인 화면으로 돌아가기
     209              :                         },
     210              :                         child: const Text('로그인'),
     211              :                       ),
     212              :                     ],
     213              :                   ),
     214              :                 ],
     215              :               ),
     216              :             ),
     217              :           ),
     218              :         ),
     219              :       ),
     220              :     );
     221              :   }
     222              : }
        

Generated by: LCOV version 2.3.1-1