developers ID = 1123048
SDK version = ^1.9.5
카카오 로그인 구현 중, 웹사이트으로 카카오 로그인 과정에서 아래와 같은 오류가 발생하며, 디바이스(애뮬레이터)와의 연결이 끊어집니다. 그리고 물론 로그인조차 되지 않습니다.
- login_opening_screen.dart 속 카카오 로그인 구현 로직
@override
void initState() {
super.initState();
KakaoSdk.init(nativeAppKey: '3cbc4103340e6be3c6247d5228d55534'); // 네이티브 앱 키 설정
_timer = Timer.periodic(Duration(seconds: 3), (Timer timer) {
setState(() {
_currentImageIndex = (_currentImageIndex + 1) % _backgroundImages.length;
});
});
_checkLoginStatus(); // 앱 시작 시 로그인 상태 확인
}
void signInWithKakao() async {
setState(() {
_isLoadingKakao = true; // 로딩 시작
});
try {
// 카카오톡이 설치되어 있는지 확인 후, 카카오톡으로 로그인 시도
if (await kko.isKakaoTalkInstalled()) {
try {
await kko.UserApi.instance.loginWithKakaoTalk();
final prefs = await SharedPreferences.getInstance();
await prefs.setBool('isLoggedIn', true); // 로그인 상태 저장
await prefs.setString('loginMethod', 'kakao'); // 로그인 방법 저장
print('카카오톡으로 로그인 성공');
} catch (error) {
print('카카오톡으로 로그인 실패 $error');
// 카카오톡 로그인 실패 시, 카카오 계정으로 로그인 시도
await kko.UserApi.instance.loginWithKakaoAccount();
final prefs = await SharedPreferences.getInstance();
await prefs.setBool('isLoggedIn', true); // 로그인 상태 저장
await prefs.setString('loginMethod', 'kakao'); // 로그인 방법 저장
print('카카오 계정으로 로그인 성공');
}
} else {
// 카카오톡이 설치되어 있지 않은 경우, 카카오 계정으로 로그인 시도
await kko.UserApi.instance.loginWithKakaoAccount();
final prefs = await SharedPreferences.getInstance();
await prefs.setBool('isLoggedIn', true); // 로그인 상태 저장
await prefs.setString('loginMethod', 'kakao'); // 로그인 방법 저장
print('카카오 계정으로 로그인 성공');
}
// 로그인 후 사용자 정보 가져오기
kko.User? kakaoUser = await kko.UserApi.instance.me();
String? email = kakaoUser.kakaoAccount?.email ?? '';
String? birthday = kakaoUser.kakaoAccount?.birthday;
String formattedBirthday = birthday != null && birthday.length == 4
? "${birthday.substring(0, 2)}-${birthday.substring(2, 4)}"
: '';
String? phoneNumber = kakaoUser.kakaoAccount?.phoneNumber;
String formattedNumber = phoneNumber != null && phoneNumber.length >= 4
? '0' + phoneNumber.substring(4, 16)
: '';
print(kakaoUser.kakaoAccount);
// 유저 정보를 바탕으로 User 객체를 생성
u.User user = u.User(
u_email: email,
u_name: kakaoUser.kakaoAccount?.name ?? '',
u_img_url: kakaoUser.kakaoAccount?.profile?.profileImageUrl ?? '',
u_nick: kakaoUser.kakaoAccount?.profile?.nickname ?? '',
u_birth: "${kakaoUser.kakaoAccount?.birthyear ?? ''}-${formattedBirthday}",
u_p_number: formattedNumber,
u_address: '',
trip_preference: 3,
business_license: '',
login_provider: 'kakao',
// 기타 필드들 초기화
);
// UserModel 프로바이더를 사용하여 데이터베이스에 유저가 존재하는지 확인
UserModel userModel = Provider.of<UserModel>(context, listen: false);
bool userExists = await userModel.checkUserExists(email: email);
if (userExists) {
// 유저가 이미 존재하면 로그인 함수 호출
await userModel.kakaoLoginUser(user: user);
} else {
// 유저가 존재하지 않으면 등록 함수 호출
await userModel.kakaoRegisterUser(user);
}
// 로그인 성공 시, 팝업 닫기 및 메인 페이지로 이동
// Navigator.of(context).pop(); // 팝업 닫기
Navigator.of(context).pushReplacement(
MaterialPageRoute(builder: (context) => RootScreen()),
);
} catch (error) {
print('카카오 로그인 실패 $error');
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('카카오 로그인에 실패했습니다.'),
),
);
} finally {
setState(() {
_isLoadingKakao = false; // 로딩 종료
});
}
}
- AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:label="마이부산로그"
android:name="${applicationName}"
android:icon="@mipmap/appicon"
android:usesCleartextTraffic="true">
<activity
android:name="com.kakao.sdk.auth.AuthCodeHandlerActivity"
android:exported="true">
<intent-filter android:label="flutter_web_auth">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="kakao3cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" android:host="oauth"/>
</intent-filter>
</activity>
</application>
</manifest>
- SDK 초기화
void main() async {
WidgetsFlutterBinding.ensureInitialized();
KakaoSdk.init(
nativeAppKey: '3cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
// javaScriptAppKey: 'e0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
);
runApp(MyApp());
}