8. 탈퇴하기 로직 / 네이버 지도 길찾기 제작
느낀 점
이제 기초적인 건 전부 다 만들었는데
진짜 세부적인 게 너무 힘들다는 느낌이 든다 ㅋㅋㅋㅋㅋ
일단 오늘 리스트 불러와서 마커에 데이터를 넣는 거까지는 그래도 할만했는데
네이버지도 진짜 왜 안되는지 전혀 모르겠다.. 아직 잘 몰라서 그런가 3트째 실패다.
탈퇴하기
탈퇴하기 로직인데 뭐 설명할 게 많이 없는 거 같다.
누르면 UI 색 변하게 하는 건 쉬웠는데
데이터베이스를 만들어야 된다는 게 조금 까다롭다.
CREATE TABLE withdrawal_reasons (
id UUID DEFAULT uuid_generate_v4() PRIMARY KEY, -- 고유 ID
user_id UUID REFERENCES auth.users(id) ON DELETE CASCADE, -- 유저 ID (외래키)
reason TEXT NOT NULL, -- 탈퇴 사유
created_at TIMESTAMP DEFAULT timezone('utc', now()) -- 저장 시간
);
외래키와 기본키를 설정해 주고
탈퇴를 하면 사용자 UUID와 이유를 저장했다.
만약 두 개 이상을 선택하면
데이터베이스에 두 개가 생기는 구조다.
이건 뭐 많이 받으면 피드백이 되니까 다중 선택이 가능하게 하였다.
탈퇴하기를 하면
Future<void> saveWithdrawalReason() async {
final supabase = Supabase.instance.client;
final user = supabase.auth.currentUser;
if (user == null) {
print("사용자가 로그인되어 있지 않습니다.");
return;
}
try {
List<String> selectedReasonsList = selectedIndexes.map((index) => reasons[index]).toList();
String? otherText = selectedIndexes.contains(reasons.length - 1) ? otherReasonController.text.trim() : null;
for (String reason in selectedReasonsList) {
await supabase.from('withdrawal_reasons').insert({
'user_id': user.id,
'reason': reason == '기타' ? otherText : reason,
});
}
print("탈퇴 사유가 성공적으로 저장되었습니다.");
// 탈퇴 후 로그인 화면으로 이동
Navigator.push(
context,
MaterialPageRoute(builder: (context) => login_total_screen()), // Mmmm4는 이동할 화면의 위젯입니다.
);
} catch (e) {
print("탈퇴 사유 저장 중 오류 발생: $e");
}
}
탈퇴하기 실제로 로직은 넣지 않았다.
7일 뒤에 정보를 삭제해야 된다. 사용자가 다시 돌아올 수 있으니까.
또한 다시 돌아왔을 때 7일 뒤에 삭제되는 로직을 따로 넣어줘야 된다.
네이버 길찾기
길 찾기 버튼을 눌렀을 때
네이버지도앱으로 이동 > 도착지에 내가 누른 마커정보를 넣기
간단한 로직인줄알았는데
네이버 지도 API 길찾기 - 출발지와 도착지 입력
1. Nclound 웹페이지에 길찾기 버튼을 만들고 클릭하면 네이버 지도 어플을 실행하여 출발지는 GPS상 내 현재 위치, 목적지는 미리 정해둔 어떤 장소로 하여 길찾기 기능을 만들고자 한다. 일반적인
lpla.tistory.com
이거 참고해서 만들었는데
자꾸 도착지에 정보가 안 간다.
위치 권한 요청하고 현재 위치를 가져와서 출발지까지는 아무 문제 없이 된다.
// 📌 1️⃣ 위치 권한 요청 + 현재 위치 가져오는 함수
Future<Position?> getCurrentLocation() async {
bool serviceEnabled;
LocationPermission permission;
// ✅ 위치 서비스 활성화 여부 확인
serviceEnabled = await Geolocator.isLocationServiceEnabled();
if (!serviceEnabled) {
print("❌ 위치 서비스가 비활성화됨");
return null;
}
// ✅ 위치 권한 확인 및 요청
permission = await Geolocator.checkPermission();
if (permission == LocationPermission.denied) {
permission = await Geolocator.requestPermission();
if (permission == LocationPermission.denied) {
print("🚨 사용자가 위치 권한을 거부함");
return null;
}
}
// ✅ 권한이 영구적으로 거부된 경우
if (permission == LocationPermission.deniedForever) {
print("🚨 위치 권한이 영구적으로 거부됨");
return null;
}
// ✅ 최종적으로 위치 가져오기
return await Geolocator.getCurrentPosition(
desiredAccuracy: LocationAccuracy.high,
);
}
근데 도착지가 자꾸 안 들어가진다. 진짜 속 터지는 게
I/flutter ( 1672): 🚀 출발지 위도: 37.6119938, 경도: 127.0582237
I/flutter ( 1672): 🏁 도착지 위도: 36.1234229, 경도: 128.1146402
I/flutter ( 1672): 📍 도착지 이름: 123
또 위도 경도 값은 잘 받아오는데
도착지가 안 들어간다는 게 말이 안돼서
찾아 본결과
내가 볼 땐 위도 경도값이 부족한가? 생각했다.
그리고 도착지 코드를 잘못 적었나? 생각했고
둘 다 안된다..
코드는
도착지 코드인데 내가 생각했을 때 문제는 URI 갈 때 오류 나는 거 같다.
APP NAME도 잘 적었고.. 대체 왜..?
내일은 일단 도착지도 위도경도로 넣어봐야겠다 현재는 도착지는 주소값으로 넣었는데 그게 문제가 되는 건가 생각이 든다.
// 📌 2️⃣ 네이버 지도 길찾기 실행 함수 (도착지 주소 포함)
Future<void> navigateToDestination(double latitude, double longitude, String destinationName) async {
try {
Position? currentPosition = await getCurrentLocation();
if (currentPosition == null) {
print("⚠️ 위치 정보를 가져올 수 없음");
return;
}
double startLat = double.parse(currentPosition.latitude.toStringAsFixed(7));
double startLng = double.parse(currentPosition.longitude.toStringAsFixed(7));
double endLat = double.parse(latitude.toStringAsFixed(7));
double endLng = double.parse(longitude.toStringAsFixed(7));
print("🚀 출발지 위도: $startLat, 경도: $startLng");
print("🏁 도착지 위도: $endLat, 경도: $endLng");
print("📍 도착지 이름: ${Uri.encodeComponent(destinationName)}");
final url = Uri.parse(
"nmap://route/public?slat=$startLat&slng=$startLng&dlat=$endLat&dlng=$endLng&rname=${Uri.encodeComponent(destinationName)}&appname=앱이름",
);
print("🔗 네이버 지도 URL: $url");
if (await canLaunchUrl(url)) {
await launchUrl(url);
} else {
final webUrl = Uri.parse(
"https://map.naver.com/v5/directions/-/-/$latitude,$longitude?name=${Uri.encodeComponent(destinationName)}",
);
print("🌍 웹 URL: $webUrl");
await launchUrl(webUrl);
}
} catch (e) {
print("🚨 길찾기 실행 오류: $e");
}
}