diff --git a/android/.gitignore b/android/.gitignore index 6f56801..e89713b 100644 --- a/android/.gitignore +++ b/android/.gitignore @@ -11,3 +11,4 @@ GeneratedPluginRegistrant.java key.properties **/*.keystore **/*.jks +/keystore \ No newline at end of file diff --git a/android/app/build.gradle b/android/app/build.gradle index be9bd90..42ac03a 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 = '1' + flutterVersionCode = '2' } def flutterVersionName = localProperties.getProperty('flutter.versionName') if (flutterVersionName == null) { - flutterVersionName = '1.0' + flutterVersionName = '1.1' } apply plugin: 'com.android.application' @@ -56,12 +56,26 @@ android { versionName flutterVersionName multiDexEnabled true } + def keystoreProperties = new Properties() + def keystorePropertiesFile = rootProject.file('key.properties') + if (keystorePropertiesFile.exists()) { + keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) + } + + android { + signingConfigs { + release { + storeFile file('../keystore/key.jks') + storePassword file('../keystore/keystore.password').text.trim() + keyPassword file('../keystore/keystore.password').text.trim() + keyAlias 'key' + } + } - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig signingConfigs.debug + buildTypes { + release { + signingConfig signingConfigs.release + } } } } @@ -72,7 +86,11 @@ flutter { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation 'com.google.firebase:firebase-analytics' - implementation platform('com.google.firebase:firebase-bom:26.2.0') + implementation ('com.google.firebase:firebase-analytics'){ + exclude group: 'com.google.android.gms', module: 'play-services-safetynet' + } + implementation platform('com.google.firebase:firebase-bom:26.2.0'){ + exclude group: 'com.google.android.gms', module: 'play-services-safetynet' + } implementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava' } diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 2d34af5..d94eaf0 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -8,14 +8,15 @@ + + android:name="com.naver.maps.map.CLIENT_ID" + android:value="@string/naver_client_id" /> @@ -58,7 +59,7 @@ - + android:value="@string/client_name" /> --> diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index db77bb4..9947bb0 100644 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 17987b7..64a6804 100644 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 09d4391..a31f0b4 100644 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index d5f1c8d..d3ceb50 100644 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 4d6372e..ccf9170 100644 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 6dd5f2e..80f6dab 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -1,6 +1,9 @@ - BPenPrJFNA58FMnODujH - Dh1BA99PHE + + 8e3d26kxv8 + 라이딩 파트너 in 시흥 + + 6k41yNPjeQ4fHEKRVS75hZlcJRFdK8Y2hAOW3ut1 a AIzaSyCj32TmD4nqA_LjVQh2ePvGMT3jFkBjJBE \ No newline at end of file diff --git a/assets/config/.env b/assets/config/.env index 2e9c116..932045b 100644 --- a/assets/config/.env +++ b/assets/config/.env @@ -2,7 +2,6 @@ apiKey = 'WPe9pXWK0UdfrLNeUEzGzyNVmzOkMV5652NCfgvYT2bT38EipPBRjygmGQJuPUSmx4R7U3 endPointUrl = 'apis.data.go.kr' path = '/1360000/VilageFcstInfoService_2.0/getUltraSrtFcst' KAKAO_NATIVE_APP_KEY = 'b50ae09d3f49b62c4fba3b875e1b3458' -googleApiKey = 'AIzaSyC3Fs8c3EgsidmnrpsKecNgZKFkjcNdWmM' KAKAO_REST_API_KEY = '3e9ec562133e4e4512f3b58671e15680' openWeatherApiKey = 'aad4827650d553baf66f95d688d9688b' openWeatherApiBaseUrl = 'https://api.openweathermap.org/data/2.5/weather' \ No newline at end of file diff --git a/assets/images/places/baegot_park.jpeg b/assets/images/places/baegot_park.jpeg deleted file mode 100644 index 01fe818..0000000 Binary files a/assets/images/places/baegot_park.jpeg and /dev/null differ diff --git a/assets/images/places/daebu_island.jpeg b/assets/images/places/daebu_island.jpeg deleted file mode 100644 index 755fc14..0000000 Binary files a/assets/images/places/daebu_island.jpeg and /dev/null differ diff --git a/assets/images/places/gojan_station.png b/assets/images/places/gojan_station.png deleted file mode 100644 index ca9d8e7..0000000 Binary files a/assets/images/places/gojan_station.png and /dev/null differ diff --git a/assets/images/places/greenway.jpeg b/assets/images/places/greenway.jpeg deleted file mode 100644 index 9a55d55..0000000 Binary files a/assets/images/places/greenway.jpeg and /dev/null differ diff --git a/assets/images/places/hwajeong_river.jpeg b/assets/images/places/hwajeong_river.jpeg deleted file mode 100644 index bdf4f06..0000000 Binary files a/assets/images/places/hwajeong_river.jpeg and /dev/null differ diff --git a/assets/images/places/oido_station.jpeg b/assets/images/places/oido_station.jpeg deleted file mode 100644 index be48a7e..0000000 Binary files a/assets/images/places/oido_station.jpeg and /dev/null differ diff --git a/assets/images/places/oido_station.png b/assets/images/places/oido_station.png deleted file mode 100644 index 82eafc1..0000000 Binary files a/assets/images/places/oido_station.png and /dev/null differ diff --git a/assets/images/places/okgu_park.jpeg b/assets/images/places/okgu_park.jpeg deleted file mode 100644 index 725d195..0000000 Binary files a/assets/images/places/okgu_park.jpeg and /dev/null differ diff --git a/assets/images/places/picture_jeongwang_sports_park.jpeg b/assets/images/places/picture_jeongwang_sports_park.jpeg new file mode 100644 index 0000000..f1cd0dc Binary files /dev/null and b/assets/images/places/picture_jeongwang_sports_park.jpeg differ diff --git a/assets/images/places/picture_misaeng's_bridge_2.jpg b/assets/images/places/picture_misaeng's_bridge_2.jpg new file mode 100644 index 0000000..c9ffb6a Binary files /dev/null and b/assets/images/places/picture_misaeng's_bridge_2.jpg differ diff --git a/assets/images/places/picture_wolgot_station.JPG b/assets/images/places/picture_wolgot_station.JPG new file mode 100644 index 0000000..f75ab75 Binary files /dev/null and b/assets/images/places/picture_wolgot_station.JPG differ diff --git a/assets/images/places/wolgot_port.jpeg b/assets/images/places/wolgot_port.jpeg deleted file mode 100644 index c5f6d3e..0000000 Binary files a/assets/images/places/wolgot_port.jpeg and /dev/null differ diff --git a/assets/json/place.json b/assets/json/place.json index 1b53c15..51a14e3 100644 --- a/assets/json/place.json +++ b/assets/json/place.json @@ -12,16 +12,16 @@ "description": "한국관광공사 사진 갤러리, 촬영자 박윤준" }, { - "id": "1199341197", - "title": "갯골생태공원\n벚꽃터널", + "id": "FOhqoDZZ", + "title": "갯골생태공원 벚꽃터널", "image": "assets/images/places/picture_gaetgol_ecological_park.jpg", "marker": "", - "type": "", - "latitude": "37.3889771", - "longitude": "126.7804387", - "jibunAddress": "경기도 시흥시 장곡동 724-10", - "roadAddress": "경기도 시흥시 동서로 287", - "description": "" + "type": "park", + "latitude": "37.390592483462605", + "longitude": "126.78099832254267", + "jibunAddress": "경기 시흥시 장곡동 724-32", + "roadAddress": "", + "description": "한국관광공사 사진 갤러리, 촬영자 박윤준" }, { "id": "1903881322", @@ -74,14 +74,14 @@ { "id": "", "title": "미생의 다리", - "image": "assets/images/places/picture_misaeng's_bridge.jpg", + "image": "assets/images/places/picture_misaeng's_bridge_2.jpg", "marker": "assets/icons/place_park.png", "type": "park", "latitude": "37.399584399999995", "longitude": "126.75299469999999", "jibunAddress": "경기도 시흥시 방산동 서해안로 779-43 미생의 다리", "roadAddress": "", - "description": "경기관광공사에 허락맡기" + "description": "한국관광공사 미생의 다리" }, { "id": "35795149", @@ -180,14 +180,14 @@ { "id": "21805866", "title": "월곶역 자전거 대여소", - "image": "assets/images/places/gojan_station.png", + "image": "assets/images/places/picture_wolgot_station.JPG", "marker": "assets/icons/place_rental.png", "type": "rental", - "latitude": "37.3168245", - "longitude": "126.8234083", - "jibunAddress": "경기도 안산시 단원구 고잔동 453-53", - "roadAddress": "경기도 안산시 단원구 중앙대로 784 고잔역", - "description": "" + "latitude": "37.391705626349", + "longitude": "126.74264340883", + "jibunAddress": "경기도 시흥시 월곶동 992-8", + "roadAddress": "경기도 시흥시 월곶중앙로14번길 56", + "description": "교통평론가 한우진 - 출처 표기 요청" }, { "id": "13491554", @@ -215,13 +215,13 @@ { "id": "18254017", "title": "정왕동 체육공원", - "image": "assets/images/places/tukorea.jpeg", + "image": "assets/images/places/picture_jeongwang_sports_park.jpeg", "marker": "assets/icons/place_park.png", "type": "park", "latitude": "37.3395459", "longitude": "126.7579547", "jibunAddress": "경기도 시흥시 정왕동 2158", "roadAddress": "경기도 시흥시 역전로 50 시흥시 배드민턴장", - "description": "" + "description": "한국관광공사 정왕체육공원" } ] \ No newline at end of file diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 20b7925..1b4fa5d 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -3,14 +3,14 @@ archiveVersion = 1; classes = { }; - objectVersion = 51; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 3D25AB6F477563FCA88DEC02 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4A34FC3369233F441B7104D4 /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 8B378DBFDD1BCDE2F935294A /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 960451B7C08E54343E3F28F8 /* Pods_Runner.framework */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; @@ -33,12 +33,13 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 3510079FFDE23BC55E1F77AF /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 4A34FC3369233F441B7104D4 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 5A0CA85F1439C7E4788BF5B7 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 669A09D55C9A390ED08FFC05 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 960451B7C08E54343E3F28F8 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -46,9 +47,8 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + D229FE4B371ACBFBB64E0CF4 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; E64E006816066BBA2F08784A /* GoogleService-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Runner/GoogleService-Info.plist"; sourceTree = ""; }; - F053357F9996A44BCEA85371 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - F77BDDAA17B612C28D72B706 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -56,21 +56,13 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 3D25AB6F477563FCA88DEC02 /* Pods_Runner.framework in Frameworks */, + 8B378DBFDD1BCDE2F935294A /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 3D34C0BAE883787B1B506866 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 4A34FC3369233F441B7104D4 /* Pods_Runner.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -90,7 +82,7 @@ 97C146EF1CF9000F007C117D /* Products */, E64E006816066BBA2F08784A /* GoogleService-Info.plist */, BA598395ACB5123D9C90ED27 /* Pods */, - 3D34C0BAE883787B1B506866 /* Frameworks */, + B432728D5C24869593730F66 /* Frameworks */, ); sourceTree = ""; }; @@ -117,12 +109,20 @@ path = Runner; sourceTree = ""; }; + B432728D5C24869593730F66 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 960451B7C08E54343E3F28F8 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; BA598395ACB5123D9C90ED27 /* Pods */ = { isa = PBXGroup; children = ( - 3510079FFDE23BC55E1F77AF /* Pods-Runner.debug.xcconfig */, - F77BDDAA17B612C28D72B706 /* Pods-Runner.release.xcconfig */, - F053357F9996A44BCEA85371 /* Pods-Runner.profile.xcconfig */, + D229FE4B371ACBFBB64E0CF4 /* Pods-Runner.debug.xcconfig */, + 669A09D55C9A390ED08FFC05 /* Pods-Runner.release.xcconfig */, + 5A0CA85F1439C7E4788BF5B7 /* Pods-Runner.profile.xcconfig */, ); path = Pods; sourceTree = ""; @@ -134,15 +134,15 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 6E07D0DE6A2D2A4A57C64BC3 /* [CP] Check Pods Manifest.lock */, + 80E9013C9BC2F79B78D33FA2 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - F0D3F30C4BDCF50470204166 /* [CP] Embed Pods Frameworks */, - B9CAE31D07D9D4D83E47FDF5 /* [CP] Copy Pods Resources */, + 3FC5F6C807A1D1556B6D5258 /* [CP] Embed Pods Frameworks */, + 58331A11A4351C7788B28AB1 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -203,6 +203,7 @@ /* Begin PBXShellScriptBuildPhase section */ 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -215,75 +216,76 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 6E07D0DE6A2D2A4A57C64BC3 /* [CP] Check Pods Manifest.lock */ = { + 3FC5F6C807A1D1556B6D5258 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + 58331A11A4351C7788B28AB1 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); - inputPaths = ( + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", ); - name = "Run Script"; - outputPaths = ( + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; }; - B9CAE31D07D9D4D83E47FDF5 /* [CP] Copy Pods Resources */ = { + 80E9013C9BC2F79B78D33FA2 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Copy Pods Resources"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - F0D3F30C4BDCF50470204166 /* [CP] Embed Pods Frameworks */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + inputPaths = ( ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + name = "Run Script"; + outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; /* End PBXShellScriptBuildPhase section */ @@ -382,6 +384,7 @@ DEVELOPMENT_TEAM = MY2M83WANL; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "라이딩 파트너 in 시흥"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -618,6 +621,7 @@ ENABLE_BITCODE = NO; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "i386 arm64"; INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "라이딩 파트너 in 시흥"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -745,6 +749,7 @@ DEVELOPMENT_TEAM = MY2M83WANL; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "라이딩 파트너 in 시흥"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/100.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/100.png new file mode 100644 index 0000000..09b8332 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/100.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/102.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/102.png new file mode 100644 index 0000000..a89b996 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/102.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png new file mode 100644 index 0000000..7942584 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png new file mode 100644 index 0000000..f9290b3 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png new file mode 100644 index 0000000..6da7959 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/128.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/128.png new file mode 100644 index 0000000..480bbbf Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/128.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/144.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/144.png new file mode 100644 index 0000000..e313e10 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/144.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/152.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/152.png new file mode 100644 index 0000000..cb2d2dd Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/152.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/16.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/16.png new file mode 100644 index 0000000..e842885 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/16.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png new file mode 100644 index 0000000..64ea0f5 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/167.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/172.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/172.png new file mode 100644 index 0000000..8f06d53 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/172.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png new file mode 100644 index 0000000..3ac6f95 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/196.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/196.png new file mode 100644 index 0000000..76a15ba Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/196.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/20.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/20.png new file mode 100644 index 0000000..8cf295e Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/20.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/216.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/216.png new file mode 100644 index 0000000..95f6885 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/216.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/256.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/256.png new file mode 100644 index 0000000..ff64970 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/256.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png new file mode 100644 index 0000000..b50e909 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/32.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/32.png new file mode 100644 index 0000000..f18a098 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/32.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png new file mode 100644 index 0000000..7cc5340 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/48.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/48.png new file mode 100644 index 0000000..c42b342 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/48.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/50.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/50.png new file mode 100644 index 0000000..37917a2 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/50.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/512.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/512.png new file mode 100644 index 0000000..cef98a1 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/512.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/55.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/55.png new file mode 100644 index 0000000..482d9fa Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/55.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png new file mode 100644 index 0000000..4a3d226 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png new file mode 100644 index 0000000..a1c29a7 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png new file mode 100644 index 0000000..d8c4c37 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/64.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/64.png new file mode 100644 index 0000000..cce7774 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/64.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/66.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/66.png new file mode 100644 index 0000000..61a85b5 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/66.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/72.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/72.png new file mode 100644 index 0000000..79d64c0 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/72.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/76.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/76.png new file mode 100644 index 0000000..0708b49 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/76.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png new file mode 100644 index 0000000..28b8f24 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png new file mode 100644 index 0000000..f7bf390 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/88.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/88.png new file mode 100644 index 0000000..2698e64 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/88.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/92.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/92.png new file mode 100644 index 0000000..3dce711 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/92.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json index d36b1fa..ffab254 100644 --- a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,122 +1 @@ -{ - "images" : [ - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@3x.png", - "scale" : "3x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@3x.png", - "scale" : "3x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@3x.png", - "scale" : "3x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@2x.png", - "scale" : "2x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@3x.png", - "scale" : "3x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@1x.png", - "scale" : "1x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@1x.png", - "scale" : "1x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@1x.png", - "scale" : "1x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@2x.png", - "scale" : "2x" - }, - { - "size" : "83.5x83.5", - "idiom" : "ipad", - "filename" : "Icon-App-83.5x83.5@2x.png", - "scale" : "2x" - }, - { - "size" : "1024x1024", - "idiom" : "ios-marketing", - "filename" : "Icon-App-1024x1024@1x.png", - "scale" : "1x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} +{"images":[{"size":"60x60","expected-size":"180","filename":"180.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"40x40","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"60x60","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"57x57","expected-size":"57","filename":"57.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"57x57","expected-size":"114","filename":"114.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"60","filename":"60.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"1024x1024","filename":"1024.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"72x72","expected-size":"72","filename":"72.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"76x76","expected-size":"152","filename":"152.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"50x50","expected-size":"100","filename":"100.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"76x76","expected-size":"76","filename":"76.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"50x50","expected-size":"50","filename":"50.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"72x72","expected-size":"144","filename":"144.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"40x40","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"83.5x83.5","expected-size":"167","filename":"167.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"20x20","expected-size":"20","filename":"20.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"idiom":"watch","filename":"172.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"38mm","scale":"2x","size":"86x86","expected-size":"172","role":"quickLook"},{"idiom":"watch","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"38mm","scale":"2x","size":"40x40","expected-size":"80","role":"appLauncher"},{"idiom":"watch","filename":"88.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"40mm","scale":"2x","size":"44x44","expected-size":"88","role":"appLauncher"},{"idiom":"watch","filename":"102.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"41mm","scale":"2x","size":"45x45","expected-size":"102","role":"appLauncher"},{"idiom":"watch","filename":"92.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"41mm","scale":"2x","size":"46x46","expected-size":"92","role":"appLauncher"},{"idiom":"watch","filename":"100.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"44mm","scale":"2x","size":"50x50","expected-size":"100","role":"appLauncher"},{"idiom":"watch","filename":"196.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"42mm","scale":"2x","size":"98x98","expected-size":"196","role":"quickLook"},{"idiom":"watch","filename":"216.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"44mm","scale":"2x","size":"108x108","expected-size":"216","role":"quickLook"},{"idiom":"watch","filename":"48.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"38mm","scale":"2x","size":"24x24","expected-size":"48","role":"notificationCenter"},{"idiom":"watch","filename":"55.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"42mm","scale":"2x","size":"27.5x27.5","expected-size":"55","role":"notificationCenter"},{"idiom":"watch","filename":"66.png","folder":"Assets.xcassets/AppIcon.appiconset/","subtype":"45mm","scale":"2x","size":"33x33","expected-size":"66","role":"notificationCenter"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"watch","role":"companionSettings","scale":"3x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"watch","role":"companionSettings","scale":"2x"},{"size":"1024x1024","expected-size":"1024","filename":"1024.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"watch-marketing","scale":"1x"},{"size":"128x128","expected-size":"128","filename":"128.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"256x256","expected-size":"256","filename":"256.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"128x128","expected-size":"256","filename":"256.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"256x256","expected-size":"512","filename":"512.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"32x32","expected-size":"32","filename":"32.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"512x512","expected-size":"512","filename":"512.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"16x16","expected-size":"16","filename":"16.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"1x"},{"size":"16x16","expected-size":"32","filename":"32.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"32x32","expected-size":"64","filename":"64.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"},{"size":"512x512","expected-size":"1024","filename":"1024.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"mac","scale":"2x"}]} \ No newline at end of file diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png deleted file mode 100644 index dc9ada4..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png deleted file mode 100644 index 28c6bf0..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png deleted file mode 100644 index 2ccbfd9..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100644 index f091b6b..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png deleted file mode 100644 index 4cde121..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100644 index d0ef06e..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png deleted file mode 100644 index dcdc230..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png deleted file mode 100644 index 2ccbfd9..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100644 index c8f9ed8..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100644 index a6d6b86..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100644 index a6d6b86..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100644 index 75b2d16..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100644 index c4df70d..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png deleted file mode 100644 index 6a84f41..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png deleted file mode 100644 index d0e1f58..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and /dev/null differ diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 5d5e823..f89579e 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -40,8 +40,10 @@ naverServiceAppName 라이딩 파트너 in 시흥 - googleMapApiKey - AIzaSyARG3LSKycrXF8VAYBX52hC0XcOwH_x_Rc + + NMFClientId + 8e3d26kxv8 + NSAppTransportSecurity @@ -79,7 +81,7 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleName - ridingpartner_flutter + 라이딩 파트너 in 시흥 CFBundlePackageType APPL CFBundleShortVersionString diff --git a/lib/src/models/place.dart b/lib/src/models/place.dart index e6e23b4..1ea557f 100644 --- a/lib/src/models/place.dart +++ b/lib/src/models/place.dart @@ -84,13 +84,6 @@ class NaverPlaceData { address!.add(Address.fromJson(v)); }); } - // if (json['all'] != null) { - // all = []; - // json['all'].forEach((v) { - // all!.add(All.fromJson(v)); - // }); - // developer.log("address 2 called"); - // } } Map toJson() { diff --git a/lib/src/models/position_stream.dart b/lib/src/models/position_stream.dart index 4be1fa4..bd49c6f 100644 --- a/lib/src/models/position_stream.dart +++ b/lib/src/models/position_stream.dart @@ -6,6 +6,7 @@ import 'package:geolocator/geolocator.dart'; class PositionStream { late LocationSettings locationSettings; static final PositionStream _instance = PositionStream._internal(); + late StreamSubscription _positionStream; static StreamController _controller = StreamController.broadcast(); static const int DISTANCE = 30; @@ -21,6 +22,7 @@ class PositionStream { //dispose void dispose() { _controller.close(); + _positionStream.cancel(); } PositionStream._internal() { @@ -52,10 +54,12 @@ class PositionStream { distanceFilter: DISTANCE, ); } - StreamSubscription positionStream = + _positionStream = Geolocator.getPositionStream(locationSettings: locationSettings) .listen((Position? pos) { - _controller.add(pos!); + if (pos != null) { + _controller.add(pos); + } }); } } diff --git a/lib/src/pages/day_record_page.dart b/lib/src/pages/day_record_page.dart index ad618bd..9a4df83 100644 --- a/lib/src/pages/day_record_page.dart +++ b/lib/src/pages/day_record_page.dart @@ -24,21 +24,29 @@ class _DayRecordPageState extends State { int activeIndex = 0; @override - Widget build(BuildContext context) { - _recordProvider = Provider.of(context); - num speed = 0; + void initState() { + // TODO: implement initState + super.initState(); + + Provider.of(context, listen: false).getRidingData(); + } - const textStyle = TextStyle( - fontSize: 18.5, - fontFamily: "Pretendard", - fontWeight: FontWeight.w400, - color: Color.fromARGB(255, 66, 66, 66)); + static const textStyle = TextStyle( + fontSize: 18.5, + fontFamily: "Pretendard", + fontWeight: FontWeight.w400, + color: Color.fromARGB(255, 66, 66, 66)); - const recordStyle = TextStyle( - fontSize: 18.5, - fontFamily: "Pretendard", - fontWeight: FontWeight.w500, - color: Color.fromARGB(255, 66, 66, 66)); + static const recordStyle = TextStyle( + fontSize: 18.5, + fontFamily: "Pretendard", + fontWeight: FontWeight.w500, + color: Color.fromARGB(255, 66, 66, 66)); + num speed = 0; + late List? images = _record.images; + @override + Widget build(BuildContext context) { + _recordProvider = Provider.of(context); Widget successWidget() => Scaffold( appBar: appBar(context), @@ -47,33 +55,35 @@ class _DayRecordPageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Stack(alignment: Alignment.bottomCenter, children: [ - if(_record.images != null && _record.images!.length > 1)...[ - CarouselSlider.builder( - options: CarouselOptions( - initialPage: 0, - viewportFraction: 1, - enlargeCenterPage: true, - onPageChanged: (index, reason) => setState(() { - activeIndex = index; - }), - ), - itemCount: _record.images!.length, - itemBuilder: (context, index, realIndex) { - final path = _record.images![index]; - return buildImage(path, index); - }, - )] else if(_record.images != null && _record.images!.length == 1)...[ - SizedBox( - width: double.infinity, - height: 240, - child: Image.network(_record.images![0], fit: BoxFit.cover)) - ] else...[ + if (images == null) ...[ SizedBox( - width: double.infinity, - height: 240, - child: Image.asset("assets/images/img_loading.png", fit: BoxFit.cover)) + width: double.infinity, + height: 240, + child: Image.asset("assets/images/img_loading.png", + fit: BoxFit.cover)) + ] else if (_recordProvider.record.images!.length == 1) ...[ + SizedBox( + width: double.infinity, + height: 240, + child: Image.network(_recordProvider.record.images![0], + fit: BoxFit.cover)) + ] else ...[ + CarouselSlider.builder( + options: CarouselOptions( + initialPage: 0, + viewportFraction: 1, + enlargeCenterPage: true, + onPageChanged: (index, reason) => setState(() { + activeIndex = index; + }), + ), + itemCount: images?.length, + itemBuilder: (context, index, realIndex) { + final path = _record.images![index]; + return buildImage(path); + }, + ) ], - Align(alignment: Alignment.bottomCenter, child: buildIndicator()) ]), Container( @@ -117,13 +127,26 @@ class _DayRecordPageState extends State { style: recordStyle), Text(timestampToText(_record.timestamp), style: recordStyle), - Text("${_record.distance / _record.timestamp} km/h", - style: recordStyle), - Text("${_record.distance / 1000} km", - style: recordStyle), + if (_record.timestamp != 0) ...[ + Text( + "${(_record.distance / _record.timestamp).toStringAsFixed(1)} km/h", + style: recordStyle) + ] else ...[ + const Text("0.0 km/h", style: recordStyle) + ], Text( - "${(hKcal * (_record.timestamp) / 3600).toStringAsFixed(1)} kcal", - style: recordStyle) + "${(_record.distance / 1000).toStringAsFixed(2)} km", + style: recordStyle), + if (_record.distance == 0) ...[ + const Text( + '0 kcal', + style: recordStyle, + ) + ] else ...[ + Text( + "${(hKcal * (_record.timestamp) / 3600).toStringAsFixed(1)} kcal", + style: recordStyle) + ] ], ), ), @@ -154,7 +177,6 @@ class _DayRecordPageState extends State { switch (_recordProvider.recordState) { case RecordState.loading: - _recordProvider.getRidingData(); return loadingWidget(); case RecordState.fail: return failWidget(); @@ -171,9 +193,10 @@ class _DayRecordPageState extends State { Widget loadingWidget() => Scaffold( appBar: appBar(context), resizeToAvoidBottomInset: false, - body: const CircularProgressIndicator( + body: const Center( + child: CircularProgressIndicator( color: Color.fromARGB(0xFF, 0xEE, 0x75, 0x00), - )); + ))); Widget failWidget() => Scaffold( appBar: appBar(context), @@ -182,7 +205,7 @@ class _DayRecordPageState extends State { child: Text('데이터를 불러오는 데에 실패했습니다'), )); - Widget buildImage(path, index) => Container( + Widget buildImage(path) => Container( width: double.infinity, height: 240, color: Colors.grey, diff --git a/lib/src/pages/home_page.dart b/lib/src/pages/home_page.dart index b976eb8..b0a4f9e 100644 --- a/lib/src/pages/home_page.dart +++ b/lib/src/pages/home_page.dart @@ -1,9 +1,8 @@ -import 'dart:developer' as developer; +import 'dart:ui' as ui; import 'package:flutter/material.dart'; import 'package:line_chart/charts/line-chart.widget.dart'; import 'package:line_chart/model/line-chart.model.dart'; -import 'package:percent_indicator/circular_percent_indicator.dart'; import 'package:provider/provider.dart'; import 'package:ridingpartner_flutter/src/models/place.dart'; import 'package:ridingpartner_flutter/src/models/record.dart'; @@ -49,15 +48,7 @@ class _HomePageState extends State late TabController _tabController; int state = 0; - List data = [ - LineChartModel(amount: 300, date: DateTime(2020, 1, 1)), - LineChartModel(amount: 200, date: DateTime(2020, 1, 2)), - LineChartModel(amount: 300, date: DateTime(2020, 1, 3)), - LineChartModel(amount: 500, date: DateTime(2020, 1, 4)), - LineChartModel(amount: 800, date: DateTime(2020, 1, 5)), - LineChartModel(amount: 200, date: DateTime(2020, 1, 6)), - LineChartModel(amount: 120, date: DateTime(2020, 1, 7)), - ]; + List data = []; // int _counter = 0; @@ -76,6 +67,7 @@ class _HomePageState extends State fontSize: 14, fontWeight: FontWeight.w400, color: Color.fromARGB(185, 51, 57, 62)); + GlobalKey _one = GlobalKey(); @override Widget build(BuildContext context) { @@ -416,7 +408,9 @@ class _HomePageState extends State child: const Text('라이딩한 기록이 없습니다'), ); } else { - Data distance = Data('거리', '${record.distance / 1000}km', + Data distance = Data( + '거리', + '${((record.distance / 10).roundToDouble()) / 100}km', 'assets/icons/home_distance.png'); Data time = Data('시간', timestampToText(record.timestamp), 'assets/icons/home_time.png'); @@ -430,7 +424,9 @@ class _HomePageState extends State } catch (e) { speed = Data('평균 속도', '0km/h', 'assets/icons/home_speed.png'); } - Data speedMax = Data('순간 최고 속도', '${record.topSpeed}m/s', + Data speedMax = Data( + '순간 최고 속도', + '${record.topSpeed.toStringAsFixed(1)} km/h', 'assets/icons/home_max_speed.png'); return Container( @@ -548,12 +544,6 @@ class _HomePageState extends State fontFamily: 'Pretendard', fontWeight: FontWeight.w700, color: Color.fromRGBO(51, 51, 51, 1))), - // Text('km', - // style: TextStyle( - // fontSize: 12, - // fontFamily: 'Pretendard', - // fontWeight: FontWeight.w300, - // color: Color.fromRGBO(51, 51, 51, 1))), ], ), Container( @@ -586,7 +576,7 @@ class _HomePageState extends State color: Color.fromRGBO(51, 51, 51, 1))), ), Container( - padding: EdgeInsets.only(bottom: 10), + padding: const EdgeInsets.only(bottom: 10), child: const VerticalDivider( width: 1, color: Color.fromRGBO(234, 234, 234, 1), @@ -614,16 +604,16 @@ class _HomePageState extends State } Widget customLineChart() { - Paint circlePaint = Paint() - ..color = const Color.fromARGB(0xFF, 0xFB, 0x95, 0x32); + Paint circlePaint = Paint()..color = ui.Color.fromARGB(109, 255, 177, 104); Paint insideCirclePaint = Paint() - ..color = const Color.fromARGB(0xFF, 0xFB, 0x95, 0x32); + ..color = ui.Color.fromARGB(255, 255, 147, 40); Paint linePaint = Paint() ..strokeWidth = 1 ..style = PaintingStyle.stroke ..color = Colors.orange; + return LineChart( width: MediaQuery.of(context).size.width - 110, height: 120, @@ -643,12 +633,8 @@ class _HomePageState extends State color: Colors.deepOrange, ), insideCirclePaint: insideCirclePaint, - onValuePointer: (LineChartModelCallback value) { - print('${value.chart} ${value.percentage}'); - }, - onDropPointer: () { - print('onDropPointer'); - }, + onValuePointer: (LineChartModelCallback value) {}, + onDropPointer: () {}, ); } @@ -830,95 +816,10 @@ class _HomePageState extends State ); } - Widget recordRateProgress(double distance) { - double percent = distance / 1000; - if (percent > 1) { - percent = 1; - } - return SizedBox( - width: MediaQuery.of(context).size.width, - child: Card( - child: Stack( - children: [ - Positioned( - left: 0, - child: Column( - children: [ - const Text( - '오늘의 목표거리 달성률', - style: TextStyle( - fontSize: recordFontSize, color: Colors.black54), - ), - Text( - '${distance / 1000}km / 10km', - style: const TextStyle( - fontSize: recordFontSize, color: Colors.black54), - ) - ], - )), - Positioned( - right: 0, - child: CircularPercentIndicator( - percent: percent, - radius: 100, - backgroundColor: Colors.black12, - progressColor: - const Color.fromARGB(0xFF, 0xFB, 0x95, 0x32))) - ], - ))); - } - - // Widget? floatingButtons() { - // return SpeedDial( - // animatedIcon: AnimatedIcons.menu_close, - // visible: true, - // curve: Curves.bounceIn, - // backgroundColor: const Color.fromARGB(0xFF, 0xFB, 0x95, 0x32), - // children: [ - // SpeedDialChild( - // child: const Icon(Icons.settings_sharp, color: Colors.white), - // label: "설정", - // labelStyle: const TextStyle( - // fontWeight: FontWeight.w500, - // color: Colors.white, - // fontSize: 13.0), - // backgroundColor: const Color.fromARGB(0xFF, 0xFB, 0x95, 0x32), - // labelBackgroundColor: const Color.fromARGB(0xFF, 0xFB, 0x95, 0x32), - // onTap: () { - // Navigator.of(context).push(MaterialPageRoute( - // builder: (context) => ChangeNotifierProvider( - // create: (context) => SettingProvider(), - // child: const SettingPage(), - // ))); - // }), - // SpeedDialChild( - // child: const Icon( - // Icons.add_chart_rounded, - // color: Colors.white, - // ), - // label: "내 기록", - // backgroundColor: const Color.fromARGB(0xFF, 0xFB, 0x95, 0x32), - // labelBackgroundColor: const Color.fromARGB(0xFF, 0xFB, 0x95, 0x32), - // labelStyle: const TextStyle( - // fontWeight: FontWeight.w500, color: Colors.white, fontSize: 13.0), - // onTap: () { - // Navigator.of(context).push(MaterialPageRoute( - // builder: (context) => ChangeNotifierProvider( - // create: (context) => RecordListProvider(), - // child: const RecordListPage(), - // ))); - // }, - // ) - // ], - // ); - // } - int _getMaxDistance(List records) { double maxDistance = 0; int recoredCount = 0; for (var element in records) { - developer.log('반복 횟수${recoredCount++}'); - developer.log(element.distance.toString()); if (element.distance > maxDistance) { maxDistance = element.distance; } @@ -938,14 +839,17 @@ class _HomePageState extends State } void _incrementCounter(List _records) { - setState(() { - data = []; - for (var element in _records) { - if (element.date != '') { - DateTime day = element.getYearMonthDay(); - data.add(LineChartModel(amount: element.distance, date: day)); - } + List dataIn7days = + (((_records.reversed).toList()).sublist(0, 7)).reversed.toList(); + List model = []; + for (var element in dataIn7days) { + if (element.date != '') { + DateTime day = element.getYearMonthDay(); + model.add(LineChartModel(amount: element.distance, date: day)); } + } + setState(() { + data = model; }); } diff --git a/lib/src/pages/loding_page.dart b/lib/src/pages/loding_page.dart index dbe89f3..45833a8 100644 --- a/lib/src/pages/loding_page.dart +++ b/lib/src/pages/loding_page.dart @@ -114,7 +114,6 @@ class _LodingPageState extends State { height: 20, ), _kakaoLoginButton(), - _naverLoginButton(), _googleLoginButton(), _appleLoginButton(), Container( diff --git a/lib/src/pages/map_search_page.dart b/lib/src/pages/map_search_page.dart index 6fae6ad..4691b6d 100644 --- a/lib/src/pages/map_search_page.dart +++ b/lib/src/pages/map_search_page.dart @@ -1,8 +1,7 @@ import 'dart:async'; -import 'dart:developer' as developer; import 'package:flutter/material.dart'; -import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:flutter_naver_map/flutter_naver_map.dart'; import 'package:provider/provider.dart'; import 'package:ridingpartner_flutter/src/models/place.dart'; import 'package:ridingpartner_flutter/src/pages/navigation_page.dart'; @@ -11,7 +10,6 @@ import 'package:ridingpartner_flutter/src/utils/user_location.dart'; import '../provider/map_search_provider.dart'; import '../provider/riding_provider.dart'; -import '../utils/custom_marker.dart'; class MapSearchPage extends StatefulWidget { const MapSearchPage({super.key}); @@ -21,11 +19,13 @@ class MapSearchPage extends StatefulWidget { } class MapSampleState extends State { - final Completer _controller = Completer(); final FocusNode _destinationFocusNode = FocusNode(); final FocusNode _startFocusNode = FocusNode(); final _destinationTextController = TextEditingController(); final _startTextController = TextEditingController(); + Completer _controller = Completer(); + LocationTrackingMode _locationTrackingMode = LocationTrackingMode.None; + late List _markers = []; final int polylineWidth = 5; bool searchboxVisible = true; int startMarkerId = 0; @@ -61,13 +61,11 @@ class MapSampleState extends State { fontSize: 12, fontWeight: FontWeight.w200); - var _initLocation = CameraPosition( - target: LatLng( - MyLocation().position!.latitude, MyLocation().position!.longitude), - zoom: 14.4746, - ); - final _markers = []; - + // var _initLocation = CameraPosition( + // target: LatLng( + // MyLocation().position!.latitude, MyLocation().position!.longitude), + // zoom: 14.4746, + // ); @override void initState() { super.initState(); @@ -91,7 +89,6 @@ class MapSampleState extends State { "현재 위치: ${Provider.of(context, listen: false).myLocationAddress}"; _markers.clear(); - _initLoaction(); }); } @@ -110,28 +107,25 @@ class MapSampleState extends State { return Scaffold( body: Stack( children: [ - GoogleMap( - mapType: MapType.normal, - onTap: (latlng) { + NaverMap( + onMapCreated: onMapCreated, + mapType: MapType.Basic, + locationButtonEnable: false, + initLocationTrackingMode: _locationTrackingMode, + markers: _markers, + onMapTap: (latLng) { _startFocusNode.unfocus(); _destinationFocusNode.unfocus(); }, - polylines: { - Polyline( - polylineId: const PolylineId("route"), - color: const Color.fromARGB(0xFF, 0xFB, 0x95, 0x32), - width: polylineWidth, - startCap: Cap.roundCap, - endCap: Cap.roundCap, - points: mapSearchProvider.polylinePoints) - }, - markers: Set.from(_markers), - initialCameraPosition: _initLocation, - onMapCreated: (GoogleMapController controller) { - _controller.complete(controller); - }, - myLocationButtonEnabled: false, - myLocationEnabled: true, + pathOverlays: mapSearchProvider.polylinePoints.length > 1 + ? { + PathOverlay( + PathOverlayId('path'), mapSearchProvider.polylinePoints, + width: polylineWidth, + outlineWidth: 0, + color: const Color.fromARGB(0xFF, 0xFB, 0x95, 0x32)) + } + : {}, ), Visibility( visible: searchboxVisible, @@ -182,6 +176,7 @@ class MapSampleState extends State { bottom: buttonsPositionAlpha + 50, left: 20, child: FloatingActionButton( + heroTag: 'mypos', backgroundColor: Colors.white, child: ImageIcon( const AssetImage('assets/icons/search_myLocation_button.png'), @@ -211,6 +206,11 @@ class MapSampleState extends State { ); } + void onMapCreated(NaverMapController controller) { + if (_controller.isCompleted) _controller = Completer(); + _controller.complete(controller); + } + Widget placeList(MapSearchProvider mapSearchProvider, String type, List list, TextEditingController textController) { return Flexible( @@ -235,7 +235,7 @@ class MapSampleState extends State { textColor: Colors.black, tileColor: _searchBoxColor, onTap: () async { - final GoogleMapController controller = + final NaverMapController controller = await _controller.future; // if (index == 0) { @@ -250,13 +250,13 @@ class MapSampleState extends State { } else { FocusManager.instance.primaryFocus?.unfocus(); } - controller.animateCamera(CameraUpdate.newCameraPosition( - CameraPosition( + controller.moveCamera( + CameraUpdate.toCameraPosition(CameraPosition( target: LatLng(double.parse(list[index].latitude!), double.parse(list[index].longitude!)), - zoom: 20, - ), - )); + )), + ); + _updatePosition(list[index], type, mapSearchProvider); if (type == "출발지") { mapSearchProvider.setStartPoint(list[index]); @@ -265,8 +265,6 @@ class MapSampleState extends State { mapSearchProvider.setEndPoint(list[index]); mapSearchProvider.clearEndPointSearchResult(); } - developer.log('출발지: ${mapSearchProvider.startPoint}'); - developer.log('도착지: ${mapSearchProvider.destination}'); if (mapSearchProvider.startPoint != null && mapSearchProvider.destination != null) { @@ -368,7 +366,6 @@ class MapSampleState extends State { shape: const BeveledRectangleBorder(borderRadius: BorderRadius.zero), elevation: 10, - heroTag: 'navigateStartBtn', onPressed: () { if (mapSearchProvider.destination == null) { ScaffoldMessenger.of(context).showSnackBar( @@ -410,8 +407,8 @@ class MapSampleState extends State { Future _updatePosition( Place position, String type, MapSearchProvider mapSearchProvider) async { - final customIcon = await CustomMarker() - .getPictuerMarker('assets/icons/search_riding_marker.png'); + final customIcon = await OverlayImage.fromAssetImage( + assetName: 'assets/icons/search_riding_marker.png'); int index; if (type == "출발지") { index = 0; @@ -423,11 +420,12 @@ class MapSampleState extends State { _markers.insert( index, Marker( + width: 30, + height: 40, icon: customIcon, - markerId: MarkerId('${position.latitude!}${position.longitude!}'), + markerId: '${position.latitude!}${position.longitude!}', position: LatLng(double.parse(position.latitude!), double.parse(position.longitude!)), - draggable: true, )); if (_markers.length > 2) { _markers.removeAt(1); @@ -441,15 +439,16 @@ class MapSampleState extends State { _markers.clear(); } _markers.add( - // 출발지와 도착지 마커를 구분하기 위해 index를 사용 - Marker( - icon: customIcon, - markerId: MarkerId('${position.latitude!}${position.longitude!}'), - position: LatLng(double.parse(position.latitude!), - double.parse(position.longitude!)), - draggable: true, - ), - ); + // 출발지와 도착지 마커를 구분하기 위해 index를 사용 + Marker( + icon: customIcon, + width: 30, + height: 40, + markerId: '${position.latitude!}${position.longitude!}', + position: LatLng( + double.parse(position.latitude!), double.parse(position.longitude!)), + )); + setState(() {}); } @@ -482,8 +481,7 @@ class MapSampleState extends State { void _drawPolyline(MapSearchProvider mapSearchProvider, Place startPlace, Place finalDestination) async { - final GoogleMapController controller = await _controller.future; - final List polylineCoordinates = []; + final NaverMapController controller = await _controller.future; mapSearchProvider.polyline(startPlace, finalDestination); LatLng start = LatLng(double.parse(startPlace.latitude!), double.parse(startPlace.longitude!)); @@ -514,24 +512,24 @@ class MapSampleState extends State { sLon = northEast.longitude; nLon = southWest.longitude; } - controller.animateCamera(CameraUpdate.newLatLngBounds( + controller.moveCamera( + CameraUpdate.fitBounds( LatLngBounds( northeast: LatLng(nLat, nLon), southwest: LatLng(sLat, sLon), ), - 100)); + padding: 48, + ), + ); } void _initLoaction() async { - final GoogleMapController controller = await _controller.future; - final myLocation = MyLocation(); - await myLocation.getMyCurrentLocation(); - _initLocation = CameraPosition( - target: - LatLng(myLocation.position!.latitude, myLocation.position!.longitude), - zoom: 14.4746, - ); + final NaverMapController controller = await _controller.future; - controller.animateCamera(CameraUpdate.newCameraPosition(_initLocation)); + controller.moveCamera(CameraUpdate.toCameraPosition(CameraPosition( + target: LatLng( + MyLocation().position!.latitude, MyLocation().position!.longitude), + zoom: 14.4746, + ))); } } diff --git a/lib/src/pages/navigation_page.dart b/lib/src/pages/navigation_page.dart index df7d10a..01d8acd 100644 --- a/lib/src/pages/navigation_page.dart +++ b/lib/src/pages/navigation_page.dart @@ -1,9 +1,6 @@ import 'dart:async'; -import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:geolocator/geolocator.dart'; -import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:flutter_naver_map/flutter_naver_map.dart'; import 'package:percent_indicator/linear_percent_indicator.dart'; import 'package:provider/provider.dart'; import 'package:ridingpartner_flutter/src/pages/record_page.dart'; @@ -15,8 +12,6 @@ import 'package:ridingpartner_flutter/src/utils/timestampToText.dart'; import 'package:ridingpartner_flutter/src/widgets/dialog.dart'; import 'package:wakelock/wakelock.dart'; -import '../utils/bytesFromAsset.dart'; - class NavigationPage extends StatefulWidget { const NavigationPage({super.key}); @@ -28,21 +23,20 @@ class _NavigationPageState extends State { late NavigationProvider _navigationProvider; late RidingProvider _ridingProvider; - Completer _controller = Completer(); + LocationTrackingMode _locationTrackingMode = LocationTrackingMode.None; + late List _markers = []; + // late OverlayImage _markerIcon; + Completer _controller = Completer(); LatLng initCameraPosition = const LatLng(37.37731944, 126.8050778); - Set markers = {}; late String? userProfile; - double bearing = 180; - late BitmapDescriptor myPositionIcon; + double floatingBtnPosition = 80; @override void initState() { super.initState(); - FirebaseAuth auth = FirebaseAuth.instance; - userProfile = auth.currentUser?.photoURL; - _navigationProvider = Provider.of(context, listen: false); + Provider.of(context, listen: false).getLocation(); setMapComponent(); } @@ -51,64 +45,85 @@ class _NavigationPageState extends State { await _navigationProvider.getRoute(); setRouteMarkers(); - if (_navigationProvider.position != null) { - initCameraPosition = LatLng( - (_navigationProvider.position!.latitude + - double.parse(_navigationProvider.course.last.latitude!)) / - 2, - ((_navigationProvider.position!.longitude) + - double.parse(_navigationProvider.course.last.longitude!)) / - 2); - final Uint8List markerIcon = - await getBytesFromAsset('assets/icons/my_location.png', 200); - - myPositionIcon = BitmapDescriptor.fromBytes(markerIcon); - - markers.add(Marker( - anchor: const Offset(0, 0), - icon: BitmapDescriptor.fromBytes(markerIcon), - markerId: const MarkerId("currentPosition"), - position: LatLng(_navigationProvider.position!.latitude, - _navigationProvider.position!.longitude), - )); - } else { - initCameraPosition = const LatLng(37.37731944, 126.8050778); - } + // if (_navigationProvider.position != null) { + // _markerIcon = await OverlayImage.fromAssetImage( + // assetName: 'assets/icons/my_location.png'); + + // _markers.add(Marker( + // icon: _markerIcon, + // width: 65, + // height: 65, + // markerId: "currentPosition", + // position: LatLng(_navigationProvider.position!.latitude, + // _navigationProvider.position!.longitude), + // )); + // } } Future setRouteMarkers() async { - final Uint8List turnMarkerIcon = - await getBytesFromAsset('assets/icons/marker_orange.png', 80); - final Uint8List startMarkerIcon = - await getBytesFromAsset('assets/icons/marker_start.png', 80); - final Uint8List destinationMarkerIcon = - await getBytesFromAsset('assets/icons/marker_destination.png', 80); - - List markerList = _navigationProvider.course + final OverlayImage turnMarkerIcon = await OverlayImage.fromAssetImage( + assetName: 'assets/icons/marker_orange.png'); + final OverlayImage startMarkerIcon = await OverlayImage.fromAssetImage( + assetName: 'assets/icons/marker_start.png'); + final OverlayImage destinationMarkerIcon = + await OverlayImage.fromAssetImage( + assetName: 'assets/icons/marker_destination.png'); + + _markers = _navigationProvider.course .map((course) => Marker( - icon: BitmapDescriptor.fromBytes(turnMarkerIcon), - markerId: MarkerId(course.title ?? ""), + width: 30, + height: 40, + icon: turnMarkerIcon, + markerId: course.title ?? "", position: LatLng(double.parse(course.latitude!), double.parse(course.longitude!)))) .toList(); - markerList[0] = Marker( - icon: BitmapDescriptor.fromBytes(startMarkerIcon), - markerId: MarkerId(_navigationProvider.course[0].title ?? ""), - position: LatLng(double.parse(_navigationProvider.course[0].latitude!), - double.parse(_navigationProvider.course[0].longitude!))); - - markerList.last = Marker( - icon: BitmapDescriptor.fromBytes(destinationMarkerIcon), - markerId: MarkerId(_navigationProvider.course.last.title ?? ""), + _markers.last = Marker( + icon: destinationMarkerIcon, + width: 30, + height: 50, + markerId: _navigationProvider.course.last.title ?? "", position: LatLng( double.parse(_navigationProvider.course.last.latitude!), - double.parse(_navigationProvider.course[0].longitude!))); - - markers = markerList.toSet(); + double.parse(_navigationProvider.course.last.longitude!))); + if (_navigationProvider.course.length == 1) { + _markers.add(Marker( + icon: startMarkerIcon, + width: 30, + height: 50, + markerId: _navigationProvider.course[0].title ?? "", + position: LatLng(_navigationProvider.position!.latitude, + _navigationProvider.position!.longitude))); + + double lat = (_navigationProvider.position!.latitude + + double.parse(_navigationProvider.course.last.latitude!)) / + 2; + double lon = (_navigationProvider.position!.longitude + + double.parse(_navigationProvider.course.last.longitude!)) / + 2; + initCameraPosition = LatLng(lat, lon); + } else { + _markers[0] = Marker( + icon: startMarkerIcon, + width: 30, + height: 50, + markerId: _navigationProvider.course[0].title ?? "", + position: LatLng( + double.parse(_navigationProvider.course[0].latitude!), + double.parse(_navigationProvider.course[0].longitude!))); + + double lat = (double.parse(_navigationProvider.course[0].latitude!) + + double.parse(_navigationProvider.course.last.latitude!)) / + 2; + double lon = (double.parse(_navigationProvider.course[0].longitude!) + + double.parse(_navigationProvider.course.last.longitude!)) / + 2; + initCameraPosition = LatLng(lat, lon); + } } - int polylineWidth = 5; + int polylineWidth = 7; TextStyle plainStyle = const TextStyle( fontSize: 12, fontFamily: 'Pretendard', @@ -120,37 +135,26 @@ class _NavigationPageState extends State { _navigationProvider = Provider.of(context); _ridingProvider = Provider.of(context); - Position? position = _navigationProvider.position; - - void setController() async { - GoogleMapController googleMapController = await _controller.future; - if (position != null) { - if (_navigationProvider.bearingPoint != null) { - bearing = Geolocator.bearingBetween( - position.latitude, - position.longitude, - _navigationProvider.bearingPoint!.latitude, - _navigationProvider.bearingPoint!.longitude); - } - googleMapController.animateCamera(CameraUpdate.newCameraPosition( - CameraPosition( - target: LatLng(position.latitude, position.longitude), - zoom: 19, - bearing: bearing))); - - markers.removeWhere( - (element) => element.markerId.value == 'currentPosition'); - markers.add(Marker( - icon: myPositionIcon, - markerId: const MarkerId('currentPosition'), - position: LatLng(position.latitude, position.longitude))); - } - } - - if (_ridingProvider.state == RidingState.riding) { - setController(); + if (_ridingProvider.state == RidingState.error) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('사용자 위치를 불러올 수 없습니다.'), + ), + ); } - + // if (_ridingProvider.state == RidingState.riding) { + // if (position != null) { + // _markers = [ + // Marker( + // anchor: AnchorPoint(0.5, 0.5), + // markerId: "currentLocation", + // width: 65, + // height: 65, + // icon: _markerIcon, + // position: LatLng(position.latitude, position.longitude)) + // ]; + // } + // } Widget failMessageWidget() { switch (_navigationProvider.searchRouteState) { case SearchRouteState.loading: @@ -205,35 +209,57 @@ class _NavigationPageState extends State { elevation: 10, ), body: _navigationProvider.searchRouteState == - SearchRouteState.success + SearchRouteState.success && + _navigationProvider.position != null ? Stack( alignment: Alignment.bottomCenter, children: [ - GoogleMap( - mapType: MapType.normal, + NaverMap( initialCameraPosition: CameraPosition( - target: initCameraPosition, zoom: 13), - polylines: { - Polyline( - polylineId: const PolylineId("route"), - color: - const Color.fromARGB(0xFF, 0xFB, 0x95, 0x32), - width: polylineWidth, - startCap: Cap.roundCap, - endCap: Cap.roundCap, - points: _navigationProvider.polylinePoints) - }, - onMapCreated: (GoogleMapController controller) { - _controller.complete(controller); - }, - myLocationButtonEnabled: false, - myLocationEnabled: false, - markers: markers, - compassEnabled: false, + target: initCameraPosition, zoom: 10), + onMapCreated: onMapCreated, + pathOverlays: + _navigationProvider.polylinePoints.length > 1 + ? { + PathOverlay(PathOverlayId('path'), + _navigationProvider.polylinePoints, + width: polylineWidth, + outlineWidth: 0, + color: const Color.fromARGB( + 0xFF, 0xFB, 0x95, 0x32)) + } + : {}, + mapType: MapType.Basic, + initLocationTrackingMode: _locationTrackingMode, + locationButtonEnable: true, + markers: _markers, ), Positioned(top: 0, child: guideWidget()), Positioned( - bottom: 0, child: record(_ridingProvider.state)) + bottom: 0, child: record(_ridingProvider.state)), + Positioned( + bottom: floatingBtnPosition, + left: 20, + child: FloatingActionButton( + heroTag: 'mypos', + backgroundColor: Colors.white, + child: const ImageIcon( + AssetImage( + 'assets/icons/search_myLocation_button.png'), + color: Color.fromRGBO(240, 120, 5, 1)), + onPressed: () async { + final controller = await _controller.future; + await controller.moveCamera( + CameraUpdate.toCameraPosition(CameraPosition( + target: LatLng( + _ridingProvider.position!.latitude, + _ridingProvider.position!.longitude), + zoom: 18))); + controller.setLocationTrackingMode( + LocationTrackingMode.Face); + }, + ), + ), // changeButton(_navigationProvider.ridingState) ], ) @@ -248,6 +274,13 @@ class _NavigationPageState extends State { }); } + void onMapCreated(NaverMapController controller) { + if (_controller.isCompleted) _controller = Completer(); + _controller.complete(controller); + + setCamera(); + } + Widget guideWidget() { String iconRoute = turnIcon[_navigationProvider.goalPoint.turn] ?? 'assets/icons/navigation_straight.png'; @@ -305,7 +338,7 @@ class _NavigationPageState extends State { fontWeight: FontWeight.w400, color: Color.fromRGBO(52, 58, 64, 1)); - if (state == RidingState.before) { + if (state == RidingState.before || state == RidingState.error) { return InkWell( child: Container( color: const Color.fromRGBO(240, 120, 5, 1), @@ -322,16 +355,30 @@ class _NavigationPageState extends State { textAlign: TextAlign.center, ), ), - onTap: () { - _ridingProvider.startRiding(); - _navigationProvider.startNavigation(); - screenKeepOn(); - polylineWidth = 8; + onTap: () async { + try { + floatingBtnPosition = 200; + _ridingProvider.startRiding(); + _navigationProvider.startNavigation(); + screenKeepOn(); + polylineWidth = 8; + final controller = await _controller.future; + controller.moveCamera(CameraUpdate.toCameraPosition(CameraPosition( + target: LatLng(_navigationProvider.position!.latitude, + _navigationProvider.position!.longitude), + zoom: 17))); + } catch (e) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('주행을 시작하는 데에 실패했습니다'), + ), + ); + } }, ); } else { return Container( - margin: const EdgeInsets.symmetric(horizontal: 20, vertical: 40), + margin: const EdgeInsets.symmetric(horizontal: 10, vertical: 40), child: Column( crossAxisAlignment: CrossAxisAlignment.end, children: [ @@ -371,8 +418,7 @@ class _NavigationPageState extends State { children: [ const Text('남은거리', style: titleStyle), Text( - ("${(((_navigationProvider.remainedDistance) / 100).roundToDouble()) / 10}km") - .toString(), + ("${(((_navigationProvider.remainedDistance) / 100).roundToDouble()) / 10}km"), style: dataStyle, ) ], @@ -385,7 +431,7 @@ class _NavigationPageState extends State { style: titleStyle, ), Text( - "${_ridingProvider.speed.roundToDouble()}km/h", + "${_ridingProvider.speed.toStringAsFixed(1)}km/h", style: dataStyle, ) ], @@ -558,6 +604,58 @@ class _NavigationPageState extends State { } } + void setCamera() async { + final controller = await _controller.future; + LatLng start; + LatLng end; + if (_navigationProvider.course.length > 1) { + start = LatLng(double.parse(_navigationProvider.course[0].latitude!), + double.parse(_navigationProvider.course[0].longitude!)); + end = LatLng(double.parse(_navigationProvider.course.last.latitude!), + double.parse(_navigationProvider.course.last.longitude!)); + } else { + start = LatLng( + _navigationProvider.position!.latitude, + _navigationProvider.position!.longitude, + ); + end = LatLng(double.parse(_navigationProvider.course.last.latitude!), + double.parse(_navigationProvider.course.last.longitude!)); + } + if (start.latitude <= end.latitude) { + LatLng temp = start; + start = end; + end = temp; + } + LatLng northEast = start; + LatLng southWest = end; + + var nLat, nLon, sLat, sLon; + + if (southWest.latitude <= northEast.latitude) { + sLat = southWest.latitude; + nLat = northEast.latitude; + } else { + sLat = northEast.latitude; + nLat = southWest.latitude; + } + if (southWest.longitude <= northEast.longitude) { + sLon = southWest.longitude; + nLon = northEast.longitude; + } else { + sLon = northEast.longitude; + nLon = southWest.longitude; + } + controller.moveCamera( + CameraUpdate.fitBounds( + LatLngBounds( + northeast: LatLng(nLat, nLon), + southwest: LatLng(sLat, sLon), + ), + padding: 48, + ), + ); + } + void screenKeepOn() async { if (!(await Wakelock.enabled)) { Wakelock.enable(); diff --git a/lib/src/pages/recommended_route_page.dart b/lib/src/pages/recommended_route_page.dart index 08ca293..aff6aa0 100644 --- a/lib/src/pages/recommended_route_page.dart +++ b/lib/src/pages/recommended_route_page.dart @@ -165,61 +165,27 @@ class RecommendedRoutePageState extends State { semanticContainer: true, clipBehavior: Clip.antiAliasWithSaveLayer, shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(13.0), + borderRadius: BorderRadius.circular(10.0), ), child: InkWell( - onTap: () { - routeDialog(route); - }, - child: Stack( - fit: StackFit.expand, - children: [ - SizedBox( - child: InkWell( - onTap: () { - routeDialog(route); - }, - child: Stack(children: [ - Container( - width: MediaQuery.of(context).size.width, - height: MediaQuery.of(context).size.height, - decoration: const BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(13)), - ), - child: ClipRRect( - borderRadius: BorderRadius.circular(13.0), - child: Image.asset( - route.image!, - width: MediaQuery.of(context).size.width, - fit: BoxFit.fill, - ), - ), - ), - Container( - width: MediaQuery.of(context).size.width, - height: MediaQuery.of(context).size.height, - decoration: const BoxDecoration( - borderRadius: - BorderRadius.all(Radius.circular(13)), - color: Color.fromARGB(46, 0, 0, 0))) - ]))), + onTap: () { + routeDialog(route); + }, + child: Stack(fit: StackFit.expand, children: [ + Image.asset( + route.image!, + fit: BoxFit.fill, + ), Container( - height: 130, - padding: const EdgeInsets.all(13), - alignment: Alignment.bottomRight, - child: Text( - "${route.title}", - style: const TextStyle( - fontSize: 16, - fontFamily: 'Pretendard', - fontWeight: FontWeight.w600, - color: Colors.white), - textAlign: TextAlign.end, - ), - ) - ], - ), - )); + alignment: Alignment.bottomRight, + padding: const EdgeInsets.all(7), + child: Text("${route.title!} ", + style: const TextStyle( + fontFamily: 'Pretendard', + fontSize: 16, + color: Colors.white, + fontWeight: FontWeight.w600))), + ]))); Widget recommendTitleWidget() => Container( margin: const EdgeInsets.fromLTRB(0, 32, 0, 24), diff --git a/lib/src/pages/record_list_page.dart b/lib/src/pages/record_list_page.dart index 12bc0dd..a9931f8 100644 --- a/lib/src/pages/record_list_page.dart +++ b/lib/src/pages/record_list_page.dart @@ -1,16 +1,11 @@ import 'package:flutter/material.dart'; -import 'package:flutter/src/widgets/container.dart'; -import 'package:flutter/src/widgets/framework.dart'; import 'package:intl/date_symbol_data_local.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; import 'package:ridingpartner_flutter/src/models/record.dart'; -import 'package:ridingpartner_flutter/src/pages/record_page.dart'; -import 'package:ridingpartner_flutter/src/provider/home_record_provider.dart'; import 'package:ridingpartner_flutter/src/provider/record_list_provider.dart'; import '../provider/riding_result_provider.dart'; -import '../utils/timestampToText.dart'; import '../widgets/appbar.dart'; import 'day_record_page.dart'; @@ -82,7 +77,8 @@ class _RecordListPageState extends State { ))) }, child: Container( - padding: const EdgeInsets.only(top: 15, bottom: 10, left: 15, right: 13), + padding: + const EdgeInsets.only(top: 15, bottom: 10, left: 15, right: 13), // // color: Color.fromARGB(167, 251, 150, 50), // height: MediaQuery.of(context).size.height / 8, width: double.infinity, diff --git a/lib/src/pages/record_page.dart b/lib/src/pages/record_page.dart index 0325983..c7d38c2 100644 --- a/lib/src/pages/record_page.dart +++ b/lib/src/pages/record_page.dart @@ -1,4 +1,3 @@ -import 'dart:developer' as developer; import 'dart:io'; import 'package:app_settings/app_settings.dart'; @@ -35,13 +34,11 @@ class _RecordState extends State { @override Widget build(BuildContext context) { - developer.log("hi"); num speed = 0; _recordProvider = Provider.of(context); _imageStatus = _recordProvider.imageStatus; - developer.log(_imageStatus.name); switch (_recordProvider.recordState) { case RecordState.loading: @@ -136,78 +133,98 @@ class _RecordState extends State { style: textStyle), Text(timestampToText(_record.timestamp), style: textStyle), + if (_record.timestamp != 0) ...[ + Text( + "${(_record.distance / _record.timestamp).toStringAsFixed(1)} km/h", + style: textStyle) + ] else ...[ + Text("0.0 km/h", style: textStyle) + ], Text( - "${_record.distance / _record.timestamp} km/h", + "${(_record.distance / 1000).toStringAsFixed(2)} km", style: textStyle), - Text("${_record.distance / 1000} km", - style: textStyle), - Text( - "${(hKcal * (_record.timestamp) / 3600).toStringAsFixed(1)} kcal", - style: textStyle) + if (_record.distance == 0) ...[ + Text( + '0 kcal', + style: textStyle, + ) + ] else ...[ + Text( + "${(hKcal * (_record.timestamp) / 3600).toStringAsFixed(1)} kcal", + style: textStyle) + ] ], ), ), ], ), ), - Row( - children: [ - Container( - width: 64.0, - height: 64.0, - margin: const EdgeInsets.only(right: 20.0), - child: OutlinedButton( - onPressed: () { - if (_imageStatus == ImageStatus.init) { - _recordProvider - .confirmPermissionGranted() - .then((_) => _recordProvider - .getImage(ImageSource.gallery)); - } else if (_imageStatus == - ImageStatus.permissionFail) { - ScaffoldMessenger.of(context) - .showSnackBar(SnackBar( - content: const Text( - "사진, 파일, 마이크 접근을 허용 해주셔야 카메라 사용이 가능합니다."), - action: SnackBarAction( - label: "OK", - onPressed: () { - AppSettings.openAppSettings(); - }, + if (_recordProvider.images.isEmpty) ...[ + Row( + children: [ + Container( + width: 64.0, + height: 64.0, + margin: const EdgeInsets.only(right: 10.0), + child: OutlinedButton( + onPressed: () { + if (_imageStatus == ImageStatus.init) { + _recordProvider + .confirmPermissionGranted() + .then((_) => _recordProvider + .getImage(ImageSource.gallery)); + } else if (_imageStatus == + ImageStatus.permissionFail) { + ScaffoldMessenger.of(context) + .showSnackBar(SnackBar( + content: const Text( + "사진, 파일, 마이크 접근을 허용 해주셔야 카메라 사용이 가능합니다."), + action: SnackBarAction( + label: "OK", + onPressed: () { + AppSettings.openAppSettings(); + }, + ), + )); + } else if (_imageStatus != ImageStatus.init) { + _recordProvider.images.clear(); + _recordProvider + .getImage(ImageSource.gallery); + } + }, + style: ButtonStyle( + side: MaterialStateProperty.all( + const BorderSide( + color: + Color.fromARGB(0xFF, 0xFD, 0xD3, 0xAB), + width: 2.0, + )), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: const [ + Image( + image: AssetImage( + 'assets/icons/add_image.png'), + color: Color.fromARGB(255, 255, 255, 255), ), - )); - } else if (_imageStatus != ImageStatus.init) { - _recordProvider.images.clear(); - _recordProvider.getImage(ImageSource.gallery); - } - }, - style: ButtonStyle( - side: - MaterialStateProperty.all(const BorderSide( - color: Color.fromARGB(0xFF, 0xFD, 0xD3, 0xAB), - width: 2.0, - )), - ), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: const [ - Image( - image: AssetImage( - 'assets/icons/add_image.png'), - color: Color.fromARGB(255, 255, 255, 255), - ), - Text( - "사진", - style: TextStyle( - color: Color.fromARGB( - 0xFF, 0xDE, 0xE2, 0xE6), - fontSize: 12.0), - ) - ], - ))), - SizedBox(width: 64.0, height: 64.0, child: showImage()) - ], - ), + SizedBox( + height: 5, + ), + Text( + "사진", + style: TextStyle( + color: Color.fromARGB( + 0xFF, 0xDE, 0xE2, 0xE6), + fontSize: 12.0), + ) + ], + ))), + ], + ) + ] else ...[ + showImage() + ], const Divider(color: Color.fromARGB(0xFF, 0xF8, 0xF9, 0xFA)), Container( height: 160, @@ -279,36 +296,41 @@ class _RecordState extends State { // 이미지를 보여주는 위젯 Widget showImage() { if (_recordProvider.imageStatus == ImageStatus.init) { - return const Text( + return const Center( + child: Text( "이미지를\n선택해주세요.", style: TextStyle( - fontSize: 14.0, + fontSize: 13.0, color: Color.fromARGB(0xFF, 0xDE, 0xE2, 0xE6), ), textAlign: TextAlign.center, - ); + )); } else if (_recordProvider.imageStatus == ImageStatus.imageSuccess) { - return Container( - width: 64.0, - height: 64.0, - padding: const EdgeInsets.all(4.0), - decoration: BoxDecoration( - border: Border.all( - color: const Color.fromARGB(0xFF, 0xFD, 0xD3, 0xAB), - width: 2.0), - borderRadius: BorderRadius.circular(3.5), - color: Colors.transparent), - child: Center( - child: _recordProvider.images.isEmpty - ? const Text( - '이미지 없음', - style: TextStyle( - fontSize: 13.0, - color: Color.fromARGB(0xFF, 0xDE, 0xE2, 0xE6), - ), - textAlign: TextAlign.center, - ) - : Image.file(File(_recordProvider.images.first!.path)))); + return Row( + children: _recordProvider.images.map((img) { + return InkWell( + onTap: () { + _recordProvider.images.clear(); + _recordProvider.getImage(ImageSource.gallery); + }, + child: Container( + width: 64.0, + height: 64.0, + margin: EdgeInsets.only(right: 10), + decoration: BoxDecoration( + border: Border.all( + color: const Color.fromARGB(0xFF, 0xFD, 0xD3, 0xAB), + width: 2.0), + borderRadius: BorderRadius.circular(3.5), + color: Colors.transparent), + child: Center( + child: Image.file( + File(img!.path), + width: 64, + height: 64, + fit: BoxFit.cover, + )))); + }).toList()); } else { return const Text( "업로드 실패", diff --git a/lib/src/pages/rental_map.dart b/lib/src/pages/rental_map.dart deleted file mode 100644 index 496b965..0000000 --- a/lib/src/pages/rental_map.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/material.dart'; -import 'package:google_maps_flutter/google_maps_flutter.dart'; -import 'package:provider/provider.dart'; -import 'package:ridingpartner_flutter/src/provider/place_list_provider.dart'; - -import '../models/place.dart'; - -class RentalMap extends StatefulWidget { - const RentalMap({super.key}); - @override - State createState() => RentalMapState(); -} - -class RentalMapState extends State { - final Completer _controller = Completer(); - List _markers = []; - - void initState() { - super.initState(); - Provider.of(context, listen: false).getPlaceList(); - } - - @override - Widget build(BuildContext context) { - List _placeList = Provider.of(context).placeList; - _markers = _placeList - .map((place) => Marker( - markerId: MarkerId(place.title!), - position: LatLng( - double.parse(place.latitude!), double.parse(place.longitude!)))) - .toList(); - - return Scaffold( - body: GoogleMap( - mapType: MapType.normal, - markers: Set.from(_markers), - initialCameraPosition: const CameraPosition( - target: LatLng(37.349741467772, 126.76182486561), zoom: 12.9), - onMapCreated: (GoogleMapController controller) { - _controller.complete(controller); - }, - myLocationButtonEnabled: true, - myLocationEnabled: true, - //onCameraMove: , - )); - } -} diff --git a/lib/src/pages/riding_page.dart b/lib/src/pages/riding_page.dart index c52e634..471ffff 100644 --- a/lib/src/pages/riding_page.dart +++ b/lib/src/pages/riding_page.dart @@ -1,22 +1,16 @@ import 'dart:async'; -import 'dart:typed_data'; - import 'package:flutter/material.dart'; +import 'package:flutter_naver_map/flutter_naver_map.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:provider/provider.dart'; import 'package:ridingpartner_flutter/src/pages/record_page.dart'; import 'package:ridingpartner_flutter/src/provider/riding_provider.dart'; import 'package:wakelock/wakelock.dart'; - import '../provider/riding_result_provider.dart'; -import '../utils/bytesFromAsset.dart'; import '../utils/timestampToText.dart'; import '../utils/user_location.dart'; import '../widgets/dialog.dart'; -// https://funncy.github.io/flutter/2020/07/21/flutter-google-map-marker/ - class RidingPage extends StatefulWidget { const RidingPage({super.key}); @@ -25,11 +19,12 @@ class RidingPage extends StatefulWidget { } class _RidingPageState extends State { - Completer _controller = Completer(); late RidingProvider _ridingProvider; - LatLng initCameraPosition = const LatLng(37.37731944, 126.8050778); - Set myPositionMarker = {}; - late BitmapDescriptor myPositionIcon; + LocationTrackingMode _locationTrackingMode = LocationTrackingMode.Face; + late List _markers = []; + late OverlayImage _markerIcon; + Completer _controller = Completer(); + double floatingBtnPosition = 80; @override void initState() { @@ -41,55 +36,52 @@ class _RidingPageState extends State { await Provider.of(context, listen: false).getLocation(); if (_ridingProvider.position != null) { - initCameraPosition = LatLng(_ridingProvider.position!.latitude, - _ridingProvider.position!.longitude); - final Uint8List markerIcon = - await getBytesFromAsset('assets/icons/my_location.png', 200); - myPositionIcon = BitmapDescriptor.fromBytes(markerIcon); - - myPositionMarker.add(Marker( - markerId: const MarkerId("currentLocation"), - icon: BitmapDescriptor.fromBytes(markerIcon), - position: LatLng(_ridingProvider.position!.latitude, - _ridingProvider.position!.longitude))); + _markerIcon = await OverlayImage.fromAssetImage( + assetName: 'assets/icons/my_location.png'); _ridingProvider.setMapComponent(); - } else { - initCameraPosition = const LatLng(37.37731944, 126.8050778); + + _markers = [ + // Marker( + // anchor: AnchorPoint(0.5, 0.5), + // markerId: "currentLocation", + // width: 65, + // height: 65, + // icon: _markerIcon, + // position: LatLng(_ridingProvider.position!.latitude, + // _ridingProvider.position!.longitude)) + ]; } } - final myLocation = MyLocation(); - - String floatBtnLabel = "일시중지"; - IconData floatBtnIcon = Icons.pause; + int polylineWidth = 7; @override Widget build(BuildContext context) { _ridingProvider = Provider.of(context); Position? position = _ridingProvider.position; - void setController() async { - GoogleMapController googleMapController = await _controller.future; - if (position != null) { - googleMapController.animateCamera(CameraUpdate.newCameraPosition( - CameraPosition( - target: LatLng(position.latitude, position.longitude), - zoom: 19, - bearing: position.heading))); - - myPositionMarker = { - Marker( - markerId: const MarkerId("currentLocation"), - icon: myPositionIcon, - position: LatLng(_ridingProvider.position!.latitude, - _ridingProvider.position!.longitude)) - }; - } + if (_ridingProvider.state == RidingState.error) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('사용자 위치를 불러올 수 없습니다.'), + ), + ); } - if (_ridingProvider.state != RidingState.before) { - setController(); - } + // if (_ridingProvider.state != RidingState.before) { + // if (position != null) { + // _markers = [ + // Marker( + // anchor: AnchorPoint(0.5, 0.5), + // markerId: "currentLocation", + // width: 65, + // height: 65, + // icon: _markerIcon, + // position: LatLng(_ridingProvider.position!.latitude, + // _ridingProvider.position!.longitude)) + // ]; + // } + // } return WillPopScope( child: Scaffold( @@ -120,25 +112,46 @@ class _RidingPageState extends State { ), body: Stack( children: [ - GoogleMap( - mapType: MapType.normal, + NaverMap( + onMapCreated: onMapCreated, + pathOverlays: _ridingProvider.polylineCoordinates.length > 1 + ? { + PathOverlay(PathOverlayId('path'), + _ridingProvider.polylineCoordinates, + width: polylineWidth, + outlineWidth: 0, + color: + const Color.fromARGB(0xFF, 0xFB, 0x95, 0x32)) + } + : {}, + mapType: MapType.Basic, + initLocationTrackingMode: LocationTrackingMode.Face, initialCameraPosition: CameraPosition( - target: LatLng(myLocation.position?.latitude ?? 37.0, - myLocation.position?.longitude ?? 126.0), - zoom: 12.6, + target: LatLng(position!.latitude, position.longitude), + zoom: 14), + locationButtonEnable: false, + markers: _markers, + ), + Positioned( + bottom: floatingBtnPosition, + left: 20, + child: FloatingActionButton( + heroTag: 'mypos', + backgroundColor: Colors.white, + child: const ImageIcon( + AssetImage('assets/icons/search_myLocation_button.png'), + color: Color.fromRGBO(240, 120, 5, 1)), + onPressed: () async { + final controller = await _controller.future; + await controller.moveCamera(CameraUpdate.toCameraPosition( + CameraPosition( + target: LatLng(_ridingProvider.position!.latitude, + _ridingProvider.position!.longitude), + zoom: 18))); + controller + .setLocationTrackingMode(LocationTrackingMode.Face); + }, ), - onMapCreated: (GoogleMapController controller) { - _controller.complete(controller); - }, - myLocationButtonEnabled: false, - polylines: { - Polyline( - polylineId: const PolylineId("poly"), - width: 5, - color: const Color.fromARGB(0xFF, 0xFB, 0x95, 0x32), - points: _ridingProvider.polylineCoordinates), - }, - markers: myPositionMarker, ), Positioned(bottom: 0, child: record(_ridingProvider.state)) ], @@ -153,6 +166,11 @@ class _RidingPageState extends State { }); } + void onMapCreated(NaverMapController controller) { + if (_controller.isCompleted) _controller = Completer(); + _controller.complete(controller); + } + Widget record(RidingState state) { const TextStyle titleStyle = TextStyle( fontFamily: 'Pretendard', @@ -165,28 +183,43 @@ class _RidingPageState extends State { fontWeight: FontWeight.w400, color: Color.fromRGBO(52, 58, 64, 1)); - if (state == RidingState.before) { + if (state == RidingState.before || state == RidingState.error) { return InkWell( - child: Container( - color: const Color.fromRGBO(240, 120, 5, 1), - alignment: Alignment.center, - width: MediaQuery.of(context).size.width, - height: 61, - child: const Text( - '주행 시작', - style: TextStyle( - color: Colors.white, - fontFamily: 'Pretendard', - fontWeight: FontWeight.w700, - fontSize: 18), - textAlign: TextAlign.center, + child: Container( + color: const Color.fromRGBO(240, 120, 5, 1), + alignment: Alignment.center, + width: MediaQuery.of(context).size.width, + height: 61, + child: const Text( + '주행 시작', + style: TextStyle( + color: Colors.white, + fontFamily: 'Pretendard', + fontWeight: FontWeight.w700, + fontSize: 18), + textAlign: TextAlign.center, + ), ), - ), - onTap: () { - _ridingProvider.startRiding(); - screenKeepOn(); - }, - ); + onTap: () async { + try { + floatingBtnPosition = 130; + _ridingProvider.startRiding(); + screenKeepOn(); + final controller = await _controller.future; + await controller.moveCamera(CameraUpdate.toCameraPosition( + CameraPosition( + target: LatLng(_ridingProvider.position!.latitude, + _ridingProvider.position!.longitude), + zoom: 18))); + controller.setLocationTrackingMode(LocationTrackingMode.Face); + } catch (e) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text('주행을 시작하는 데에 실패했습니다'), + ), + ); + } + }); } else { return Container( margin: const EdgeInsets.symmetric(horizontal: 20, vertical: 40), @@ -218,7 +251,8 @@ class _RidingPageState extends State { crossAxisAlignment: CrossAxisAlignment.center, children: [ const Text('거리', style: titleStyle), - Text("${_ridingProvider.distance}km", + Text( + "${((_ridingProvider.distance / 10000).roundToDouble()) * 10}km", style: dataStyle) ], ), @@ -230,7 +264,7 @@ class _RidingPageState extends State { style: titleStyle, ), Text( - "${_ridingProvider.speed.roundToDouble()}km/h", + "${_ridingProvider.speed.toStringAsFixed(1)}km/h", style: dataStyle, ) ], diff --git a/lib/src/pages/sights_page.dart b/lib/src/pages/sights_page.dart index 49c0e36..6def3b3 100644 --- a/lib/src/pages/sights_page.dart +++ b/lib/src/pages/sights_page.dart @@ -1,17 +1,14 @@ import 'dart:async'; import 'package:flutter/material.dart'; -import 'package:flutter/src/painting/rounded_rectangle_border.dart'; -import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:flutter_naver_map/flutter_naver_map.dart'; +import 'package:logging/logging.dart'; import 'package:provider/provider.dart'; import 'package:ridingpartner_flutter/src/provider/sights_provider.dart'; -import 'package:ridingpartner_flutter/src/utils/custom_marker.dart'; - import '../models/place.dart'; import '../provider/navigation_provider.dart'; import '../provider/riding_provider.dart'; import 'navigation_page.dart'; -import 'package:logging/logging.dart'; class SightsPage extends StatefulWidget { @override @@ -19,54 +16,83 @@ class SightsPage extends StatefulWidget { } class _SightsPageState extends State { - final Completer _controller = Completer(); - - Set markers = {}; + late List _markers = []; + Completer _controller = Completer(); late SightsProvider _sightsProvider; + var logger = Logger('Logger'); @override void initState() { - Provider.of(context, listen: false).getPlaceList(); + setCustomMarker(); + } + + void setCustomMarker() async { + await Provider.of(context, listen: false).getPlaceList(); + try { + await Future.forEach(_sightsProvider.sightList, (place) async { + OverlayImage icon = + await OverlayImage.fromAssetImage(assetName: place.marker!); + _markers.add(Marker( + width: 30, + height: 40, + markerId: place.title ?? "marker", + icon: icon, + onMarkerTab: _onMarkerTap, + position: LatLng(double.parse(place.latitude ?? ""), + double.parse(place.longitude ?? "")) //예외처리해주기 + )); + }); + _sightsProvider.setState(MarkerListState.markerCompleted); + } catch (e) { + _sightsProvider.setState(MarkerListState.empty); + } } @override Widget build(BuildContext context) { _sightsProvider = Provider.of(context); - final state = _sightsProvider.state; - var logger = Logger('Logger'); + return Scaffold( + body: NaverMap( + onMapCreated: onMapCreated, + initialCameraPosition: const CameraPosition( + target: LatLng(37.349741467772, 126.76182486561), zoom: 11), + mapType: MapType.Basic, + initLocationTrackingMode: LocationTrackingMode.None, + locationButtonEnable: true, + markers: _markers, + ), + ); + } - void routeDialog(Place place) => showModalBottomSheet( - context: context, - //barrierDismissible - Dialog를 제외한 다른 화면 터치 x - shape: const RoundedRectangleBorder( - borderRadius: BorderRadius.only( - topLeft: Radius.circular(15.0), - topRight: Radius.circular(15.0))), - builder: (BuildContext context) { - double height = MediaQuery.of(context).size.height; - double width = MediaQuery.of(context).size.width; - - return Column( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - mainAxisSize: MainAxisSize.min, - children: [ - Container( - padding: const EdgeInsets.fromLTRB(24, 38, 24, 30), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - style: const TextStyle( - fontFamily: 'Pretendard', - fontSize: 24, - fontWeight: FontWeight.w700), - place.title!), - const SizedBox( - height: 8, - ), - if (place.roadAddress == null || place.roadAddress == "") ...[ + void routeDialog(Place place) => showModalBottomSheet( + context: context, + //barrierDismissible - Dialog를 제외한 다른 화면 터치 x + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(15.0), topRight: Radius.circular(15.0))), + builder: (BuildContext context) { + return Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + mainAxisSize: MainAxisSize.min, + children: [ + Container( + padding: const EdgeInsets.fromLTRB(24, 38, 24, 30), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + style: const TextStyle( + fontFamily: 'Pretendard', + fontSize: 24, + fontWeight: FontWeight.w700), + place.title!), + const SizedBox( + height: 8, + ), + if (place.roadAddress == null || + place.roadAddress == "") ...[ Text( place.jibunAddress!, style: const TextStyle( @@ -85,110 +111,66 @@ class _SightsPageState extends State { color: Color.fromRGBO(51, 51, 51, 0.5)), ) ], - const SizedBox( - height: 8, - ), - const Divider( - color: Color.fromRGBO(233, 236, 239, 1), - thickness: 1.0, + const SizedBox( + height: 8, + ), + const Divider( + color: Color.fromRGBO(233, 236, 239, 1), + thickness: 1.0, + ), + const SizedBox(height: 16.0), + ClipRRect( + borderRadius: BorderRadius.circular(8.0), + child: Image.asset( + place.image!, + height: 160.0, + width: MediaQuery.of(context).size.width, + fit: BoxFit.fill, ), - const SizedBox(height: 16.0), - ClipRRect( - borderRadius: BorderRadius.circular(8.0), - child: Image.asset( - place.image!, - height: 160.0, - width: MediaQuery.of(context).size.width, - fit: BoxFit.fill, - ), - ) - ])), - InkWell( - onTap: () async { - logger.fine("placeList : $place"); - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => MultiProvider( - providers: [ - ChangeNotifierProvider( - create: (context) => - NavigationProvider([place])), - ChangeNotifierProvider( - create: (context) => RidingProvider()) - ], - child: const NavigationPage(), - ))); - }, - child: Container( - alignment: Alignment.center, - width: MediaQuery.of(context).size.width, - height: 60, - color: const Color.fromRGBO(240, 120, 5, 1), - child: const Text('안내 시작', - style: TextStyle( - fontFamily: 'Pretendard', - color: Colors.white, - fontSize: 18, - fontWeight: FontWeight.w700)))) - ], - ); - }); - - Future setCustomMarker() async { - try { - await Future.forEach(_sightsProvider.sightList, (place) async { - final customIcon = - await CustomMarker().getPictuerMarker(place.marker!); - markers.add(Marker( - markerId: MarkerId(place.title ?? "marker"), - icon: customIcon, - onTap: () => {routeDialog(place)}, - position: LatLng(double.parse(place.latitude ?? ""), - double.parse(place.longitude ?? "")) //예외처리해주기 - )); - }); - _sightsProvider.setState(MarkerListState.markerCompleted); - } catch (e) { - _sightsProvider.setState(MarkerListState.empty); - } - } - - if (state == MarkerListState.placeCompleted) { - setCustomMarker(); - } + ) + ])), + InkWell( + onTap: () async { + logger.fine("placeList : $place"); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => MultiProvider( + providers: [ + ChangeNotifierProvider( + create: (context) => + NavigationProvider([place])), + ChangeNotifierProvider( + create: (context) => RidingProvider()) + ], + child: const NavigationPage(), + ))); + }, + child: Container( + alignment: Alignment.center, + width: MediaQuery.of(context).size.width, + height: 60, + color: const Color.fromRGBO(240, 120, 5, 1), + child: const Text('안내 시작', + style: TextStyle( + fontFamily: 'Pretendard', + color: Colors.white, + fontSize: 18, + fontWeight: FontWeight.w700)))) + ], + ); + }); + + void onMapCreated(NaverMapController controller) { + if (_controller.isCompleted) _controller = Completer(); + _controller.complete(controller); + } - return Scaffold( - body: GoogleMap( - mapType: MapType.normal, - markers: Set.from(markers), - initialCameraPosition: const CameraPosition( - target: LatLng(37.349741467772, 126.76182486561), zoom: 12.9), - onMapCreated: (GoogleMapController controller) { - _controller.complete(controller); - }, - myLocationButtonEnabled: true, - myLocationEnabled: true, - //onCameraMove: , - )); + void _onMarkerTap(Marker? marker, Map iconSize) { + Place place = _sightsProvider.sightList + .where((p) => marker?.markerId == p.title) + .toList() + .first; + routeDialog(place); } } - - - // List location = [ - // MarkerInfo("정왕 자전거 대여소", LatLng(37.343991285297, 126.74729588817), - // "월 ~ 금\n(07시 ~ 21시)\n토요일, 일요일, 공휴일 휴무\n☎ 031-433-0101"), - // MarkerInfo("월곧 자전거 대여소", LatLng(37.3917953, 126.742692), - // "수 ~ 일\n(09시 ~ 20시)\n월요일, 화요일, 공휴일 휴무\n☎ 031-433-0101") - // ]; - - // @override - // void initState(){ - // super.initState(); - // _markers.add(Marker( - // markerId: MarkerId("1"), - // draggable: true, - // onTap: () => print("Marker!"), - // position: const LatLng(37.343991285297, 126.74729588817) - // )); - // } diff --git a/lib/src/provider/home_record_provider.dart b/lib/src/provider/home_record_provider.dart index 605988f..b77eee7 100644 --- a/lib/src/provider/home_record_provider.dart +++ b/lib/src/provider/home_record_provider.dart @@ -1,4 +1,3 @@ -import 'dart:developer' as developer; import 'dart:math'; import 'package:firebase_auth/firebase_auth.dart'; @@ -56,9 +55,7 @@ class HomeRecordProvider extends ChangeNotifier { await rootBundle.loadString('assets/json/place.json'); List places = PlaceList.fromJson(placeFromJsonFile).places ?? []; - for (var element in places) { - developer.log(element.image!); - } + for (var element in places) {} // List places = await _fireStoreService.getPlaces(); int num1 = _random.nextInt(places.length); diff --git a/lib/src/provider/map_search_provider.dart b/lib/src/provider/map_search_provider.dart index cb6a66d..0a1d516 100644 --- a/lib/src/provider/map_search_provider.dart +++ b/lib/src/provider/map_search_provider.dart @@ -1,11 +1,10 @@ import 'dart:convert'; -import 'dart:developer' as developer; import 'package:flutter/material.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; +import 'package:flutter_naver_map/flutter_naver_map.dart'; import 'package:flutter_polyline_points/flutter_polyline_points.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:google_maps_flutter/google_maps_flutter.dart' as google_map; import 'package:http/http.dart' as http; import 'package:ridingpartner_flutter/src/models/place.dart'; import 'package:ridingpartner_flutter/src/utils/user_location.dart'; @@ -38,8 +37,8 @@ class MapSearchProvider extends ChangeNotifier { List route = []; - List _polylinePoints = []; - List get polylinePoints => _polylinePoints; + List _polylinePoints = []; + List get polylinePoints => _polylinePoints; Place? _myLocation; @@ -138,7 +137,6 @@ class MapSearchProvider extends ChangeNotifier { } setInitalLocation() async { - developer.log('initial location'); final address = await getMyLocationAddress(); setMyLocation(address); } @@ -169,12 +167,11 @@ class MapSearchProvider extends ChangeNotifier { List? turnPoints = route .map((route) => PolylineWayPoint(location: route.turnPoint ?? "")) .toList(); - List pointLatLngs = []; + List pointLatLngs = []; turnPoints.forEach((element) { List a = element.location.split(','); - pointLatLngs - .add(google_map.LatLng(double.parse(a[1]), double.parse(a[0]))); + pointLatLngs.add(LatLng(double.parse(a[1]), double.parse(a[0]))); }); _polylinePoints = pointLatLngs; diff --git a/lib/src/provider/navigation_provider.dart b/lib/src/provider/navigation_provider.dart index afa6e19..bedf197 100644 --- a/lib/src/provider/navigation_provider.dart +++ b/lib/src/provider/navigation_provider.dart @@ -1,12 +1,10 @@ import 'dart:async'; -import 'dart:ui' as ui; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; +import 'package:flutter_naver_map/flutter_naver_map.dart' as naver; import 'package:flutter_polyline_points/flutter_polyline_points.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:google_maps_flutter/google_maps_flutter.dart' as google_map; import 'package:latlong2/latlong.dart'; import 'package:ridingpartner_flutter/src/models/route.dart'; import 'package:ridingpartner_flutter/src/provider/riding_provider.dart'; @@ -35,8 +33,8 @@ class NavigationProvider with ChangeNotifier { late List _ridingCourse; List _route = []; List _distances = []; - List _polylinePoints = []; - List get polylinePoints => _polylinePoints; + List _polylinePoints = []; + List get polylinePoints => _polylinePoints; late Guide _goalPoint; late Place _goalDestination; @@ -97,8 +95,10 @@ class NavigationProvider with ChangeNotifier { try { myLocation.getMyCurrentLocation(); _position = myLocation.position; + if (_position == null) { + _searchRouteState = SearchRouteState.locationFail; + } } catch (e) { - print(e.toString()); myLocation.checkPermission(); _position = null; _searchRouteState = SearchRouteState.locationFail; @@ -168,19 +168,6 @@ class NavigationProvider with ChangeNotifier { notifyListeners(); } - // Future getMyLocationAddress(Position position) async { - // final url = - // "https://dapi.kakao.com/v2/local/geo/coord2address.json?x=$lon&y=$lat&input_coord=WGS84"; - // Map requestHeaders = {'Authorization': 'KakaoAK $kakaoKey'}; - // final response = await http.get(Uri.parse(url), headers: requestHeaders); - // final address = json.decode(response.body)['documents'][0]['address'] - // ['address_name'] ?? - // ''; - // developer.log(address); - - // return address; - // } - Future startNavigation() async { setState(RidingState.riding); _positionStream.controller.stream.listen((pos) { @@ -225,7 +212,7 @@ class NavigationProvider with ChangeNotifier { _goalPoint = _route[0]; // _nextPoint = null; if (isFirst) { - _polylinePoints.removeAt(0); + // _polylinePoints.removeAt(0); isFirst = false; } _remainedDistance -= _distances.last; @@ -237,7 +224,7 @@ class NavigationProvider with ChangeNotifier { if (isFirst) { isFirst = false; } else { - _polylinePoints.removeAt(0); + // _polylinePoints.removeAt(0); } _remainedDistance -= _distances.last; _distances.removeLast(); @@ -300,12 +287,11 @@ class NavigationProvider with ChangeNotifier { List? turnPoints = _route .map((route) => PolylineWayPoint(location: route.turnPoint ?? "")) .toList(); - List pointLatLngs = []; + List pointLatLngs = []; for (var element in turnPoints) { List a = element.location.split(','); - pointLatLngs - .add(google_map.LatLng(double.parse(a[1]), double.parse(a[0]))); + pointLatLngs.add(naver.LatLng(double.parse(a[1]), double.parse(a[0]))); } _polylinePoints = pointLatLngs; diff --git a/lib/src/provider/riding_provider.dart b/lib/src/provider/riding_provider.dart index 0389f2d..130d187 100644 --- a/lib/src/provider/riding_provider.dart +++ b/lib/src/provider/riding_provider.dart @@ -3,9 +3,9 @@ import 'dart:typed_data'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_naver_map/flutter_naver_map.dart' as naver; import 'package:flutter_polyline_points/flutter_polyline_points.dart'; import 'package:geolocator/geolocator.dart'; -import 'package:google_maps_flutter/google_maps_flutter.dart' as google_map; import 'package:intl/intl.dart'; import 'package:latlong2/latlong.dart'; import 'package:ridingpartner_flutter/src/models/record.dart'; @@ -15,7 +15,7 @@ import 'package:ridingpartner_flutter/src/utils/user_location.dart'; import '../models/position_stream.dart'; -enum RidingState { before, riding, pause, stop } +enum RidingState { before, riding, pause, stop, error } class RidingProvider with ChangeNotifier { final Distance _calDistance = const Distance(); @@ -37,8 +37,8 @@ class RidingProvider with ChangeNotifier { bool visivility = false; //final 붙여도 되나? -> 안돼요 - List _polylineCoordinates = []; - List get polylineCoordinates => _polylineCoordinates; + List _polylineCoordinates = []; + List get polylineCoordinates => _polylineCoordinates; PolylinePoints polylinePoints = PolylinePoints(); double _sumDistance = 0.0; // 총거리 @@ -53,8 +53,6 @@ class RidingProvider with ChangeNotifier { Position? get position => _position; Uint8List? customIcon; - google_map.BitmapDescriptor pictureIcon = - google_map.BitmapDescriptor.defaultMarker; setRidingState(RidingState state) { _ridingState = state; @@ -80,39 +78,44 @@ class RidingProvider with ChangeNotifier { Future getLocation() async { _position = MyLocation().position; - if (_position != null) { + try { _befLatLng = LatLng(_position!.latitude, position!.longitude); + } catch (e) { + if (_position == null) { + _ridingState = RidingState.error; + } } } Future startRiding() async { + if (_ridingState == RidingState.error) { + notifyListeners(); + return; + } if (_ridingState == RidingState.before) { _ridingDate = DateFormat('yyyy-MM-dd HH:mm:ss').format(DateTime.now()); //format변경 } - // setCustomMarker(); - setRidingState(RidingState.riding); _positionStream.controller.stream.listen((pos) { _position = pos; _polylineCoordinates - .add(google_map.LatLng(_position!.latitude, _position!.longitude)); - //addPolyline(); + .add(naver.LatLng(_position!.latitude, _position!.longitude)); + notifyListeners(); }); _stopwatch.start(); _timer = Timer.periodic(Duration(seconds: 1), ((timer) { if (_position != null) { - if (_time.inSeconds / 3 == 0) { + if (_stopwatch.elapsed.inSeconds % 3 == 0) { _calRecord(_position!); } } if (isDisposed) return; notifyListeners(); - print('noti'); _time = _stopwatch.elapsed; - if (_time.inSeconds / 60 == 0) { + if (_time.inSeconds % 60 == 0) { _saveRecord(); } })); @@ -163,22 +166,4 @@ class RidingProvider with ChangeNotifier { _stopwatch.stop(); _timer.cancel(); } - -/* void addPolyline(){ - google_map.Polyline poliline = google_map.Polyline( - polylineId: const google_map.PolylineId("poly"), - color: Colors.blue, - points: polylineCoordinates - ); - polylines.add(); - - notifyListeners(); - }*/ - // Future setCustomMarker() async { - // customIcon = await CustomMarker().getBytesFromAsset("path", 130); - // } - - // Future setPictureMarker() async { - // pictureIcon = await CustomMarker().getPictuerMarker(""); - // } } diff --git a/lib/src/provider/riding_result_provider.dart b/lib/src/provider/riding_result_provider.dart index 0683873..3168474 100644 --- a/lib/src/provider/riding_result_provider.dart +++ b/lib/src/provider/riding_result_provider.dart @@ -2,12 +2,11 @@ import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:fluttertoast/fluttertoast.dart'; -import 'dart:developer' as developer; import 'package:image_picker/image_picker.dart'; +import 'package:permission_handler/permission_handler.dart'; import 'package:ridingpartner_flutter/src/models/record.dart'; import 'package:ridingpartner_flutter/src/provider/home_record_provider.dart'; import 'package:ridingpartner_flutter/src/service/firebase_database_service.dart'; -import 'package:permission_handler/permission_handler.dart'; import 'package:ridingpartner_flutter/src/service/shared_preference.dart'; import '../models/result.dart'; @@ -32,7 +31,7 @@ class RidingResultProvider with ChangeNotifier { late Record _record; Record get record => _record; - late final List _images; + List _images = []; List get images => _images; List? _downloadImages; @@ -75,7 +74,6 @@ class RidingResultProvider with ChangeNotifier { if (imageXFiles.isNotEmpty) { _images = imageXFiles; _imageStatus = ImageStatus.imageSuccess; - developer.log(_images.toString()); } else { _imageStatus = ImageStatus.init; } @@ -93,9 +91,7 @@ class RidingResultProvider with ChangeNotifier { Fluttertoast.showToast(msg: "사진은 최대 4장까지 선택 가능합니다."); } notifyListeners(); - } catch (e) { - developer.log(e.toString()); - } + } catch (e) {} } Future confirmPermissionGranted() async { diff --git a/lib/src/provider/sights_provider.dart b/lib/src/provider/sights_provider.dart index c20f548..18d9f65 100644 --- a/lib/src/provider/sights_provider.dart +++ b/lib/src/provider/sights_provider.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:flutter_naver_map/flutter_naver_map.dart'; import 'package:ridingpartner_flutter/src/service/firestore_service.dart'; import '../models/place.dart'; @@ -35,7 +35,7 @@ class SightsProvider with ChangeNotifier { final routeFromJsonFile = await rootBundle.loadString('assets/json/place.json'); _sightList = PlaceList.fromJson(routeFromJsonFile).places ?? []; - _sightList = _sightList.where((element) => element.marker!="").toList(); + _sightList = _sightList.where((element) => element.marker != "").toList(); if (_sightList.isEmpty) { _state = MarkerListState.empty; } else { diff --git a/lib/src/service/firebase_database_service.dart b/lib/src/service/firebase_database_service.dart index 6ac7ebb..65d7c02 100644 --- a/lib/src/service/firebase_database_service.dart +++ b/lib/src/service/firebase_database_service.dart @@ -1,5 +1,4 @@ import 'dart:convert'; -import 'dart:developer' as developer; import 'package:firebase_auth/firebase_auth.dart'; import 'package:firebase_database/firebase_database.dart'; @@ -24,10 +23,8 @@ class FirebaseDatabaseService { "kcal": record.kcal, "images": record.images != null ? json.encode(record.images) : null }) - .then((_) => {developer.log("firebase 기록 저장 성공 $record")}) - .catchError((onError) { - print(onError.toString()); - }); + .then((_) => {}) + .catchError((onError) {}); PreferenceUtils.saveRecordPref(record); } @@ -35,10 +32,8 @@ class FirebaseDatabaseService { DatabaseReference ref = _database.ref("$_uId/${record.date}"); await ref .set({"memo": record.memo}) - .then((_) => {print("메모 내용: ${record.memo}")}) - .catchError((onError) { - print(onError.toString()); - }); + .then((_) => {}) + .catchError((onError) {}); PreferenceUtils.saveRecordMemoPref(record); } @@ -71,7 +66,6 @@ class FirebaseDatabaseService { final DataSnapshot snapshot = await ref.get(); if (snapshot.exists) { - print("데이터 있음"); Map map = snapshot.value as Map; // return map.values.map(Record.fromDB).toList(); records = map.values.map((recordEl) { @@ -91,11 +85,9 @@ class FirebaseDatabaseService { // .toList() }; } else { - print("데이터 없음"); return {'state': RecordState.none}; } } catch (e) { - print("catch!"); return {'state': RecordState.fail}; } } diff --git a/lib/src/service/firebase_storage_service.dart b/lib/src/service/firebase_storage_service.dart index 72018c4..c0a0452 100644 --- a/lib/src/service/firebase_storage_service.dart +++ b/lib/src/service/firebase_storage_service.dart @@ -1,4 +1,3 @@ -import 'dart:developer' as developer; import 'dart:io'; import 'package:firebase_storage/firebase_storage.dart'; @@ -16,7 +15,6 @@ class FirebaseStorageService { return downloadUrl; } catch (e) { - developer.log(e.toString()); return "err"; } } diff --git a/lib/src/service/social_login_service.dart b/lib/src/service/social_login_service.dart index 29e7034..6cdaa08 100644 --- a/lib/src/service/social_login_service.dart +++ b/lib/src/service/social_login_service.dart @@ -1,5 +1,3 @@ -import 'dart:developer' as developer; - import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:flutter_naver_login/flutter_naver_login.dart' as naver_flutter; @@ -31,7 +29,6 @@ class SocialLoginService { saveUserInfo(user.user!); return user.user!; } catch (error) { - developer.log(error.toString()); Fluttertoast.showToast( msg: "error: 해당 계정의 이메일이 네이버 혹은 구글 로그인으로 이미 등록된 이메일인지 확인해주세요.", toastLength: Toast.LENGTH_LONG); @@ -42,7 +39,6 @@ class SocialLoginService { await kakao_flutter.UserApi.instance.loginWithKakaoAccount(); kakao_flutter.User kakaoUser = await kakao_flutter.UserApi.instance.me(); - developer.log('kakaoUser: $kakaoUser'); UserCredential user = await loginWithUser({ 'platform': 'kakao', 'uId': kakaoUser.id.toString(), @@ -52,7 +48,6 @@ class SocialLoginService { saveUserInfo(user.user!); return user.user; } catch (error) { - developer.log(error.toString()); Fluttertoast.showToast( msg: "error: 해당 계정의 이메일이 네이버 혹은 구글 로그인으로 이미 등록된 이메일인지 확인해주세요.", toastLength: Toast.LENGTH_LONG); @@ -78,7 +73,6 @@ class SocialLoginService { saveUserInfo(user.user!); return user.user; } catch (error) { - developer.log(error.toString()); Fluttertoast.showToast( msg: "error: 해당 계정의 이메일이 카카오톡 혹은 구글 로그인으로 이미 등록된 이메일인지 확인해주세요.", toastLength: Toast.LENGTH_LONG); @@ -94,7 +88,6 @@ class SocialLoginService { credencial = await FirebaseAuth.instance.createUserWithEmailAndPassword( email: user['email'], password: user['uId']); } catch (error) { - developer.log(error.toString()); } finally { credencial = await FirebaseAuth.instance.signInWithEmailAndPassword( email: user['email'], password: user['uId']); @@ -146,7 +139,6 @@ class SocialLoginService { Future saveUserInfo(User user) async { final prefs = await SharedPreferences.getInstance(); - developer.log('save'); prefs.setString('name', user.displayName.toString()); prefs.setString('email', user.email.toString()); prefs.setString('token', user.getIdToken().toString()); @@ -157,27 +149,13 @@ class SocialLoginService { final FirebaseDatabaseService _databaseService = FirebaseDatabaseService(); Future withdrawal() async { - while (true) { - final googleUser = await GoogleSignIn().signIn(); - final GoogleSignInAuthentication googleAuth = - await googleUser!.authentication; - - final OAuthCredential credential = GoogleAuthProvider.credential( - accessToken: googleAuth.accessToken, - idToken: googleAuth.idToken, - ); - - await fAuth.currentUser?.reauthenticateWithCredential(credential); - _databaseService.delRecord(); - try { - await fAuth.currentUser?.delete(); - fAuth.signOut(); - break; - } catch (e) { - print('계정탈퇴에 실패했습니다.'); - } - Future.delayed(const Duration(seconds: 3)); - } + _databaseService.delRecord(); + try { + await fAuth.currentUser?.delete(); + fAuth.signOut(); + } catch (e) {} + Future.delayed(const Duration(seconds: 3)); + return true; } @@ -186,7 +164,6 @@ class SocialLoginService { await fAuth.signOut(); return true; } catch (e) { - print(e.toString()); return false; } } diff --git a/lib/src/service/wether_service.dart b/lib/src/service/wether_service.dart index 357a9c1..2b3ad81 100644 --- a/lib/src/service/wether_service.dart +++ b/lib/src/service/wether_service.dart @@ -1,5 +1,3 @@ -import 'dart:developer' as developer; - import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:ridingpartner_flutter/src/models/result.dart'; import 'package:ridingpartner_flutter/src/network/network_helper.dart'; @@ -11,7 +9,6 @@ class OpenWeatherService { Future getWeather() async { MyLocation myLocation = MyLocation(); - developer.log("myLocation called in network"); try { await myLocation.getMyCurrentLocation().timeout(Duration(seconds: 3)); @@ -22,102 +19,3 @@ class OpenWeatherService { return result; } } - -// //class Network -// class WeatherService { -// final String _apiKey = dotenv.env['apiKey']!; -// final String _path = dotenv.env['path']!; -// final String _endpointUrl = dotenv.env['endPointUrl']!; -// //getWeatherData -// Future getWeatherData() async { -// var weather = Weather(); -// MyLocation myLocation = MyLocation(); -// developer.log("myLocation called in network"); -// try { -// await myLocation.getMyCurrentLocation(); -// } catch (e) { -// developer.log("error : getLocation ${e.toString()}"); -// } -// //get the current time -// final now = DateTime.now(); -// var baseDate = DateFormat('yyyyMMdd').format(now); -// var baseTime = DateFormat('HHmm').format(now); -// baseTime = redefineBaseTime(baseTime); -// if (baseTime.substring(0, 2) == '23') { -// baseDate = DateFormat('yyyyMMdd').format(now.subtract(Duration(days: 1))); -// } -// final gridData = -// ConvGridGps.gpsToGRID(myLocation.latitude!, myLocation.longitude!); -// final Map queryParams = { -// 'serviceKey': _apiKey, -// 'pageNo': 1, -// 'numOfRows': 60, -// 'dataType': 'JSON', -// 'base_date': baseDate, -// 'base_time': baseTime, -// 'nx': gridData['x'], -// 'ny': gridData['y'] -// }.map((key, value) => MapEntry(key, value.toString())); -// final requestUrl = Uri.https(_endpointUrl, _path, queryParams); -// var response = await http.get(requestUrl); -// developer.log(requestUrl.toString()); -// if (response.statusCode == 200) { -// try { -// var jsonResponse = jsonDecode(response.body); -// var weatherData = WeatherData.fromJson(jsonResponse); -// var weatherItems = weatherData.response!.body!.items!.item!; - -// for (var i = 0; i < weatherItems.length; i += 6) { -// var weatherItem = weatherItems[i]; - -// switch (weatherItem.category) { -// case 'PTY': -// weather.rainType ??= -// WeatherInfoConverter.getRainType(weatherItem.fcstValue); -// break; -// case 'SKY': -// weather.skyType ??= -// WeatherInfoConverter.getSkyType(weatherItem.fcstValue); -// break; -// case 'T1H': -// weather.temperature ??= weatherItem.fcstValue; -// break; -// case 'REH': -// weather.humidity ??= weatherItem.fcstValue; -// break; -// } -// } -// developer.log(weather.temperature.toString()); -// return weather; -// } catch (e) { -// developer.log('getWeatherData 오류'); -// developer.log(e.toString()); -// return weather; -// } -// } else { -// return weather; -// } -// } - -// redefineBaseTime(baseTime) { -// String h = baseTime.substring(0, 2); -// String m = baseTime.substring(2, 4); - -// int minute = int.parse(m); -// //기상청 api가 최신 데이터를 못받아오는 일이 잦아 약 1시간전 데이터를 받아오는 것으로 고정 -// if (h == '00') { -// h = '23'; -// } else { -// h = (int.parse(h) - 1).toString(); -// } - -// if (minute < 45) { -// m = '00'; -// } else { -// m = '30'; -// } -// return h + m; -// } -// } - - diff --git a/lib/src/utils/custom_marker.dart b/lib/src/utils/custom_marker.dart index f62cbff..daa03ca 100644 --- a/lib/src/utils/custom_marker.dart +++ b/lib/src/utils/custom_marker.dart @@ -7,7 +7,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'package:http/http.dart' as http; -import 'package:google_maps_flutter/google_maps_flutter.dart'; class CustomMarker { // 마커 asset 아이콘으로 넣기, width로 사이즈 조절 @@ -20,9 +19,4 @@ class CustomMarker { .buffer .asUint8List(); } - - Future getPictuerMarker(String path) async { - Uint8List makerIconBytes = await getBytesFromAsset(path); - return BitmapDescriptor.fromBytes(makerIconBytes); - } } diff --git a/lib/src/utils/user_location.dart b/lib/src/utils/user_location.dart index fb1fa93..26d6dc7 100644 --- a/lib/src/utils/user_location.dart +++ b/lib/src/utils/user_location.dart @@ -1,5 +1,3 @@ -import 'dart:developer' as developer; - import 'package:geolocator/geolocator.dart'; class MyLocation { @@ -47,45 +45,9 @@ class MyLocation { try { position = await Geolocator.getCurrentPosition( desiredAccuracy: LocationAccuracy.high); - developer.log( - "latitude : ${position?.latitude} , longitude : ${position?.longitude}"); } catch (e) { - developer.log("error : getMyCurrentLocation ${e.toString()}"); - position = await Geolocator.getLastKnownPosition().timeout( - Duration(seconds: 3), - onTimeout: () => position = const Position( - longitude: 126.98935225645432, - latitude: 37.579871128849334, - timestamp: null, - accuracy: 0.0, - altitude: 0.0, - heading: 0.0, - speed: 0.0, - speedAccuracy: 0.0)); + position = await Geolocator.getLastKnownPosition() + .timeout(Duration(seconds: 3), onTimeout: () => position = null); } } - - // Future _cheakPermission() async { - // bool serviceEnabled; - // LocationPermission permission; - // developer.log("안녕"); - // // Test if location services are enabled. - // serviceEnabled = await Geolocator.isLocationServiceEnabled(); - // if (!serviceEnabled) { - // return Future.error('Location services are disabled.'); - // } - - // permission = await Geolocator.checkPermission(); - // if (permission == LocationPermission.denied) { - // permission = await Geolocator.requestPermission(); - // if (permission == LocationPermission.denied) { - // return Future.error('Location permissions are denied'); - // } - // } - - // if (permission == LocationPermission.deniedForever) { - // return Future.error( - // 'Location permissions are permanently denied, we cannot request permissions.'); - // } - // } } diff --git a/pubspec.yaml b/pubspec.yaml index 9aa3e7b..1dc99e9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -17,7 +17,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: 1.0.0+1 +version: 1.0.0+2 environment: sdk: '>=2.18.1 <3.0.0' @@ -73,6 +73,8 @@ dependencies: carousel_slider: ^4.2.1 smooth_page_indicator: ^1.0.0+2 logging: ^1.1.1 + shared_preferences_ios: ^2.1.1 + flutter_naver_map: ^0.10.6 dev_dependencies: flutter_test: