화면 기록 2024-07-19 오후 10.05.00.mov

방법 1.

.env 파일에 아래의 내용을 ㅈ KAKAO_API_URL=https://dapi.kakao.com/v2/local/search/keyword.json KAKAO_APP_KEY= KAKAO_REST_API_KEY=

  1. main.dart 파일에 초기화하기

Untitled

  1. 통신할 수 있는 파일 만들기
import 'package:dio/dio.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';

class KakaoApiService {
  Future<List<dynamic>> searchBusinesses(String query) async {
    final String apiKey = dotenv.env['KAKAO_REST_API_KEY']!;

    Dio dio = Dio();
    final url = '${dotenv.env['KAKAO_API_URL']}?query=$query';
    final response = await dio.get(url,
        options: Options(
          headers: {'Authorization': 'KakaoAK $apiKey'},
        ));

    if (response.statusCode == 200) {
      final data = response.data;
      return data['documents'];
    } else {
      throw Exception('Failed to load data');
    }
  }
}

  1. 연결하면 끝!
import 'package:flutter/material.dart';
import 'package:my_dream/coreService/kakao_api_service.dart';
import 'package:my_dream/coreService/widget/custom_appbar.dart';
import 'package:my_dream/coreService/widget/searchbar.dart';

class PartnershipSearch extends StatefulWidget {
  const PartnershipSearch({super.key});

  @override
  State<PartnershipSearch> createState() => _PartnershipSearchState();
}

class _PartnershipSearchState extends State<PartnershipSearch> {
  final KakaoApiService apiService = KakaoApiService();
  List<dynamic> _results = [];
  List<dynamic> saveResults = [];

  void _search(String value) async {
    if (value.isNotEmpty) {
      final saveResults = await apiService.searchBusinesses(value);
      if (saveResults.isNotEmpty) {
        setState(() {
          _results = saveResults;
        });
      } else {
        _results = saveResults;
      }
    } else {
      setState(() {
        _results = [];
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    final screenWidth = MediaQuery.of(context).size.width;
    final screenHeight = MediaQuery.of(context).size.height;

    return Scaffold(
      body: SafeArea(
        child: Padding(
          padding: EdgeInsets.only(
            left: screenWidth * 0.041,
            right: screenWidth * 0.041,
          ),
          child: Column(
            children: [
              SizedBox(
                height: screenHeight * 0.064,
                child: const CustomAppBar(title: '업체 검색'),
              ),
              Searchbar(
                textEditing: '업체명을 입력해주세요.',
                onChanged: (value) {
                  _search(value);
                },
              ),
              const SizedBox(height: 10),
              Expanded(
                child: Stack(
                  children: [
                    AnimatedOpacity(
                      opacity: _results.isNotEmpty ? 0.0 : 1.0,
                      duration: const Duration(milliseconds: 420),
                      child: Column(
                        children: [
                          SizedBox(height: screenHeight * 0.072),
                          const Center(
                            child: Text(
                              '원하시는 업체를 찾아보세요.\\n예) 잎사이 건대점',
                              style: TextStyle(
                                color: Color(0xffc1c1c1),
                                fontFamily: 'Pretendard',
                              ),
                              textAlign: TextAlign.center,
                            ),
                          ),
                        ],
                      ),
                    ),
                    AnimatedOpacity(
                      opacity: _results.isEmpty ? 0.0 : 1.0,
                      duration: const Duration(milliseconds: 420),
                      child: ListView.builder(
                        itemCount: _results.length,
                        itemBuilder: (context, index) {
                          final item = _results[index];
                          return ListTile(
                            title: Text(item['place_name']),
                            subtitle: Text(item['road_address_name'] ??
                                item['address_name']),
                          );
                        },
                      ),
                    ),
                  ],
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}