1. 카카오 로그인 기본 사진

Untitled

  1. 필요한 패키지 flutter pub add kakao_flutter_sdk

  2. 기본 로직

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',
      ),
    );
  }
}

  1. main.dart 초기화
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),
    ),
  );
}
  1. info.plist

<?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>