필요한 패키지 flutter pub add kakao_flutter_sdk
기본 로직
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:kakao_flutter_sdk/kakao_flutter_sdk.dart'; // 이 친구가 앱하고 연결해주는 친구
import 'package:my_dream/coreService/provider.dart';
import 'package:my_dream/login/snsLogin/login_dio.dart';
class KakaoLogin extends StatefulWidget {
const KakaoLogin({super.key});
@override
State<KakaoLogin> createState() => _KakaoLoginState();
}
class _KakaoLoginState extends State<KakaoLogin> {
void signInWithKakao() async {
LoginModel loginModel = LoginModel();
OAuthToken token;
if (await isKakaoTalkInstalled()) {
try {
token = await UserApi.instance.loginWithKakaoTalk();
String accessToken = token.accessToken;
bool result = await snsLogin('KAKAO', accessToken);
if (result) {
if (mounted) {
loginModel.setloginStatus(result);
Navigator.pushNamed(context, '/StudentIdentityCheck');
}
} else {
loginModel.setloginStatus(result);
}
} catch (error) {
if (error is PlatformException && error.code == 'CANCELED') {
return;
}
try {
token = await UserApi.instance.loginWithKakaoAccount();
String accessToken = token.accessToken;
bool result = await snsLogin('KAKAO', accessToken);
if (result) {
if (mounted) {
loginModel.setloginStatus(result);
Navigator.pushNamed(context, '/StudentIdentityCheck');
}
} else {
loginModel.setloginStatus(result);
}
} catch (error) {}
}
} else {
try {
token = await UserApi.instance.loginWithKakaoAccount();
String accessToken = token.accessToken;
bool result = await snsLogin('KAKAO', accessToken);
if (result) {
if (mounted) {
loginModel.setloginStatus(result);
Navigator.pushNamed(context, '/StudentIdentityCheck');
}
} else {
loginModel.setloginStatus(result);
}
} catch (error) {}
}
}
@override
Widget build(BuildContext context) {
return TextButton(
onPressed: signInWithKakao,
child: Image.asset(
'assets/kakao_login_medium_narrow.png',
),
);
}
}
void main() async {
WidgetsFlutterBinding.ensureInitialized();
bool jailbroken = await FlutterJailbreakDetection.jailbroken;
if (jailbroken /*|| developerMode*/) {
exit(0);
}
KakaoSdk.init(nativeAppKey: 'b179f538adce065911969470751559cb'); //이 부분 추가하기
const storage = FlutterSecureStorage();
String? accessToken = await storage.read(key: 'accessToken');
bool isLoggedIn = accessToken != null;
runApp(
ChangeNotifierProvider(
create: (_) => LoginModel(),
child: MyApp(isLoggedIn: isLoggedIn),
),
);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "<http://www.apple.com/DTDs/PropertyList-1.0.dtd>">
<plist version="1.0">
<dict>
<!-- 기본 설정 생략 -->
<!-- 카카오 로그인에 필요한 Custom URL Scheme -->
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>kakao{your_kakao_app_key}</string> <!-- 여기를 카카오 앱 키로 교체하세요 (예: kakao1234567890abcdefg) -->
</array>
</dict>
</array>
<!-- 카카오 앱에서 호출될 수 있도록 LSApplicationQueriesSchemes에 추가 -->
<key>LSApplicationQueriesSchemes</key>
<array>
<string>kakaokompassauth</string>
<string>kakaolink</string>
<string>storykompassauth</string>
<string>storylink</string>
</array>
<!-- 카카오 API 요청을 위한 네트워크 설정
개발단계에서는 필요없음 -->
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>kakao.com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
<key>kakaocdn.net</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
<!-- 추가 설정들... -->
</dict>
</plist>