화면 기록 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=
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');
}
}
}
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']),
);
},
),
),
],
),
),
],
),
),
),
);
}
}