diff --git a/android/app/build.gradle b/android/app/build.gradle index d9dfc722..3f46af7c 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -13,12 +13,12 @@ if (flutterRoot == null) { def flutterVersionCode = localProperties.getProperty('flutter.versionCode') if (flutterVersionCode == null) { - flutterVersionCode = '23' + flutterVersionCode = '24' } def flutterVersionName = localProperties.getProperty('flutter.versionName') if (flutterVersionName == null) { - flutterVersionName = '3.4.1' + flutterVersionName = '3.5.0' } def keystoreProperties = new Properties() diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index b9521782..b5c8c484 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -376,7 +376,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 3.4.1; + MARKETING_VERSION = 3.5.0; PRODUCT_BUNDLE_IDENTIFIER = com.osj.lotura; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; @@ -516,7 +516,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 3.4.1; + MARKETING_VERSION = 3.5.0; PRODUCT_BUNDLE_IDENTIFIER = com.osj.lotura; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; @@ -546,7 +546,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 3.4.1; + MARKETING_VERSION = 3.5.0; PRODUCT_BUNDLE_IDENTIFIER = com.osj.lotura; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; diff --git a/lib/presentation/apply_page/ui/view/apply_page.dart b/lib/presentation/apply_page/ui/view/apply_page.dart index 1946a2b5..cbf76bb4 100644 --- a/lib/presentation/apply_page/ui/view/apply_page.dart +++ b/lib/presentation/apply_page/ui/view/apply_page.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart' as s; import 'package:lotura/main.dart'; import 'package:lotura/presentation/apply_page/bloc/apply_bloc.dart'; import 'package:lotura/presentation/apply_page/bloc/apply_model.dart'; @@ -19,7 +19,7 @@ class ApplyPage extends StatelessWidget { ApplyPage({super.key}); final TextStyle bigStyle = TextStyle( - fontSize: 40.0.sp, + fontSize: 30.0.sp, color: LoturaColors.black, fontWeight: FontWeight.bold, ); @@ -36,24 +36,26 @@ class ApplyPage extends StatelessWidget { appBar: AppBar( backgroundColor: LoturaColors.gray100, elevation: 0.0, - leadingWidth: 200.0.w, - leading: Row( - children: [ - SizedBox(width: 24.0.w), - Image.asset( - "assets/applogo.jpeg", - width: 24.0.w, - height: 24.0.h, - ), - SizedBox(width: 8.0.w), - Text( - "OSJ", - style: TextStyle( - fontSize: 20.0.sp, - color: LoturaColors.primary700, - fontWeight: FontWeight.bold), - ), - ], + leadingWidth: MediaQuery.of(context).size.width, + title: Padding( + padding: EdgeInsets.only(left: 10.0.r), + child: Row( + children: [ + Image.asset( + "assets/applogo.jpeg", + width: 24.0.w, + height: 24.0.h, + ), + SizedBox(width: 8.0.w), + Text( + "OSJ", + style: TextStyle( + fontSize: 20.0.sp, + color: LoturaColors.primary700, + fontWeight: FontWeight.bold), + ), + ], + ), ), actions: [ IconButton( @@ -105,16 +107,17 @@ class ApplyPage extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text("알림 설정한", style: bigStyle), - Text("세탁기와 건조기", style: bigStyle), - SizedBox(height: 24.0.h), - Text("알림을 설정하여 세탁기와 건조기를", style: smallStyle), - SizedBox(height: 5.0.h), - Text("누구보다 빠르게 사용해보세요.", style: smallStyle), - ], + FittedBox( + fit: BoxFit.scaleDown, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text("알림 설정한\n세탁기와 건조기", style: bigStyle), + SizedBox(height: 24.0.h), + Text("알림을 설정하여 세탁기와 건조기를\n누구보다 빠르게 사용해보세요.", + style: smallStyle), + ], + ), ), SizedBox(height: 20.0.h), Expanded( @@ -173,13 +176,16 @@ class ApplyPage extends StatelessWidget { .applyList[index * 2 + 1] .deviceType, state: CurrentState.working) - : SizedBox( - width: 185.0.w, - height: 256.0.h, - ), + : const MachineCard( + //리팩토링 꼭 하기 + deviceId: -1, + isEnableNotification: false, + isWoman: true, + deviceType: DeviceType.dry, + state: CurrentState.working) ], ), - SizedBox(height: 10.0.h), + SizedBox(height: 10.0.r), ], ); }, diff --git a/lib/presentation/laundry_room_page/ui/view/laundry_room_page.dart b/lib/presentation/laundry_room_page/ui/view/laundry_room_page.dart index 2de78d4d..7263ee2b 100644 --- a/lib/presentation/laundry_room_page/ui/view/laundry_room_page.dart +++ b/lib/presentation/laundry_room_page/ui/view/laundry_room_page.dart @@ -41,198 +41,211 @@ class LaundryRoomPage extends StatelessWidget { Widget build(BuildContext context) { return BlocBuilder>( builder: (context, roomBlocState) { - if (roomBlocState is Changed) { - return Scaffold( - backgroundColor: LoturaColors.gray100, - appBar: AppBar( + return switch (roomBlocState) { + Initial() => const Center(child: CircularProgressIndicator()), + Changed() => Scaffold( backgroundColor: LoturaColors.gray100, - elevation: 0.0, - leadingWidth: 300.0.w, - leading: Row( - children: [ - SizedBox(width: 24.0.w), - Text( + appBar: AppBar( + backgroundColor: LoturaColors.gray100, + elevation: 0.0, + leadingWidth: MediaQuery.of(context).size.width, + title: Padding( + padding: EdgeInsets.only(left: 10.r), + child: Text( roomBlocState.value.roomLocation.roomName, style: TextStyle( color: LoturaColors.black, - fontSize: 24.0.sp, + fontSize: 22.0.sp, fontWeight: FontWeight.w600, ), ), - ], - ), - actions: [ - IconButton( - onPressed: () { - context.read().add(UpdateLastNoticeIdEvent()); - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => const NoticePage())); - }, - icon: BlocBuilder>( - builder: (context, state) => state.value.isNewNotice - ? Stack( - alignment: Alignment.topRight, - children: [ - Icon( - LoturaIcons.notice, - color: LoturaColors.black, - size: 24.0.r, - ), - Container( - width: 10.0.r, - height: 10.0.r, - decoration: const BoxDecoration( - color: Colors.blue, - shape: BoxShape.circle, + ), + actions: [ + IconButton( + onPressed: () { + context.read().add(UpdateLastNoticeIdEvent()); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const NoticePage())); + }, + icon: BlocBuilder>( + builder: (context, state) => state.value.isNewNotice + ? Stack( + alignment: Alignment.topRight, + children: [ + Icon( + LoturaIcons.notice, + color: LoturaColors.black, + size: 24.0.r, ), - ), - ], - ) - : Icon( - LoturaIcons.notice, - color: LoturaColors.black, - size: 24.0.r, - ), + Container( + width: 10.0.r, + height: 10.0.r, + decoration: const BoxDecoration( + color: Colors.blue, + shape: BoxShape.circle, + ), + ), + ], + ) + : Icon( + LoturaIcons.notice, + color: LoturaColors.black, + size: 24.0.r, + ), + ), ), - ), - IconButton( - onPressed: () => Navigator.push( - context, - MaterialPageRoute( - builder: (context) => const SettingPage())), - icon: Icon( - Icons.settings, - color: LoturaColors.black, - size: 28.0.r, + IconButton( + onPressed: () => Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const SettingPage())), + icon: Icon( + Icons.settings, + color: LoturaColors.black, + size: 28.0.r, + ), ), + SizedBox(width: 24.0.w), + ], + ), + body: Padding( + padding: EdgeInsets.only( + left: 24.0.w, + right: 24.0.w, ), - SizedBox(width: 24.0.w), - ], - ), - body: Padding( - padding: EdgeInsets.only(left: 24.0.w, right: 24.0.w), - child: Column( - children: [ - Padding( - padding: EdgeInsets.only( - top: 12.0.h, - bottom: 12.0.h, - ), - child: Row( - children: [ - OSJTextButton( - function: () => context.read().add( - ModifyRoomIndexEvent( - roomLocation: RoomLocation.schoolSide)), - fontSize: 16.0.sp, - color: roomBlocState.value.roomLocation == - RoomLocation.schoolSide - ? LoturaColors.white - : LoturaColors.gray100, - fontColor: roomBlocState.value.roomLocation == - RoomLocation.schoolSide - ? LoturaColors.primary700 - : LoturaColors.gray300, - text: "남자 학교측", - radius: 8.0, - ), - SizedBox(width: 8.0.w), - OSJTextButton( - function: () => context.read().add( - ModifyRoomIndexEvent( - roomLocation: RoomLocation.dormitorySide)), - fontSize: 16.0.sp, - color: roomBlocState.value.roomLocation == - RoomLocation.dormitorySide - ? LoturaColors.white - : LoturaColors.gray100, - fontColor: roomBlocState.value.roomLocation == - RoomLocation.dormitorySide - ? LoturaColors.primary700 - : LoturaColors.gray300, - text: "남자 기숙사측", - radius: 8.0, - ), - SizedBox(width: 8.0.w), - OSJTextButton( - function: () => context.read().add( - ModifyRoomIndexEvent( - roomLocation: RoomLocation.womanRoom)), - fontSize: 16.0.sp, - color: roomBlocState.value.roomLocation == - RoomLocation.womanRoom - ? LoturaColors.white - : LoturaColors.gray100, - fontColor: roomBlocState.value.roomLocation == - RoomLocation.womanRoom - ? LoturaColors.primary700 - : LoturaColors.gray300, - text: "여자", - radius: 8.0, - ), - ], + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SingleChildScrollView( + scrollDirection: Axis.horizontal, + padding: EdgeInsets.symmetric(vertical: 12.0.h), + child: Row( + children: [ + OSJTextButton( + function: () => context.read().add( + ModifyRoomIndexEvent( + roomLocation: RoomLocation.schoolSide)), + fontSize: 18.0.sp, + color: roomBlocState.value.roomLocation == + RoomLocation.schoolSide + ? LoturaColors.white + : LoturaColors.gray100, + fontColor: roomBlocState.value.roomLocation == + RoomLocation.schoolSide + ? LoturaColors.primary700 + : LoturaColors.gray300, + text: "남자 학교측", + padding: EdgeInsets.symmetric(horizontal: 5.0.r), + radius: 8.0, + ), + SizedBox(width: 8.0.w), + OSJTextButton( + function: () => context.read().add( + ModifyRoomIndexEvent( + roomLocation: RoomLocation.dormitorySide)), + fontSize: 18.0.sp, + color: roomBlocState.value.roomLocation == + RoomLocation.dormitorySide + ? LoturaColors.white + : LoturaColors.gray100, + fontColor: roomBlocState.value.roomLocation == + RoomLocation.dormitorySide + ? LoturaColors.primary700 + : LoturaColors.gray300, + text: "남자 기숙사측", + padding: EdgeInsets.symmetric(horizontal: 5.0.r), + radius: 8.0, + ), + SizedBox(width: 8.0.w), + OSJTextButton( + function: () => context.read().add( + ModifyRoomIndexEvent( + roomLocation: RoomLocation.womanRoom)), + fontSize: 18.0.sp, + color: roomBlocState.value.roomLocation == + RoomLocation.womanRoom + ? LoturaColors.white + : LoturaColors.gray100, + fontColor: roomBlocState.value.roomLocation == + RoomLocation.womanRoom + ? LoturaColors.primary700 + : LoturaColors.gray300, + text: "여자", + padding: EdgeInsets.symmetric(horizontal: 5.0.r), + radius: 8.0, + ), + ], + ), ), - ), - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - IconButton( - onPressed: () => context.read().add( - ModifyButtonViewEvent( - buttonView: ButtonView.image)), - icon: Icon(LoturaIcons.grid, - size: 18.0.r, - color: roomBlocState.value.buttonView == - ButtonView.image - ? LoturaColors.black - : LoturaColors.gray300), + ViewTypeFilter(buttonView: roomBlocState.value.buttonView), + Expanded( + child: + BlocBuilder>( + builder: (context, state) { + return switch (state) { + Empty() => const Center(child: Text("비어있음")), + Loading() => + const Center(child: CircularProgressIndicator()), + Error() => + const Center(child: Text("인터넷 연결을 확인해주세요")), + Loaded() => LaundryList( + list: state.data.laundryList, + laundryRoomModel: roomBlocState.value, + nfcData: nfcTagData, + ), + }; + }, ), - IconButton( - onPressed: () => context.read().add( - ModifyButtonViewEvent( - buttonView: ButtonView.icon)), - icon: Icon( - LoturaIcons.list, - size: 18.0.r, - color: roomBlocState.value.buttonView == - ButtonView.icon - ? LoturaColors.black - : LoturaColors.gray300, - )), - ], - ), - Expanded( - child: BlocBuilder>( - builder: (context, state) { - return switch (state) { - Empty() => const Center(child: Text("비어있음")), - Loading() => - const Center(child: CircularProgressIndicator()), - Error() => - const Center(child: Text("인터넷 연결을 확인해주세요")), - Loaded() => LaundryList( - list: state.data.laundryList, - laundryRoomModel: roomBlocState.value, - nfcData: nfcTagData, - ), - }; - }, ), - ), - ], + ], + ), ), ), - ); - } else { - return const Center(child: CircularProgressIndicator()); - } + }; }, ); } } +class ViewTypeFilter extends StatelessWidget { + const ViewTypeFilter({super.key, required this.buttonView}); + + final ButtonView buttonView; + + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + IconButton( + onPressed: () => context + .read() + .add(ModifyButtonViewEvent(buttonView: ButtonView.image)), + icon: Icon(LoturaIcons.grid, + size: 18.0.r, + color: buttonView == ButtonView.image + ? LoturaColors.black + : LoturaColors.gray300), + ), + IconButton( + onPressed: () => context + .read() + .add(ModifyButtonViewEvent(buttonView: ButtonView.icon)), + icon: Icon( + LoturaIcons.list, + size: 18.0.r, + color: buttonView == ButtonView.icon + ? LoturaColors.black + : LoturaColors.gray300, + ), + ), + ], + ); + } +} + class LaundryList extends StatelessWidget { LaundryList({ super.key, @@ -305,80 +318,72 @@ class LaundryList extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Expanded( - child: machineWidget( - roomState: laundryRoomModel, - deviceId: list[placeIndex[ - laundryRoomModel.roomLocation.index]! + - index] - .id, - deviceType: list[placeIndex[ + machineWidget( + roomState: laundryRoomModel, + deviceId: list[ + placeIndex[laundryRoomModel.roomLocation.index]! + + index] + .id, + deviceType: list[ + placeIndex[laundryRoomModel.roomLocation.index]! + + index] + .deviceType, + state: list[ + placeIndex[laundryRoomModel.roomLocation.index]! + + index] + .state), + laundryRoomModel.buttonView.triangle, + machineWidget( + roomState: laundryRoomModel, + deviceId: placeIndex[laundryRoomModel.roomLocation.index]! + + index + + (laundryRoomModel.roomLocation == + RoomLocation.womanRoom + ? 10 + : 8) < + 44 + ? list[placeIndex[ laundryRoomModel.roomLocation.index]! + - index] - .deviceType, - state: list[placeIndex[ + index + + (laundryRoomModel.roomLocation == + RoomLocation.womanRoom + ? 10 + : 8)] + .id + : -1, + deviceType: + placeIndex[laundryRoomModel.roomLocation.index]! + + index + + (laundryRoomModel.roomLocation == + RoomLocation.womanRoom + ? 10 + : 8) < + 44 + ? list[placeIndex[ + laundryRoomModel.roomLocation.index]! + + index + + (laundryRoomModel.roomLocation == + RoomLocation.womanRoom + ? 10 + : 8)] + .deviceType + : DeviceType.dry, + state: placeIndex[laundryRoomModel.roomLocation.index]! + + index + + (laundryRoomModel.roomLocation == + RoomLocation.womanRoom + ? 10 + : 8) < + 44 + ? list[placeIndex[ laundryRoomModel.roomLocation.index]! + - index] - .state), - ), - Padding( - padding: EdgeInsets.symmetric(horizontal: 5.0.r), - child: laundryRoomModel.buttonView.triangle, - ), - Expanded( - child: machineWidget( - roomState: laundryRoomModel, - deviceId: - placeIndex[laundryRoomModel.roomLocation.index]! + - index + - (laundryRoomModel.roomLocation == - RoomLocation.womanRoom - ? 10 - : 8) < - 44 - ? list[placeIndex[laundryRoomModel - .roomLocation.index]! + - index + - (laundryRoomModel.roomLocation == - RoomLocation.womanRoom - ? 10 - : 8)] - .id - : -1, - deviceType: - placeIndex[laundryRoomModel.roomLocation.index]! + - index + - (laundryRoomModel.roomLocation == - RoomLocation.womanRoom - ? 10 - : 8) < - 44 - ? list[placeIndex[laundryRoomModel - .roomLocation.index]! + - index + - (laundryRoomModel.roomLocation == - RoomLocation.womanRoom - ? 10 - : 8)] - .deviceType - : DeviceType.dry, - state: placeIndex[laundryRoomModel.roomLocation.index]! + - index + - (laundryRoomModel.roomLocation == - RoomLocation.womanRoom - ? 10 - : 8) < - 44 - ? list[placeIndex[ - laundryRoomModel.roomLocation.index]! + - index + - (laundryRoomModel.roomLocation == - RoomLocation.womanRoom - ? 10 - : 8)] - .state - : CurrentState.breakdown, - ), + index + + (laundryRoomModel.roomLocation == + RoomLocation.womanRoom + ? 10 + : 8)] + .state + : CurrentState.breakdown, ), ], ), diff --git a/lib/presentation/notice_page/ui/view/notice_page.dart b/lib/presentation/notice_page/ui/view/notice_page.dart index 48ca1414..3d6baa49 100644 --- a/lib/presentation/notice_page/ui/view/notice_page.dart +++ b/lib/presentation/notice_page/ui/view/notice_page.dart @@ -17,28 +17,23 @@ class NoticePage extends StatelessWidget { appBar: AppBar( backgroundColor: LoturaColors.gray100, elevation: 0.0, - leadingWidth: 300.0.r, toolbarHeight: 90.0.r, - leading: Row( - children: [ - IconButton( - padding: EdgeInsets.only(left: 24.0.r, right: 12.0.r), - onPressed: () => Navigator.pop(context), - icon: Icon( - Icons.keyboard_arrow_left, - color: LoturaColors.black, - size: 30.0.r, - ), - ), - Text( - "공지", - style: TextStyle( - fontSize: 24.0.sp, - color: LoturaColors.black, - fontWeight: FontWeight.bold, - ), - ), - ], + leading: IconButton( + padding: EdgeInsets.only(left: 24.0.r), + onPressed: () => Navigator.pop(context), + icon: Icon( + Icons.keyboard_arrow_left, + color: LoturaColors.black, + size: 30.0.r, + ), + ), + title: Text( + "공지", + style: TextStyle( + fontSize: 24.0.sp, + color: LoturaColors.black, + fontWeight: FontWeight.bold, + ), ), ), body: Padding( diff --git a/lib/presentation/setting_page/ui/view/setting_page.dart b/lib/presentation/setting_page/ui/view/setting_page.dart index 19db7d0f..377bbd35 100644 --- a/lib/presentation/setting_page/ui/view/setting_page.dart +++ b/lib/presentation/setting_page/ui/view/setting_page.dart @@ -1,10 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:lotura/presentation/setting_page/bloc/laundry_room_model.dart'; import 'package:lotura/presentation/setting_page/bloc/room_bloc.dart'; import 'package:lotura/presentation/setting_page/bloc/room_event.dart'; -import 'package:lotura/presentation/setting_page/bloc/room_state.dart'; import 'package:lotura/presentation/setting_page/ui/widget/setting_page_bottom_sheet.dart'; import 'package:lotura/presentation/utils/lotura_colors.dart'; import 'package:url_launcher/url_launcher.dart'; @@ -30,113 +28,83 @@ class _SettingPageState extends State { appBar: AppBar( backgroundColor: LoturaColors.gray100, elevation: 0.0, - leadingWidth: 300.0.w, - leading: Row( - children: [ - IconButton( - padding: EdgeInsets.only(left: 24.0.w, right: 12.0.w), - onPressed: () => Navigator.pop(context), - icon: Icon( - Icons.keyboard_arrow_left, - color: LoturaColors.black, - size: 24.0.w, - ), - ), - Text( - "설정", - style: TextStyle(fontSize: 24.0.sp, color: LoturaColors.black), - ), - ], + toolbarHeight: 90.0.r, + leading: IconButton( + padding: EdgeInsets.only(left: 24.0.r), + onPressed: () => Navigator.pop(context), + icon: Icon( + Icons.keyboard_arrow_left, + color: LoturaColors.black, + size: 30.0.r, + ), + ), + title: Text( + "설정", + style: TextStyle( + fontSize: 24.0.sp, + color: LoturaColors.black, + fontWeight: FontWeight.bold, + ), ), ), body: Padding( - padding: EdgeInsets.only( - left: 24.0.w, - right: 24.0.w, - top: 12.0.h, - bottom: 12.0.h, + padding: EdgeInsets.symmetric( + horizontal: 24.0.r, + vertical: 12.0.r, ), child: Column( children: [ - Padding( - padding: EdgeInsets.all(12.0.r), + GestureDetector( + onTap: () => showModalBottomSheet( + context: context, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.vertical( + top: Radius.circular(24.r), + ), + ), + backgroundColor: LoturaColors.white, + builder: (context) { + context.read().add(GetRoomIndexEvent()); + return const SettingPageBottomSheet(); + }), + behavior: HitTestBehavior.translucent, child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text( - "메인 세탁실 설정", - style: TextStyle(fontSize: 16.0.sp), + Flexible( + child: Text( + "메인 세탁실 설정", + style: TextStyle(fontSize: 18.0.sp), + overflow: TextOverflow.ellipsis, + ), ), - Row( - children: [ - BlocBuilder>( - builder: (context, state) { - return switch (state) { - Initial() => const SizedBox.shrink(), - Changed() => GestureDetector( - onTap: () => showModalBottomSheet( - context: context, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.vertical( - top: Radius.circular(24.r), - ), - ), - backgroundColor: LoturaColors.white, - builder: (context) => - SettingPageBottomSheet( - initialIndex: - state.value.roomLocation.index, - )), - child: Text( - state.value.roomLocation.roomName, - style: TextStyle( - fontSize: 16.0.sp, - color: LoturaColors.primary700, - ), - ), - ), - }; - }, - ), - SizedBox(width: 12.0.w), - Icon( - Icons.keyboard_arrow_right, - color: LoturaColors.gray300, - size: 24.0.r, - ), - ], + Icon( + Icons.keyboard_arrow_right, + color: LoturaColors.gray300, + size: 30.0.r, ), ], ), ), - SizedBox(height: 12.0.h), - Padding( - padding: EdgeInsets.all(12.0.r), - child: GestureDetector( - onTap: () async { - await launchUrl( - Uri.parse('https://open.kakao.com/o/sHjnH1Se'), - mode: LaunchMode.externalApplication); - }, - child: Container( - width: double.infinity, - height: 30.0.r, - color: Colors.transparent, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - "문의하기", - style: TextStyle(fontSize: 16.0.sp), - ), - Icon( - Icons.keyboard_arrow_right, - color: LoturaColors.gray300, - size: 24.0.r, - ), - ], + SizedBox(height: 30.0.r), + GestureDetector( + onTap: () async => await launchUrl( + Uri.parse('https://open.kakao.com/o/sHjnH1Se'), + mode: LaunchMode.externalApplication), + behavior: HitTestBehavior.translucent, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "문의하기", + style: TextStyle(fontSize: 18.0.sp), + ), + Icon( + Icons.keyboard_arrow_right, + color: LoturaColors.gray300, + size: 30.0.r, ), - ), + ], ), ), ], diff --git a/lib/presentation/setting_page/ui/widget/setting_page_bottom_sheet.dart b/lib/presentation/setting_page/ui/widget/setting_page_bottom_sheet.dart index 9499fabe..92b18ffd 100644 --- a/lib/presentation/setting_page/ui/widget/setting_page_bottom_sheet.dart +++ b/lib/presentation/setting_page/ui/widget/setting_page_bottom_sheet.dart @@ -9,160 +9,110 @@ import 'package:lotura/presentation/setting_page/bloc/room_state.dart'; import 'package:lotura/presentation/utils/lotura_colors.dart'; class SettingPageBottomSheet extends StatelessWidget { - final int initialIndex; - - const SettingPageBottomSheet({super.key, required this.initialIndex}); + const SettingPageBottomSheet({super.key}); @override Widget build(BuildContext context) { return BlocBuilder>( - builder: (context, state) { - if (state is Initial) { - context.read().add(GetRoomIndexEvent()); - return const SizedBox.shrink(); - } else if (state is Changed) { - return Container( - padding: EdgeInsets.only( - top: 22.0.h, - left: 24.0.w, - right: 24.0.w, - bottom: 12.0.h, - ), - height: 310.h, - decoration: const BoxDecoration( - color: LoturaColors.white, - borderRadius: BorderRadius.only( - topLeft: Radius.circular(20.0), - topRight: Radius.circular(20.0)), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "메인 세탁실 설정", - style: TextStyle( - color: LoturaColors.black, - fontWeight: FontWeight.w600, - fontSize: 20.0.sp), - ), - SizedBox(height: 4.0.h), - Text( - "세탁실 탭에서 처음에 보여질 세탁실을 선택해보세요.", - style: TextStyle(fontSize: 16.0.sp, color: LoturaColors.black), + builder: (context, state) { + return switch (state) { + Initial() => const SizedBox.shrink(), + Changed() => Container( + padding: EdgeInsets.all(24.0.r), + decoration: const BoxDecoration( + color: LoturaColors.white, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(20.0), + topRight: Radius.circular(20.0)), ), - SizedBox(height: 24.0.h), - GestureDetector( - onTap: () => context.read().add(UpdateRoomIndexEvent( - roomLocation: RoomLocation.schoolSide)), - child: Container( - width: 382.0.w, - height: 48.0.h, - decoration: BoxDecoration( - color: state.value.roomLocation == RoomLocation.schoolSide - ? LoturaColors.gray100 - : LoturaColors.white, - borderRadius: BorderRadius.circular(8.0), - ), - padding: EdgeInsets.all(12.0.r), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - "남자 학교측", - style: TextStyle( - fontSize: 16.0.sp, + child: Wrap( + children: [ + FittedBox( + fit: BoxFit.scaleDown, + child: Text( + "메인 세탁실 설정", + style: TextStyle( color: LoturaColors.black, - ), - ), - Icon( - Icons.check, - size: 24.0.r, - color: - state.value.roomLocation == RoomLocation.schoolSide - ? LoturaColors.black - : LoturaColors.white, - ), - ], + fontWeight: FontWeight.w600, + fontSize: 30.0.sp), + ), ), - ), - ), - GestureDetector( - onTap: () => context.read().add(UpdateRoomIndexEvent( - roomLocation: RoomLocation.dormitorySide)), - child: Container( - width: 382.0.w, - height: 48.0.h, - decoration: BoxDecoration( - color: - state.value.roomLocation == RoomLocation.dormitorySide - ? LoturaColors.gray100 - : LoturaColors.white, - borderRadius: BorderRadius.circular(8.0), + SizedBox(height: 4.0.h), + FittedBox( + fit: BoxFit.scaleDown, + child: Text( + "세탁실 탭에서 처음에 보여질 세탁실을 선택해보세요.", + style: TextStyle( + fontSize: 25.0.sp, color: LoturaColors.black), + ), ), - padding: EdgeInsets.all(12.0.r), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - "남자 기숙사측", - style: TextStyle( - fontSize: 16.0.sp, - color: LoturaColors.black, - ), - ), - Icon( - Icons.check, - size: 24.0.r, - color: state.value.roomLocation == - RoomLocation.dormitorySide - ? LoturaColors.black - : LoturaColors.white, - ), - ], + CheckButton( + currentRoomLocation: state.value.roomLocation, + roomLocation: RoomLocation.schoolSide, ), - ), - ), - GestureDetector( - onTap: () => context.read().add( - UpdateRoomIndexEvent(roomLocation: RoomLocation.womanRoom)), - child: Container( - width: 382.0.w, - height: 48.0.h, - decoration: BoxDecoration( - color: state.value.roomLocation == RoomLocation.womanRoom - ? LoturaColors.gray100 - : LoturaColors.white, - borderRadius: BorderRadius.circular(8.0), + CheckButton( + currentRoomLocation: state.value.roomLocation, + roomLocation: RoomLocation.dormitorySide, ), - padding: EdgeInsets.all(12.0.r), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - "여자", - style: TextStyle( - fontSize: 16.0.sp, - color: LoturaColors.black, - ), - ), - Icon( - Icons.check, - size: 24.0.r, - color: - state.value.roomLocation == RoomLocation.womanRoom - ? LoturaColors.black - : LoturaColors.white, - ), - ], + CheckButton( + currentRoomLocation: state.value.roomLocation, + roomLocation: RoomLocation.womanRoom, ), + ], + ), + ), + }; + }, + ); + } +} + +class CheckButton extends StatelessWidget { + const CheckButton({ + super.key, + required this.currentRoomLocation, + required this.roomLocation, + }); + + final RoomLocation roomLocation, currentRoomLocation; + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => context + .read() + .add(UpdateRoomIndexEvent(roomLocation: roomLocation)), + child: Container( + decoration: BoxDecoration( + color: currentRoomLocation == roomLocation + ? LoturaColors.gray100 + : LoturaColors.white, + borderRadius: BorderRadius.circular(8.0.r), + ), + padding: EdgeInsets.all(12.0.r), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + child: Text( + roomLocation.roomName, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 16.0.sp, + color: LoturaColors.black, ), ), - ], - ), - ); - } else { - return const SizedBox.shrink(); - } - }); + ), + Icon( + Icons.check, + size: 24.0.r, + color: currentRoomLocation == roomLocation + ? LoturaColors.black + : LoturaColors.white, + ), + ], + ), + ), + ); } } diff --git a/lib/presentation/utils/machine_button.dart b/lib/presentation/utils/machine_button.dart index 67f89349..f626a8b0 100644 --- a/lib/presentation/utils/machine_button.dart +++ b/lib/presentation/utils/machine_button.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:lotura/presentation/utils/lotura_colors.dart'; +import 'package:lotura/presentation/utils/lotura_icons.dart'; import 'package:lotura/presentation/utils/machine_widget.dart'; class MachineButton extends MachineWidget { @@ -17,107 +18,95 @@ class MachineButton extends MachineWidget { Widget build(BuildContext context) { return isEmptyContainer ? Container( + padding: EdgeInsets.all(12.0.r), constraints: BoxConstraints( - maxWidth: 180.0.r, + minWidth: 150.0.w, + maxWidth: 185.0.w, ), decoration: BoxDecoration( - color: Colors.transparent, - borderRadius: BorderRadius.circular(16.0), - ), - child: Padding( - padding: EdgeInsets.all(12.0.r), - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Container( - width: 32.0.r, - height: 32.0.r, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: Colors.transparent, - border: - Border.all(color: Colors.transparent, width: 2), - ), - child: Icon(Icons.ac_unit, - size: 20.0.r, color: Colors.transparent), - ), - Text("12번", - style: TextStyle( - fontSize: 16.0.sp, color: Colors.transparent)), - ], + color: Colors.transparent, + borderRadius: BorderRadius.circular(16.0), + border: Border.all(color: Colors.transparent)), + child: Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + width: 32.0.r, + height: 32.0.r, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.transparent, + border: Border.all(color: Colors.transparent, width: 2), ), - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Text("세탁기", - style: TextStyle( - fontSize: 15.0.sp, color: Colors.transparent)), - SizedBox(width: 5.0.r), - Icon( - Icons.abc, - size: 20.0.r, - color: Colors.transparent, - ), - ], - ), - ], - ), + child: Icon(LoturaIcons.dry, + size: 20.0.r, color: Colors.transparent), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text("12번", + style: TextStyle( + fontSize: 16.0.sp, color: Colors.transparent)), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Text("세탁기", + style: TextStyle( + fontSize: 15.0.sp, color: Colors.transparent)), + ], + ), + ], + ), + ], ), ) : GestureDetector( onTap: () => showModalOSJBottomSheet(context: context), child: Container( + padding: EdgeInsets.all(12.0.r), constraints: BoxConstraints( - maxWidth: 180.0.r, + minWidth: 150.0.w, + maxWidth: 185.0.w, ), decoration: BoxDecoration( color: state.color, borderRadius: BorderRadius.circular(16.0), border: Border.all(color: LoturaColors.gray200)), - child: Padding( - padding: EdgeInsets.all(12.0.r), - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Container( - width: 32.0.r, - height: 32.0.r, - decoration: BoxDecoration( - shape: BoxShape.circle, - color: state.color, - border: Border.all( - color: state.deviceIconColor, width: 2), - ), - child: Icon(deviceType.icon, - size: 20.0.r, color: state.deviceIconColor), - ), - Text("${isWoman ? deviceId - 31 : deviceId}번", - style: TextStyle(fontSize: 16.0.sp)), - ], - ), - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Text(deviceType.text, - style: TextStyle(fontSize: 15.0.sp)), - SizedBox(width: 5.0.r), - Icon( - state.icon, - size: 20.0.r, - color: state.deepColor, - ), - ], + child: Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + width: 32.0.r, + height: 32.0.r, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: state.color, + border: + Border.all(color: state.deviceIconColor, width: 2), ), - ], - ), + child: Icon(deviceType.icon, + size: 20.0.r, color: state.deviceIconColor), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text("${isWoman ? deviceId - 31 : deviceId}번", + style: TextStyle( + fontSize: 15.0.sp, fontWeight: FontWeight.w500)), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Text(deviceType.text, + style: TextStyle(fontSize: 14.0.sp)), + ], + ), + ], + ), + ], ), ), ); diff --git a/lib/presentation/utils/machine_card.dart b/lib/presentation/utils/machine_card.dart index 62c54966..04ae1e34 100644 --- a/lib/presentation/utils/machine_card.dart +++ b/lib/presentation/utils/machine_card.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:lotura/presentation/utils/machine_widget.dart'; -import 'package:lotura/presentation/utils/osj_status_button.dart'; class MachineCard extends MachineWidget { const MachineCard({ @@ -16,44 +15,83 @@ class MachineCard extends MachineWidget { @override Widget build(BuildContext context) { return isEmptyContainer - ? SizedBox(width: 185.0.w, height: 256.0.h) + ? Container( + width: 170.0.r, + padding: EdgeInsets.only(top: 10.0.r), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(16.0), + color: Colors.transparent, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Image.asset( + deviceType.imagePath, + width: 100.0.r, + height: 100.0.r, + color: Colors.transparent, + ), + Text( + "12번 건조기", + textScaler: TextScaler.noScaling, + style: TextStyle( + fontSize: 20.0.sp, + fontWeight: FontWeight.w500, + color: Colors.transparent), + ), + Container( + padding: EdgeInsets.all(8.0.r), + child: Text( + "고장", + textAlign: TextAlign.center, + textScaler: TextScaler.noScaling, + style: TextStyle( + color: Colors.transparent, + fontSize: 20.0.sp, + ), + ), + ), + ], + ), + ) : GestureDetector( onTap: () => showModalOSJBottomSheet(context: context), child: Container( - width: 185.0.w, - height: 256.0.h, + width: 170.0.r, + padding: EdgeInsets.only(top: 10.0.r), decoration: BoxDecoration( borderRadius: BorderRadius.circular(16.0), color: Colors.white, ), child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.center, children: [ - SizedBox(height: 24.0.h), Image.asset( deviceType.imagePath, - width: 120.0.r, - height: 120.0.r, + width: 100.0.r, + height: 100.0.r, ), - SizedBox(height: 12.0.h), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - "${isWoman ? deviceId - 31 : deviceId}번 ", - style: TextStyle( - fontSize: 16.0.sp, - fontWeight: FontWeight.w500, - ), - ), - Text( - deviceType.text, - style: TextStyle(fontSize: 16.0.sp), - ), - ], + Text( + "${isWoman ? deviceId - 31 : deviceId}번 ${deviceType.text}", + textScaler: TextScaler.noScaling, + style: TextStyle( + fontSize: 20.0.sp, + fontWeight: FontWeight.w500, + ), ), - SizedBox(height: 12.0.h), - OSJStatusButton( - state: state, + Container( + padding: EdgeInsets.all(8.0.r), + child: Text( + state.text, + textAlign: TextAlign.center, + textScaler: TextScaler.noScaling, + style: TextStyle( + color: state.deepColor, + fontSize: 20.0.sp, + ), + ), ), ], ), diff --git a/lib/presentation/utils/osj_bottom_sheet.dart b/lib/presentation/utils/osj_bottom_sheet.dart index bf770705..b1d49927 100644 --- a/lib/presentation/utils/osj_bottom_sheet.dart +++ b/lib/presentation/utils/osj_bottom_sheet.dart @@ -77,65 +77,65 @@ class _OSJBottomSheetState extends State { return Future(() => true); }, child: Container( - height: widget.state == CurrentState.working ? 220.0.h : 268.0.h, + padding: EdgeInsets.symmetric(vertical: 32.0.r, horizontal: 24.0.r), decoration: const BoxDecoration( color: LoturaColors.white, borderRadius: BorderRadius.only( topLeft: Radius.circular(20.0), topRight: Radius.circular(20.0)), ), - child: Padding( - padding: EdgeInsets.only( - left: 24.0.w, - right: 24.0.w, - top: 32.0.h, - bottom: 12.0.h, - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - widget.state == CurrentState.working - ? const SizedBox.shrink() - : Icon( - widget.state.icon, - size: 24.0.r, - color: widget.state == CurrentState.available - ? LoturaColors.green700 - : widget.state == CurrentState.disconnected - ? LoturaColors.black - : LoturaColors.red700, + child: Wrap( + children: [ + Padding( + padding: EdgeInsets.only(bottom: 24.0.r), + child: FittedBox( + fit: BoxFit.scaleDown, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (widget.state != CurrentState.working) + Icon( + widget.state.icon, + size: 24.0.r, + color: widget.state == CurrentState.available + ? LoturaColors.green700 + : widget.state == CurrentState.disconnected + ? LoturaColors.black + : LoturaColors.red700, + ), + SizedBox(height: 10.0.r), + Text( + text(widget.isEnableNotification, widget.isWoman, + widget.state), + style: TextStyle( + color: Colors.black, + fontSize: 22.0.sp, + fontWeight: FontWeight.w600, + ), ), - Padding( - padding: widget.state == CurrentState.working - ? EdgeInsets.only(bottom: 24.0.h) - : EdgeInsets.only(top: 24.0.h, bottom: 24.0.h), - child: Text( - text(widget.isEnableNotification, widget.isWoman, - widget.state), - style: TextStyle( - color: Colors.black, - fontSize: 22.0.sp, - fontWeight: FontWeight.w600, - ), + ], ), ), - widget.state == CurrentState.working - ? Row( - children: [ - OSJTextButton( + ), + widget.state == CurrentState.working + ? Row( + children: [ + Expanded( + child: OSJTextButton( function: () { Navigator.of(context).pop(); context .read() .add(ClosingBottomSheetEvent()); }, - width: 185.0.w, - height: 56.0.h, - fontSize: 16.0.sp, + fontSize: 14.0.sp, color: LoturaColors.gray100, fontColor: LoturaColors.black, + padding: EdgeInsets.symmetric(vertical: 15.0.r), text: "취소"), - SizedBox(width: 12.0.w), - OSJTextButton( + ), + SizedBox(width: 16.0.r), + Expanded( + child: OSJTextButton( function: () { widget.isEnableNotification ? context.read().add(SendFCMEvent( @@ -151,33 +151,27 @@ class _OSJBottomSheetState extends State { .add(ClosingBottomSheetEvent()); Navigator.pop(context); }, - width: 185.0.w, - height: 56.0.h, - fontSize: 16.0.sp, + fontSize: 14.0.sp, color: LoturaColors.primary700, fontColor: LoturaColors.white, + padding: EdgeInsets.symmetric(vertical: 15.0.r), text: widget.isEnableNotification ? "알림 설정" : "알림 해제"), - ], - ) - : Center( - child: OSJTextButton( - function: () { - context - .read() - .add(ClosingBottomSheetEvent()); - Navigator.of(context).pop(); - }, - width: 382.0.w, - height: 56.0.h, - fontSize: 16.0.sp, - color: LoturaColors.gray100, - fontColor: LoturaColors.black, - text: "확인"), - ), - ], - ), + ), + ], + ) + : OSJTextButton( + function: () { + context.read().add(ClosingBottomSheetEvent()); + Navigator.of(context).pop(); + }, + fontSize: 16.0.sp, + color: LoturaColors.gray100, + fontColor: LoturaColors.black, + padding: EdgeInsets.symmetric(vertical: 15.0.r), + text: "확인"), + ], ), ), ); diff --git a/lib/presentation/utils/osj_status_button.dart b/lib/presentation/utils/osj_status_button.dart deleted file mode 100644 index af193fbd..00000000 --- a/lib/presentation/utils/osj_status_button.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:lotura/main.dart'; -import 'package:lotura/presentation/utils/lotura_colors.dart'; - -class OSJStatusButton extends StatelessWidget { - OSJStatusButton({ - super.key, - required this.state, - }); - - final CurrentState state; - - final Map stateColor = { - CurrentState.available: LoturaColors.green100, - CurrentState.working: LoturaColors.primary100, - CurrentState.disconnected: LoturaColors.gray300, - CurrentState.breakdown: LoturaColors.red100, - }; - - @override - Widget build(BuildContext context) { - return Container( - width: 80.0.w, - height: 32.0.h, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(100.0), - color: stateColor[state], - ), - child: Center( - child: Text( - state.text, - style: TextStyle( - color: state.deepColor, - fontSize: 14.0.sp, - ), - ), - ), - ); - } -} diff --git a/lib/presentation/utils/osj_text_button.dart b/lib/presentation/utils/osj_text_button.dart index 9deaf767..6f5dfc84 100644 --- a/lib/presentation/utils/osj_text_button.dart +++ b/lib/presentation/utils/osj_text_button.dart @@ -1,5 +1,5 @@ +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_screenutil/flutter_screenutil.dart'; class OSJTextButton extends StatelessWidget { const OSJTextButton( @@ -11,6 +11,7 @@ class OSJTextButton extends StatelessWidget { this.width, this.height, this.function, + this.padding = EdgeInsets.zero, this.radius = 16.0}); final double? width, height; @@ -18,6 +19,7 @@ class OSJTextButton extends StatelessWidget { final Color color, fontColor; final String text; final VoidCallback? function; + final EdgeInsets padding; @override Widget build(BuildContext context) { @@ -26,7 +28,7 @@ class OSJTextButton extends StatelessWidget { child: Container( width: width, height: height, - padding: EdgeInsets.symmetric(horizontal: 5.0.r), + padding: padding, decoration: BoxDecoration( color: color, borderRadius: BorderRadius.circular(radius), diff --git a/pubspec.yaml b/pubspec.yaml index 674b5f80..3eca217f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 3.4.1+23 +version: 3.5.0+24 environment: sdk: '>=3.1.3 <4.0.0'