diff --git a/analysis_options.yaml b/analysis_options.yaml index 1374fca..b87994c 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,6 +1,17 @@ +include: package:flutter_lints/flutter.yaml + analyzer: exclude: - "**/*.g.dart" - "**/*.freezed.dart" + errors: - invalid_annotation_target: ignore \ No newline at end of file + invalid_annotation_target: ignore + prefer_const_declarations: error + prefer_const_constructors: error + missing_required_param: error + +linter: + rules: + library_private_types_in_public_api: false + no_leading_underscores_for_local_identifiers: false diff --git a/lib/core/config/di/dependencies.dart b/lib/core/config/di/dependencies.dart index fbc7ff4..26a45b2 100644 --- a/lib/core/config/di/dependencies.dart +++ b/lib/core/config/di/dependencies.dart @@ -3,18 +3,22 @@ import 'package:cookie_jar/cookie_jar.dart'; import 'package:dio/dio.dart'; import 'package:get_it/get_it.dart'; import 'package:jusicool_ios/core/network/api/api_client.dart'; -import 'package:jusicool_ios/data/user/service/user_api.dart'; +import 'package:jusicool_ios/core/network/interceptor/cookie_interceptor.dart'; +import 'package:jusicool_ios/data/account/data_sources/account_data_source.dart'; +import 'package:jusicool_ios/data/account/data_sources/account_data_source_impl.dart'; +import 'package:jusicool_ios/data/account/service/account_api.dart'; import 'package:jusicool_ios/data/user/data_sources/user_data_source.dart'; +import 'package:jusicool_ios/data/user/data_sources/user_data_source_impl.dart'; +import 'package:jusicool_ios/data/user/repositories/user_repository_impl.dart'; +import 'package:jusicool_ios/data/user/service/neis_api.dart'; +import 'package:jusicool_ios/data/user/service/user_api.dart'; import 'package:jusicool_ios/domain/sign_in/repositories/sign_in_repository.dart'; import 'package:jusicool_ios/domain/sign_in/usecase/sign_in_usecase.dart'; import 'package:jusicool_ios/domain/sign_in/usecase/sign_in_usecase_impl.dart'; import 'package:jusicool_ios/domain/sign_up/repositories/sign_up_repository.dart'; import 'package:jusicool_ios/domain/sign_up/usecase/sign_up_usecase.dart'; import 'package:jusicool_ios/domain/sign_up/usecase/sign_up_usecase_impl.dart'; -import '../../../data/user/data_sources/user_data_source_impl.dart'; -import '../../../data/user/repositories/user_repository_impl.dart'; -import '../../../data/user/service/neis_api.dart'; -import '../../network/interceptor/cookie_interceptor.dart'; + final di = GetIt.instance; @@ -35,9 +39,10 @@ void _setApi() { di.registerLazySingleton( () => NeisApi(di.get(instanceName: 'neis')), ); + di.registerLazySingleton(() => AccountApi(di.get())); log('✅ :: API DI 성공'); } catch (e) { - log("⛔ :: API DI 실패 \n$e"); + log('⛔ :: API DI 실패 \n$e'); } } @@ -46,6 +51,9 @@ void _setDataSources() { di.registerLazySingleton( () => UserDataSourceImpl(di.get(), di.get()), ); + di.registerLazySingleton( + () => AccountDataSourceImpl(di.get()), + ); log('✅ :: DataSources DI 성공'); } catch (e) { log("⛔ :: DataSources DI 실패 \n$e"); diff --git a/lib/core/config/router/router.dart b/lib/core/config/router/router.dart index f0c4ab8..d50ac9d 100644 --- a/lib/core/config/router/router.dart +++ b/lib/core/config/router/router.dart @@ -1,16 +1,17 @@ import 'package:go_router/go_router.dart'; +import 'package:jusicool_ios/main.dart'; +import 'package:jusicool_ios/presentation/community/screens/community_post_list_screen.dart'; import 'package:jusicool_ios/presentation/my_capital/screens/maincapital_screen.dart'; -import 'package:jusicool_ios/presentation/my_capital/screens/revenue_screens/monthlyrevenue_screen.dart'; -import 'package:jusicool_ios/presentation/my_capital/screens/order_screens/order_detail_screen.dart'; import 'package:jusicool_ios/presentation/my_capital/screens/my_assets_screen.dart'; +import 'package:jusicool_ios/presentation/my_capital/screens/order_screens/order_detail_screen.dart'; +import 'package:jusicool_ios/presentation/my_capital/screens/revenue_screens/monthlyrevenue_screen.dart'; import 'package:jusicool_ios/presentation/sign_in/screens/login_screen.dart'; import 'package:jusicool_ios/presentation/sign_up/screens/email_auth_screen.dart'; import 'package:jusicool_ios/presentation/sign_up/screens/find_school_screen.dart'; import 'package:jusicool_ios/presentation/sign_up/screens/name_input_screen.dart'; import 'package:jusicool_ios/presentation/sign_up/screens/password_create_screen.dart'; import 'package:jusicool_ios/presentation/splash/screens/splash_screen.dart'; -import 'package:jusicool_ios/presentation/community/screens/community_post_list_screen.dart'; -import '../../../main.dart'; + class RoutePaths { static const String splash = '/splash'; @@ -56,15 +57,15 @@ class AppRouter { ), GoRoute( path: RoutePaths.emailAuth, - builder: (context, state) => EmailAuthScreen(), + builder: (context, state) => const EmailAuthScreen(), ), GoRoute( path: RoutePaths.passwordCreate, - builder: (context, state) => PasswordCreateScreen(), + builder: (context, state) => const PasswordCreateScreen(), ), GoRoute( path: RoutePaths.findSchool, - builder: (context, state) => FindSchoolScreen(), + builder: (context, state) => const FindSchoolScreen(), ), GoRoute( path: RoutePaths.mainCapital, diff --git a/lib/core/config/widget/menu_bottom.dart b/lib/core/config/widget/menu_bottom.dart index 8fab20b..f501153 100644 --- a/lib/core/config/widget/menu_bottom.dart +++ b/lib/core/config/widget/menu_bottom.dart @@ -4,10 +4,10 @@ import 'package:jusicool_design_system/jusicool_design_system.dart'; import 'package:jusicool_ios/presentation/my_capital/screens/maincapital_screen.dart'; class ScreenConfig { + ScreenConfig({required this.title, required this.widget}); + final String title; final Widget widget; - - ScreenConfig({required this.title, required this.widget}); } class ScreenList { @@ -37,11 +37,6 @@ class ScreenList { } class NavBarItem extends StatelessWidget { - final String iconName; - final String label; - final bool isSelected; - final VoidCallback onTap; - const NavBarItem({ super.key, required this.iconName, @@ -50,6 +45,11 @@ class NavBarItem extends StatelessWidget { required this.onTap, }); + final String iconName; + final String label; + final bool isSelected; + final VoidCallback onTap; + Widget _buildIcon() { final color = isSelected ? JusicoolColor.main : JusicoolColor.gray400; @@ -141,7 +141,7 @@ class _MenuBottomState extends State { Positioned( left: 42.w, top: 9.h, - child: Container( + child: SizedBox( width: 277.w, child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, diff --git a/lib/core/network/api/api_client.dart b/lib/core/network/api/api_client.dart index 170a641..8d175fe 100644 --- a/lib/core/network/api/api_client.dart +++ b/lib/core/network/api/api_client.dart @@ -5,9 +5,9 @@ import 'package:dio_cookie_manager/dio_cookie_manager.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:get_it/get_it.dart'; +import 'package:jusicool_ios/core/network/interceptor/dio_error_interceptor.dart'; import 'package:jusicool_ios/core/network/interceptor/dio_request_interceptor.dart'; import 'package:pretty_dio_logger/pretty_dio_logger.dart'; -import '../interceptor/dio_error_interceptor.dart'; Dio dio() { String? _baseUrlDev = dotenv.env['BASE_URL_DEV']; @@ -28,8 +28,8 @@ Dio dio() { 'Content-Type': 'application/json', 'Accept': 'application/json', }, - connectTimeout: Duration(seconds: 30), - receiveTimeout: Duration(seconds: 30), + connectTimeout: const Duration(seconds: 30), + receiveTimeout: const Duration(seconds: 30), ), ); @@ -58,8 +58,8 @@ Dio neis() { Dio dio = Dio( BaseOptions( baseUrl: 'https://open.neis.go.kr/hub/schoolInfo', - connectTimeout: Duration(seconds: 30), - receiveTimeout: Duration(seconds: 30), + connectTimeout: const Duration(seconds: 30), + receiveTimeout: const Duration(seconds: 30), queryParameters: {'KEY': _neisApiKey ?? '', 'Type': 'json'}, ), ); diff --git a/lib/core/network/interceptor/dio_error_interceptor.dart b/lib/core/network/interceptor/dio_error_interceptor.dart index aa20744..cceb91c 100644 --- a/lib/core/network/interceptor/dio_error_interceptor.dart +++ b/lib/core/network/interceptor/dio_error_interceptor.dart @@ -1,49 +1,50 @@ +import 'dart:developer'; import 'package:dio/dio.dart'; class DioErrorInterceptor extends InterceptorsWrapper { @override void onError(DioException err, ErrorInterceptorHandler handler) { - print('⛔ DIO 에러 :: ${err.type}'); + log('⛔ DIO 에러 :: ${err.type}'); switch (err.type) { case DioExceptionType.connectionTimeout: - print('⏳ 연결 시간 초과'); + log('⏳ 연결 시간 초과'); break; case DioExceptionType.sendTimeout: - print('⏳ 전송 시간 초과'); + log('⏳ 전송 시간 초과'); break; case DioExceptionType.receiveTimeout: - print('⏳ 수신 시간 초과'); + log('⏳ 수신 시간 초과'); break; case DioExceptionType.badResponse: switch (err.response?.statusCode) { case 400: - print('🚫 잘못된 요청: ${err.response?.data}'); + log('🚫 잘못된 요청: ${err.response?.data}'); break; case 401: - print('🚫 인증 실패: ${err.response?.data}'); + log('🚫 인증 실패: ${err.response?.data}'); break; case 403: - print('🚫 권한 없음: ${err.response?.data}'); + log('🚫 권한 없음: ${err.response?.data}'); break; case 404: - print('🚫 리소스 없음: ${err.response?.data}'); + log('🚫 리소스 없음: ${err.response?.data}'); break; case 500: - print('🚫 서버 오류: ${err.response?.data}'); + log('🚫 서버 오류: ${err.response?.data}'); break; default: - print('🚫 기타 오류: ${err.response?.data}'); + log('🚫 기타 오류: ${err.response?.data}'); break; } case DioExceptionType.cancel: - print('❌ 요청 취소됨'); + log('❌ 요청 취소됨'); break; case DioExceptionType.connectionError: - print('🚫 인터넷 연결 오류: ${err.message}'); + log('🚫 인터넷 연결 오류: ${err.message}'); break; case DioExceptionType.unknown: default: - print('❓ 알 수 없는 에러: ${err.message}'); + log('❓ 알 수 없는 에러: ${err.message}'); } handler.next(err); } diff --git a/lib/core/network/interceptor/dio_request_interceptor.dart b/lib/core/network/interceptor/dio_request_interceptor.dart index 6683c5b..fc5516a 100644 --- a/lib/core/network/interceptor/dio_request_interceptor.dart +++ b/lib/core/network/interceptor/dio_request_interceptor.dart @@ -1,13 +1,13 @@ import 'dart:convert'; - +import 'dart:developer'; import 'package:dio/dio.dart'; class DioRequestInterceptor extends InterceptorsWrapper { @override void onRequest(RequestOptions options, RequestInterceptorHandler handler) { - print("╔ Body"); - print("║ ${jsonEncode(options.data)}"); - print("╚${'═' * 90}╝"); + log("╔ Body"); + log("║ ${jsonEncode(options.data)}"); + log("╚${'═' * 90}╝"); super.onRequest(options, handler); } } diff --git a/lib/data/account/data_sources/account_data_source.dart b/lib/data/account/data_sources/account_data_source.dart new file mode 100644 index 0000000..6f45ef2 --- /dev/null +++ b/lib/data/account/data_sources/account_data_source.dart @@ -0,0 +1,6 @@ + +import 'package:jusicool_ios/data/account/dto/remote/response/my_account_response_dto.dart'; + +abstract class AccountDataSource { + Future getMyAccount(); +} diff --git a/lib/data/account/data_sources/account_data_source_impl.dart b/lib/data/account/data_sources/account_data_source_impl.dart new file mode 100644 index 0000000..3c173ed --- /dev/null +++ b/lib/data/account/data_sources/account_data_source_impl.dart @@ -0,0 +1,14 @@ +import 'package:jusicool_ios/data/account/data_sources/account_data_source.dart'; +import 'package:jusicool_ios/data/account/dto/remote/response/my_account_response_dto.dart'; +import '../service/account_api.dart'; + +class AccountDataSourceImpl extends AccountDataSource { + final AccountApi _accountApi; + + AccountDataSourceImpl(this._accountApi); + + @override + Future getMyAccount() async { + return await _accountApi.getMyAccount(); + } +} diff --git a/lib/data/account/dto/local/request/.gitkeep b/lib/data/account/dto/local/request/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/lib/data/account/dto/local/response/.gitkeep b/lib/data/account/dto/local/response/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/lib/data/account/dto/remote/request/.gitkeep b/lib/data/account/dto/remote/request/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/lib/data/account/dto/remote/response/my_account_response_dto.dart b/lib/data/account/dto/remote/response/my_account_response_dto.dart new file mode 100644 index 0000000..b027466 --- /dev/null +++ b/lib/data/account/dto/remote/response/my_account_response_dto.dart @@ -0,0 +1,17 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'my_account_response_dto.freezed.dart'; + +part 'my_account_response_dto.g.dart'; + +@freezed +abstract class MyAccountResponseDto with _$MyAccountResponseDto { + const factory MyAccountResponseDto({ + required int id, + @JsonKey(name: 'krw_balance') required int krwBalance, + @JsonKey(name: 'usd_balance') required double usdBalance, + }) = _MyAccountResponseDto; + + factory MyAccountResponseDto.fromJson(Map json) => + _$MyAccountResponseDtoFromJson(json); +} diff --git a/lib/data/account/service/account_api.dart b/lib/data/account/service/account_api.dart new file mode 100644 index 0000000..3b42c62 --- /dev/null +++ b/lib/data/account/service/account_api.dart @@ -0,0 +1,14 @@ +import 'package:dio/dio.dart'; +import 'package:jusicool_ios/data/account/dto/remote/response/my_account_response_dto.dart'; +import 'package:retrofit/error_logger.dart'; +import 'package:retrofit/http.dart'; + +part 'account_api.g.dart'; + +@RestApi() +abstract class AccountApi { + factory AccountApi(Dio dio, {String baseUrl}) = _AccountApi; + + @GET('/account/my') + Future getMyAccount(); +} diff --git a/lib/data/user/mappers/remote/request/sign_up_verify_email_request_mapper.dart b/lib/data/user/mappers/remote/request/sign_up_verify_email_request_mapper.dart index 8231896..bf6685e 100644 --- a/lib/data/user/mappers/remote/request/sign_up_verify_email_request_mapper.dart +++ b/lib/data/user/mappers/remote/request/sign_up_verify_email_request_mapper.dart @@ -1,6 +1,5 @@ import 'package:jusicool_ios/data/user/dto/remote/request/sign_up_verify_email_request_dto.dart'; - -import '../../../../../domain/sign_up/entity/sign_up_email_entity.dart'; +import 'package:jusicool_ios/domain/sign_up/entity/sign_up_email_entity.dart'; class SignUpVerifyEmailRequestMapper { static SignUpVerifyEmailRequestDto toDto(SignUpEmailEntity entity) => diff --git a/lib/data/user/repositories/user_repository_impl.dart b/lib/data/user/repositories/user_repository_impl.dart index 8368023..c2d80ff 100644 --- a/lib/data/user/repositories/user_repository_impl.dart +++ b/lib/data/user/repositories/user_repository_impl.dart @@ -2,9 +2,11 @@ import 'package:jusicool_ios/data/user/data_sources/user_data_source.dart'; import 'package:jusicool_ios/data/user/dto/remote/request/sign_in_request_dto.dart'; import 'package:jusicool_ios/data/user/dto/remote/request/sign_up_request_dto.dart'; import 'package:jusicool_ios/data/user/dto/remote/request/sign_up_search_school_request_dto.dart'; +import 'package:jusicool_ios/data/user/dto/remote/request/sign_up_send_email_request_dto.dart'; import 'package:jusicool_ios/data/user/dto/remote/request/sign_up_verify_email_request_dto.dart'; import 'package:jusicool_ios/data/user/mappers/remote/request/sign_in_request_mapper.dart'; import 'package:jusicool_ios/data/user/mappers/remote/request/sign_up_request_mapper.dart'; +import 'package:jusicool_ios/data/user/mappers/remote/request/sign_up_search_school_request_mapper.dart'; import 'package:jusicool_ios/data/user/mappers/remote/request/sign_up_send_email_request_mapper.dart'; import 'package:jusicool_ios/data/user/mappers/remote/request/sign_up_verify_email_request_mapper.dart'; import 'package:jusicool_ios/data/user/mappers/remote/response/sign_up_search_school_response_mapper.dart'; @@ -14,8 +16,6 @@ import 'package:jusicool_ios/domain/sign_up/entity/sign_up_email_entity.dart'; import 'package:jusicool_ios/domain/sign_up/entity/sign_up_entity.dart'; import 'package:jusicool_ios/domain/sign_up/entity/sign_up_search_school_entity.dart'; import 'package:jusicool_ios/domain/sign_up/repositories/sign_up_repository.dart'; -import '../dto/remote/request/sign_up_send_email_request_dto.dart'; -import '../mappers/remote/request/sign_up_search_school_request_mapper.dart'; class UserRepositoryImpl implements SignInRepository, SignUpRepository { final UserDataSource _userDataSource; diff --git a/lib/main.dart b/lib/main.dart index dbe5db4..7222dbc 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,7 +3,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:jusicool_design_system/src/core/theme/colors/color_palette.dart'; +import 'package:jusicool_design_system/jusicool_design_system.dart'; import 'package:jusicool_ios/core/config/di/dependencies.dart'; import 'core/config/router/router.dart'; import 'core/config/theme/app_theme.dart'; @@ -26,7 +26,7 @@ void main() async { ), ); - runApp(ProviderScope(child: const MyApp())); + runApp(const ProviderScope(child: MyApp())); } class MyApp extends StatelessWidget { diff --git a/lib/presentation/community/screens/community_post_detail_screen.dart b/lib/presentation/community/screens/community_post_detail_screen.dart index 627ba24..16ad6f9 100644 --- a/lib/presentation/community/screens/community_post_detail_screen.dart +++ b/lib/presentation/community/screens/community_post_detail_screen.dart @@ -1,10 +1,9 @@ import 'package:flutter/material.dart'; -import 'package:jusicool_design_system/src/core/theme/colors/color_palette.dart'; -import 'package:jusicool_design_system/src/core/theme/texts/typography.dart'; +import 'package:jusicool_design_system/jusicool_design_system.dart' + hide CommentTextField; import 'package:jusicool_ios/presentation/community/widgets/comment_item.dart'; import 'package:jusicool_ios/presentation/community/widgets/comment_textfield.dart'; import 'package:jusicool_ios/presentation/community/widgets/like_button.dart'; - import 'community_post_edit_screen.dart'; class CommunityPostDetailScreen extends StatefulWidget { diff --git a/lib/presentation/community/screens/community_post_edit_screen.dart b/lib/presentation/community/screens/community_post_edit_screen.dart index ec1b3d0..6b0036e 100644 --- a/lib/presentation/community/screens/community_post_edit_screen.dart +++ b/lib/presentation/community/screens/community_post_edit_screen.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:jusicool_design_system/src/core/theme/colors/color_palette.dart'; -import 'package:jusicool_design_system/src/core/theme/texts/typography.dart'; +import 'package:jusicool_design_system/jusicool_design_system.dart'; class CommunityPostEditScreen extends StatefulWidget { final String initialTitle; diff --git a/lib/presentation/community/screens/community_post_list_screen.dart b/lib/presentation/community/screens/community_post_list_screen.dart index 8d698c7..86f4f9f 100644 --- a/lib/presentation/community/screens/community_post_list_screen.dart +++ b/lib/presentation/community/screens/community_post_list_screen.dart @@ -1,9 +1,7 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:jusicool_design_system/src/core/theme/colors/color_palette.dart'; -import 'package:jusicool_design_system/src/core/theme/texts/typography.dart'; - +import 'package:jusicool_design_system/jusicool_design_system.dart'; import 'community_post_detail_screen.dart'; import 'community_post_write_screen.dart'; @@ -83,7 +81,10 @@ class _CommunityPostListScreenState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(post['title'], style: JusicoolTypography.titleSmall), + Text( + post['title'], + style: JusicoolTypography.titleSmall, + ), const SizedBox(height: 8), Text( post['content'], diff --git a/lib/presentation/community/screens/community_post_write_screen.dart b/lib/presentation/community/screens/community_post_write_screen.dart index 4479309..8507e4d 100644 --- a/lib/presentation/community/screens/community_post_write_screen.dart +++ b/lib/presentation/community/screens/community_post_write_screen.dart @@ -1,7 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:jusicool_design_system/src/core/theme/colors/color_palette.dart'; -import 'package:jusicool_design_system/src/core/theme/texts/typography.dart'; -import 'package:jusicool_design_system/src/ui/widgets/button/button_medium.dart'; +import 'package:jusicool_design_system/jusicool_design_system.dart'; class CommunityPostWriteScreen extends StatefulWidget { const CommunityPostWriteScreen({super.key}); @@ -105,8 +103,10 @@ class _WritePostScreenState extends State { child: AppButtonMedium( text: '올리기', onPressed: isFormValid ? _uploadPost : null, - backgroundColor: isFormValid ? JusicoolColor.main : JusicoolColor.gray400, - textColor: isFormValid ? JusicoolColor.white : JusicoolColor.gray600, + backgroundColor: + isFormValid ? JusicoolColor.main : JusicoolColor.gray400, + textColor: + isFormValid ? JusicoolColor.white : JusicoolColor.gray600, borderColor: Colors.transparent, ), ), diff --git a/lib/presentation/community/widgets/comment_item.dart b/lib/presentation/community/widgets/comment_item.dart index d5f940e..4ba8447 100644 --- a/lib/presentation/community/widgets/comment_item.dart +++ b/lib/presentation/community/widgets/comment_item.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:jusicool_design_system/src/core/theme/texts/typography.dart'; +import 'package:jusicool_design_system/jusicool_design_system.dart'; class CommentItem extends StatelessWidget { final String name; diff --git a/lib/presentation/community/widgets/comment_textfield.dart b/lib/presentation/community/widgets/comment_textfield.dart index e7fc0b9..f42e0c9 100644 --- a/lib/presentation/community/widgets/comment_textfield.dart +++ b/lib/presentation/community/widgets/comment_textfield.dart @@ -1,8 +1,9 @@ import 'package:flutter/material.dart'; -import 'package:jusicool_design_system/src/core/theme/colors/color_palette.dart'; +import 'package:jusicool_design_system/jusicool_design_system.dart'; class CommentTextField extends StatefulWidget { final void Function(String)? onSubmit; + const CommentTextField({super.key, this.onSubmit}); @override diff --git a/lib/presentation/community/widgets/like_button.dart b/lib/presentation/community/widgets/like_button.dart index 6f3c5fb..fe0ea3d 100644 --- a/lib/presentation/community/widgets/like_button.dart +++ b/lib/presentation/community/widgets/like_button.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:jusicool_design_system/src/core/theme/colors/color_palette.dart'; +import 'package:jusicool_design_system/jusicool_design_system.dart'; class LikeButton extends StatefulWidget { final int initialCount; diff --git a/lib/presentation/my_capital/screens/maincapital_screen.dart b/lib/presentation/my_capital/screens/maincapital_screen.dart index d201989..0105f81 100644 --- a/lib/presentation/my_capital/screens/maincapital_screen.dart +++ b/lib/presentation/my_capital/screens/maincapital_screen.dart @@ -13,14 +13,14 @@ class StockCard extends StatelessWidget { final double changePercentage; const StockCard({ - Key? key, + super.key, required this.imagePath, required this.companyName, required this.stockCount, required this.amount, required this.changeValue, required this.changePercentage, - }) : super(key: key); + }); @override Widget build(BuildContext context) { @@ -126,14 +126,14 @@ class CoinCard extends StatelessWidget { final double changePercentage; const CoinCard({ - Key? key, + super.key, required this.imagePath, required this.companyName, required this.stockCount, required this.amount, required this.changeValue, required this.changePercentage, - }) : super(key: key); + }); @override Widget build(BuildContext context) { @@ -235,17 +235,17 @@ class MainCapitalScreen extends StatelessWidget { @override Widget build(BuildContext context) { - final int investmentValue = 123456789; - final int changeValue = -6555778; - final double changePercent = 4.0; + const int investmentValue = 123456789; + const int changeValue = -6555778; + const double changePercent = 4.0; - final int monthlyOrderCount = 6; + const int monthlyOrderCount = 6; final String formattedOrderCount = NumberFormat( '#,###', ).format(monthlyOrderCount); - final String monthlyOrderText = "이번달 ${formattedOrderCount}건"; + final String monthlyOrderText = "이번달 $formattedOrderCount건"; - final int monthlyProfitValue = 111111111; + const int monthlyProfitValue = 111111111; final String formattedMonthlyProfit = NumberFormat( '#,###', ).format(monthlyProfitValue); diff --git a/lib/presentation/my_capital/screens/my_assets_screen.dart b/lib/presentation/my_capital/screens/my_assets_screen.dart index 3fbfc57..05bd9e0 100644 --- a/lib/presentation/my_capital/screens/my_assets_screen.dart +++ b/lib/presentation/my_capital/screens/my_assets_screen.dart @@ -3,8 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:fl_chart/fl_chart.dart'; import 'package:intl/intl.dart'; -import 'package:jusicool_design_system/src/core/theme/texts/typography.dart'; -import 'package:jusicool_design_system/src/core/theme/colors/color_palette.dart'; +import 'package:jusicool_design_system/jusicool_design_system.dart'; import 'package:jusicool_ios/presentation/my_capital/widgets/my_asset_tile.dart'; import '../../../domain/my_capital/entities/my_assets.dart'; @@ -52,7 +51,7 @@ class _MyAssetsScreenState extends State { backgroundColor: JusicoolColor.white, centerTitle: true, elevation: 0, - leading: BackButton(color: JusicoolColor.black), + leading: const BackButton(color: JusicoolColor.black), title: Text('내 자산', style: JusicoolTypography.subTitle), ), body: SafeArea( @@ -149,7 +148,7 @@ class _MyAssetsScreenState extends State { physics: const NeverScrollableScrollPhysics(), shrinkWrap: true, itemCount: data.sections.length, - separatorBuilder: (_, __) => const SizedBox(height: 24), + separatorBuilder: (_, _) => const SizedBox(height: 24), itemBuilder: (context, index) { final s = data.sections[index]; return MyAssetTile( diff --git a/lib/presentation/my_capital/screens/order_screens/order_detail_screen.dart b/lib/presentation/my_capital/screens/order_screens/order_detail_screen.dart index a48f454..900c5e8 100644 --- a/lib/presentation/my_capital/screens/order_screens/order_detail_screen.dart +++ b/lib/presentation/my_capital/screens/order_screens/order_detail_screen.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:jusicool_design_system/src/core/theme/colors/color_palette.dart'; -import 'package:jusicool_design_system/src/core/theme/texts/typography.dart'; +import 'package:jusicool_design_system/jusicool_design_system.dart'; import 'package:jusicool_ios/presentation/my_capital/screens/order_screens/order_item.dart'; class OrderDetailScreen extends StatefulWidget { @@ -26,6 +25,7 @@ class _OrderDetailScreenState extends State _tabController.dispose(); super.dispose(); } + //==================================== List> _generateDummyCompletedOrders() { @@ -82,13 +82,13 @@ class _OrderDetailScreenState extends State final statusBarHeight = MediaQuery.of(context).padding.top; - const JusicoolBarHeight = kToolbarHeight; + const double jusicoolBarHeight = kToolbarHeight; const tabBarHeight = 48.0; final adjustedTopPadding = - (176.h - statusBarHeight - JusicoolBarHeight - tabBarHeight) > 0 - ? (176.h - statusBarHeight - JusicoolBarHeight - tabBarHeight) + (176.h - statusBarHeight - jusicoolBarHeight - tabBarHeight) > 0 + ? (176.h - statusBarHeight - jusicoolBarHeight - tabBarHeight) : 0.0; return Scaffold( @@ -115,7 +115,7 @@ class _OrderDetailScreenState extends State : JusicoolColor.white; }), splashFactory: NoSplash.splashFactory, - indicator: BoxDecoration( + indicator: const BoxDecoration( color: JusicoolColor.white, border: Border( bottom: BorderSide(color: JusicoolColor.black, width: 1.0), diff --git a/lib/presentation/my_capital/screens/order_screens/order_item.dart b/lib/presentation/my_capital/screens/order_screens/order_item.dart index 82fb778..2751897 100644 --- a/lib/presentation/my_capital/screens/order_screens/order_item.dart +++ b/lib/presentation/my_capital/screens/order_screens/order_item.dart @@ -1,8 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:intl/intl.dart'; -import 'package:jusicool_design_system/src/core/theme/colors/color_palette.dart'; -import 'package:jusicool_design_system/src/core/theme/texts/typography.dart'; +import 'package:jusicool_design_system/jusicool_design_system.dart'; class OrderItem extends StatelessWidget { final String companyName; @@ -22,7 +21,7 @@ class OrderItem extends StatelessWidget { final formattedAmount = numberFormat.format(amount.abs()); final changeColor = amount >= 0 ? JusicoolColor.error : JusicoolColor.main; - return Container( + return SizedBox( width: 312.w, height: 40.h, child: Column( diff --git a/lib/presentation/my_capital/screens/revenue_screens/monthlyrevenue_screen.dart b/lib/presentation/my_capital/screens/revenue_screens/monthlyrevenue_screen.dart index 9e104c1..93cf137 100644 --- a/lib/presentation/my_capital/screens/revenue_screens/monthlyrevenue_screen.dart +++ b/lib/presentation/my_capital/screens/revenue_screens/monthlyrevenue_screen.dart @@ -1,8 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:intl/intl.dart'; -import 'package:jusicool_design_system/src/core/theme/colors/color_palette.dart'; -import 'package:jusicool_design_system/src/core/theme/texts/typography.dart'; +import 'package:jusicool_design_system/jusicool_design_system.dart'; import 'package:jusicool_ios/presentation/my_capital/screens/revenue_screens/revenuecard.dart'; import 'package:go_router/go_router.dart'; @@ -206,7 +205,7 @@ class _MonthlyRevenueScreenState extends State : JusicoolColor.white; }), splashFactory: NoSplash.splashFactory, - indicator: BoxDecoration( + indicator: const BoxDecoration( color: JusicoolColor.white, border: Border( bottom: BorderSide( diff --git a/lib/presentation/my_capital/screens/revenue_screens/revenuecard.dart b/lib/presentation/my_capital/screens/revenue_screens/revenuecard.dart index fc290a8..3893398 100644 --- a/lib/presentation/my_capital/screens/revenue_screens/revenuecard.dart +++ b/lib/presentation/my_capital/screens/revenue_screens/revenuecard.dart @@ -1,8 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:intl/intl.dart'; -import 'package:jusicool_design_system/src/core/theme/colors/color_palette.dart'; -import 'package:jusicool_design_system/src/core/theme/texts/typography.dart'; +import 'package:jusicool_design_system/jusicool_design_system.dart'; class RevenueCard extends StatelessWidget { final String imagePath; @@ -12,13 +11,13 @@ class RevenueCard extends StatelessWidget { final double changePercentage; const RevenueCard({ - Key? key, + super.key, required this.imagePath, required this.companyName, required this.amount, required this.changeValue, required this.changePercentage, - }) : super(key: key); + }); String getFormattedAmount() { final numberFormat = NumberFormat("#,###", "en_US"); @@ -46,7 +45,7 @@ class RevenueCard extends StatelessWidget { final String formattedAmount = getFormattedAmount(); final Color changeColor = getChangeColor(); - return Container( + return SizedBox( width: 312.w, height: 48.h, child: Row( @@ -81,11 +80,11 @@ class RevenueCard extends StatelessWidget { ), ), Expanded(child: Container()), // 남은 공간 채우기 - Container( + SizedBox( width: 160.w, height: 44.h, child: Padding( - padding: EdgeInsets.only(top: 0, bottom: 0), + padding: const EdgeInsets.only(top: 0, bottom: 0), child: Column( crossAxisAlignment: CrossAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.center, diff --git a/lib/presentation/my_capital/widgets/my_asset_tile.dart b/lib/presentation/my_capital/widgets/my_asset_tile.dart index 7fc65cb..654b47d 100644 --- a/lib/presentation/my_capital/widgets/my_asset_tile.dart +++ b/lib/presentation/my_capital/widgets/my_asset_tile.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:jusicool_design_system/src/core/theme/colors/color_palette.dart'; -import 'package:jusicool_design_system/src/core/theme/texts/typography.dart'; +import 'package:jusicool_design_system/jusicool_design_system.dart'; class MyAssetTile extends StatelessWidget { final String stockName; // 종목명 (예: AMDL) diff --git a/lib/presentation/news/screens/news_list_screen.dart b/lib/presentation/news/screens/news_list_screen.dart index e2f0501..2367590 100644 --- a/lib/presentation/news/screens/news_list_screen.dart +++ b/lib/presentation/news/screens/news_list_screen.dart @@ -1,10 +1,7 @@ import 'dart:convert'; - import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:jusicool_design_system/src/ui/widgets/card/news_card.dart'; -import 'package:jusicool_design_system/src/core/theme/texts/typography.dart'; -import 'package:jusicool_design_system/src/core/theme/colors/color_palette.dart'; +import 'package:jusicool_design_system/jusicool_design_system.dart'; import 'package:url_launcher/url_launcher.dart'; /// 뉴스 아이템 데이터 모델 @@ -33,7 +30,7 @@ class NewsItem { /// 뉴스 리스트 화면 class NewsListScreen extends StatefulWidget { - const NewsListScreen({Key? key}) : super(key: key); + const NewsListScreen({super.key}); @override State createState() => _NewsListScreenState(); @@ -67,9 +64,11 @@ class _NewsListScreenState extends State { }); } catch (e) { debugPrint('뉴스 로드 실패: $e'); - ScaffoldMessenger.of( - context, - ).showSnackBar(const SnackBar(content: Text('뉴스 데이터를 불러올 수 없습니다.'))); + if (mounted) { + ScaffoldMessenger.of( + context, + ).showSnackBar(const SnackBar(content: Text('뉴스 데이터를 불러올 수 없습니다.'))); + } } } @@ -88,9 +87,11 @@ class _NewsListScreenState extends State { if (await canLaunchUrl(uri)) { await launchUrl(uri, mode: LaunchMode.externalApplication); } else { - ScaffoldMessenger.of( + if(mounted) { + ScaffoldMessenger.of( context, ).showSnackBar(const SnackBar(content: Text('링크를 열 수 없습니다.'))); + } } } @@ -105,7 +106,7 @@ class _NewsListScreenState extends State { @override Widget build(BuildContext context) { final double statusBarHeight = MediaQuery.of(context).padding.top; - final double JusicoolBarHeight = kToolbarHeight + statusBarHeight; + final double jusicoolBarHeight = kToolbarHeight + statusBarHeight; return Scaffold( backgroundColor: JusicoolColor.white, @@ -116,12 +117,12 @@ class _NewsListScreenState extends State { padding: EdgeInsets.symmetric(horizontal: 16.w), child: _newsItems.isEmpty - ? Center(child: CircularProgressIndicator()) + ? const Center(child: CircularProgressIndicator()) : ListView.separated( controller: _scrollController, - padding: EdgeInsets.only(top: JusicoolBarHeight + 24.h), + padding: EdgeInsets.only(top: jusicoolBarHeight + 24.h), itemCount: _newsItems.length, - separatorBuilder: (_, __) => SizedBox(height: 20.h), + separatorBuilder: (_, _) => SizedBox(height: 20.h), itemBuilder: (context, index) { final item = _newsItems[index]; return GestureDetector( @@ -138,7 +139,7 @@ class _NewsListScreenState extends State { ), // 커스텀 JusicoolBar Container( - height: JusicoolBarHeight, + height: jusicoolBarHeight, padding: EdgeInsets.only(top: statusBarHeight), color: _getJusicoolBarColor(), child: Row( @@ -150,7 +151,9 @@ class _NewsListScreenState extends State { const Spacer(), Text( "뉴스", - style: JusicoolTypography.subTitle.copyWith(color: Colors.black), + style: JusicoolTypography.subTitle.copyWith( + color: Colors.black, + ), ), const Spacer(), SizedBox(width: 48.w), // 아이콘 영역 여백 diff --git a/lib/presentation/sign_in/controller/sign_in_controller.dart b/lib/presentation/sign_in/controller/sign_in_controller.dart index d9223f1..1729582 100644 --- a/lib/presentation/sign_in/controller/sign_in_controller.dart +++ b/lib/presentation/sign_in/controller/sign_in_controller.dart @@ -1,8 +1,6 @@ import 'package:email_validator/email_validator.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:go_router/go_router.dart'; -import 'package:jusicool_ios/core/config/router/router.dart'; import 'package:jusicool_ios/domain/sign_in/usecase/sign_in_usecase.dart'; import '../../../core/config/di/dependencies.dart'; import '../mapper/sign_in_mapper.dart'; @@ -76,18 +74,18 @@ class UserSignInController extends StateNotifier { state = state.copyWith(enableButton: enable); } - void signIn(BuildContext context) { + bool signIn() { if (state.email.isEmpty || state.password.isEmpty) { _setError("이메일과 비밀번호를 입력해주세요."); - return; + return false; } if (!EmailValidator.validate(state.email)) { _setError("유효한 이메일을 입력해주세요."); - return; + return false; } if (!_isValidPassword(state.password)) { _setError("비밀번호는 8~13자이며, 문자, 숫자, 특수문자 중 2가지 이상 포함해야 합니다."); - return; + return false; } _clearError(); @@ -96,11 +94,13 @@ class UserSignInController extends StateNotifier { _signInUseCase .signIn(request) .then((_) { - context.pushReplacement(RoutePaths.main); + return true; }) .catchError((error) { _setError("아이디와 비밀번호를 다시 한 번 확인해주세요"); + return false; }); + return false; } @override diff --git a/lib/presentation/sign_in/screens/login_screen.dart b/lib/presentation/sign_in/screens/login_screen.dart index b114c1d..17752b8 100644 --- a/lib/presentation/sign_in/screens/login_screen.dart +++ b/lib/presentation/sign_in/screens/login_screen.dart @@ -1,13 +1,14 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:go_router/go_router.dart'; import 'package:jusicool_design_system/jusicool_design_system.dart'; import 'package:jusicool_ios/presentation/sign_in/screens/widgets/input_field.dart'; -import '../../sign_up/screens/name_input_screen.dart'; +import '../../../core/config/router/router.dart'; import '../controller/sign_in_controller.dart'; class LoginScreen extends ConsumerWidget { - LoginScreen({super.key}); + const LoginScreen({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { @@ -55,13 +56,18 @@ class LoginScreen extends ConsumerWidget { ), ], ), - Spacer(), + const Spacer(), Column( spacing: 8.h, children: [ AppButtonMedium( text: '로그인', - onPressed: () => provider.signIn(context), + onPressed: () { + final result = provider.signIn(); + if (result) { + context.pushReplacement(RoutePaths.main); + } + }, backgroundColor: state.enableButton ? JusicoolColor.main @@ -83,14 +89,7 @@ class LoginScreen extends ConsumerWidget { ), ), GestureDetector( - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => const NameInputScreen(), - ), - ); - }, + onTap: () => context.push(RoutePaths.nameInput), child: Text( '회원가입', style: JusicoolTypography.bodySmall.copyWith( diff --git a/lib/presentation/sign_in/screens/widgets/input_field.dart b/lib/presentation/sign_in/screens/widgets/input_field.dart index 17ee6da..087025d 100644 --- a/lib/presentation/sign_in/screens/widgets/input_field.dart +++ b/lib/presentation/sign_in/screens/widgets/input_field.dart @@ -33,7 +33,7 @@ class InputField extends StatelessWidget { color: hasError ? JusicoolColor.error : JusicoolColor.black, ), ), - SizedBox.shrink(), + const SizedBox.shrink(), TextFormField( controller: controller, obscureText: obscureText, diff --git a/lib/presentation/sign_up/controller/sign_up_email_controller.dart b/lib/presentation/sign_up/controller/sign_up_email_controller.dart index 5a9e194..3a76da0 100644 --- a/lib/presentation/sign_up/controller/sign_up_email_controller.dart +++ b/lib/presentation/sign_up/controller/sign_up_email_controller.dart @@ -2,14 +2,11 @@ import 'dart:async'; import 'package:flutter/cupertino.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:email_validator/email_validator.dart'; -import 'package:go_router/go_router.dart'; import 'package:jusicool_ios/domain/sign_up/entity/sign_up_email_entity.dart'; import 'package:jusicool_ios/domain/sign_up/usecase/sign_up_usecase.dart'; import 'package:jusicool_ios/presentation/sign_up/mapper/sign_up_email_mapper.dart'; import 'package:jusicool_ios/presentation/sign_up/state/sign_up_email_state.dart'; - import '../../../core/config/di/dependencies.dart'; -import '../../../core/config/router/router.dart'; final emailAuthControllerProvider = StateNotifierProvider( @@ -98,7 +95,7 @@ class EmailAuthController extends StateNotifier { } } - void sendVerificationCode(BuildContext context) { + bool sendVerificationCode() { final code = state.verify; if (code.isEmpty || code.length != 6) { state = state.copyWith( @@ -106,7 +103,7 @@ class EmailAuthController extends StateNotifier { enableButton: false, errorMessage: "인증번호를 입력해주세요.", ); - return; + return false; } state = state.copyWith( @@ -120,12 +117,14 @@ class EmailAuthController extends StateNotifier { _signUpUseCase .verifyEmail(request) .then((_) { - context.push(RoutePaths.passwordCreate); state = state.copyWith(isCodeMatched: true, isSendingCode: false); + return true; }) .catchError((error) { state = state.copyWith(isCodeMatched: false, isSendingCode: false); + return false; }); + return false; } void _startVerificationTimers() { diff --git a/lib/presentation/sign_up/controller/sign_up_password_controller.dart b/lib/presentation/sign_up/controller/sign_up_password_controller.dart index 7346154..d2dfc5b 100644 --- a/lib/presentation/sign_up/controller/sign_up_password_controller.dart +++ b/lib/presentation/sign_up/controller/sign_up_password_controller.dart @@ -11,7 +11,7 @@ final signupPasswordControllerProvider = ); class SignupPasswordController extends StateNotifier { - SignupPasswordController() : super(SignUpPasswordState()) { + SignupPasswordController() : super(const SignUpPasswordState()) { _passwordController.addListener(_onPasswordChanged); _confirmPasswordController.addListener(_onConfirmPasswordChanged); } diff --git a/lib/presentation/sign_up/controller/sign_up_school_controller.dart b/lib/presentation/sign_up/controller/sign_up_school_controller.dart index 504436a..b8ecfb2 100644 --- a/lib/presentation/sign_up/controller/sign_up_school_controller.dart +++ b/lib/presentation/sign_up/controller/sign_up_school_controller.dart @@ -1,7 +1,5 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:go_router/go_router.dart'; -import 'package:jusicool_ios/core/config/router/router.dart'; import 'package:jusicool_ios/domain/sign_up/entity/sign_up_entity.dart'; import 'package:jusicool_ios/domain/sign_up/usecase/sign_up_usecase.dart'; import 'package:jusicool_ios/presentation/sign_up/mapper/sign_up_search_school_mapper.dart'; @@ -15,10 +13,11 @@ final signupSchoolControllerProvider = ); class SignupSchoolController extends StateNotifier { - SignUpUseCase _signUpUseCase; + final SignUpUseCase _signUpUseCase; final _schoolNameSubject = PublishSubject(); - SignupSchoolController(this._signUpUseCase) : super(SignUpSchoolState()) { + SignupSchoolController(this._signUpUseCase) + : super(const SignUpSchoolState()) { _schoolNameController.addListener(() { _schoolNameSubject.add(_schoolNameController.text); }); @@ -35,7 +34,6 @@ class SignupSchoolController extends StateNotifier { TextEditingController get schoolNameController => _schoolNameController; void searchSchool() { - print(state.toString()); _signUpUseCase .searchSchool(_schoolNameController.text) .then((result) { @@ -43,7 +41,6 @@ class SignupSchoolController extends StateNotifier { state = state.copyWith( filteredSchools: SignUpSearchSchoolMapper.toState(result), ); - print(state.toString()); } else { state = state.copyWith(filteredSchools: []); } @@ -57,15 +54,14 @@ class SignupSchoolController extends StateNotifier { state = state.copyWith(selectedSchool: school); } - void start({ - required BuildContext context, + bool start({ required String email, required String password, required String name, }) { final String? schoolName = state.selectedSchool?.schoolName; if (schoolName == null) { - return; + return false; } else { _signUpUseCase .signUp( @@ -77,9 +73,12 @@ class SignupSchoolController extends StateNotifier { ), ) .then((value) { - context.pushReplacement(RoutePaths.main); + return true; }) - .catchError((error) {}); + .catchError((error) { + return false; + }); + return false; } } diff --git a/lib/presentation/sign_up/screens/email_auth_screen.dart b/lib/presentation/sign_up/screens/email_auth_screen.dart index dc68eb7..4508229 100644 --- a/lib/presentation/sign_up/screens/email_auth_screen.dart +++ b/lib/presentation/sign_up/screens/email_auth_screen.dart @@ -2,8 +2,9 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:jusicool_design_system/src/core/theme/colors/color_palette.dart'; -import 'package:jusicool_design_system/src/core/theme/texts/typography.dart'; +import 'package:go_router/go_router.dart'; +import 'package:jusicool_design_system/jusicool_design_system.dart'; +import 'package:jusicool_ios/core/config/router/router.dart'; import '../controller/sign_up_email_controller.dart'; class EmailAuthScreen extends ConsumerWidget { @@ -235,7 +236,13 @@ class EmailAuthScreen extends ConsumerWidget { onPressed: state.enableButton ? state.codeSent - ? () => controller.sendVerificationCode(context) + ? () { + bool result = controller.sendVerificationCode( + ); + if (result) { + context.push(RoutePaths.passwordCreate); + } + } : controller.sendEmail : null, isLoading: state.isSendingCode, diff --git a/lib/presentation/sign_up/screens/find_school_screen.dart b/lib/presentation/sign_up/screens/find_school_screen.dart index bc433d0..c817cb4 100644 --- a/lib/presentation/sign_up/screens/find_school_screen.dart +++ b/lib/presentation/sign_up/screens/find_school_screen.dart @@ -2,8 +2,10 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:go_router/go_router.dart'; import 'package:jusicool_design_system/jusicool_design_system.dart'; import 'package:jusicool_ios/presentation/sign_up/controller/sign_up_email_controller.dart'; +import '../../../core/config/router/router.dart'; import '../controller/sign_up_name_controller.dart'; import '../controller/sign_up_password_controller.dart'; import '../controller/sign_up_school_controller.dart'; @@ -134,10 +136,10 @@ class FindSchoolScreen extends ConsumerWidget { borderRadius: BorderRadius.circular(8.r), ), child: Container( - padding: EdgeInsets.all(15), + padding: const EdgeInsets.all(15), decoration: BoxDecoration( border: Border.all( - color: JusicoolColor.main.withValues(alpha:0.5), + color: JusicoolColor.main.withValues(alpha: 0.5), width: 1.sp, ), borderRadius: BorderRadius.circular(8), @@ -267,16 +269,17 @@ class FindSchoolScreen extends ConsumerWidget { ), Column( children: [ - _startButton( - isSchoolSelected, - () => provider.start( - context: context, + _startButton(isSchoolSelected, () { + final result = provider.start( email: ref.watch(emailAuthControllerProvider).email, password: ref.watch(signupPasswordControllerProvider).password, name: ref.watch(nameControllerProvider).username, - ), - ), + ); + if (result) { + context.pushReplacement(RoutePaths.main); + } + }), ], ), ], diff --git a/lib/presentation/sign_up/screens/name_input_screen.dart b/lib/presentation/sign_up/screens/name_input_screen.dart index 770d2a8..4cea720 100644 --- a/lib/presentation/sign_up/screens/name_input_screen.dart +++ b/lib/presentation/sign_up/screens/name_input_screen.dart @@ -88,7 +88,7 @@ class NameInputScreen extends ConsumerWidget { controller: provider.controller, hintText: '실명을 적어주세요', errorText: state.errorMessage, - validator: (String) { + validator: (String? value) { return null; }, ), diff --git a/lib/presentation/sign_up/screens/password_create_screen.dart b/lib/presentation/sign_up/screens/password_create_screen.dart index 8334191..a2fbec9 100644 --- a/lib/presentation/sign_up/screens/password_create_screen.dart +++ b/lib/presentation/sign_up/screens/password_create_screen.dart @@ -62,7 +62,7 @@ class PasswordCreateScreen extends ConsumerWidget { !state.isPasswordValid ? '영문, 숫자, 특수문자 중 2개 이상 조합으로 8~13자' : null, - validator: (String) => null, + validator: (String? value) => null, ), ], ), @@ -85,7 +85,7 @@ class PasswordCreateScreen extends ConsumerWidget { obscureText: true, errorText: !state.isPasswordMatched ? '비밀번호가 일치하지 않아요' : null, - validator: (String) => null, + validator: (String? value) => null, ), ], ), diff --git a/pubspec.yaml b/pubspec.yaml index 6fe4a71..eb2e504 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -56,6 +56,7 @@ dependencies: flutter_riverpod: ^2.6.1 rxdart: ^0.28.0 + flutter_lints: ^6.0.0 dev_dependencies: