Created
June 18, 2022 06:36
-
-
Save koboolean/26568689f7d106df01aeaf041a582536 to your computer and use it in GitHub Desktop.
flutter random dog
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'package:dio/dio.dart'; | |
import 'package:flutter/material.dart'; | |
import 'package:provider/provider.dart'; | |
import 'package:shared_preferences/shared_preferences.dart'; | |
void main() async { | |
// main() 함수에서 async를 쓰려면 필요 | |
WidgetsFlutterBinding.ensureInitialized(); | |
// shared_preferences 인스턴스 생성 | |
SharedPreferences prefs = await SharedPreferences.getInstance(); | |
runApp( | |
MultiProvider( | |
providers: [ | |
ChangeNotifierProvider(create: (context) => CatService(prefs)), | |
], | |
child: const MyApp(), | |
), | |
); | |
} | |
class MyApp extends StatelessWidget { | |
const MyApp({Key? key}) : super(key: key); | |
@override | |
Widget build(BuildContext context) { | |
return MaterialApp( | |
debugShowCheckedModeBanner: false, | |
home: HomePage(), | |
); | |
} | |
} | |
/// 강아지 서비스 | |
class CatService extends ChangeNotifier { | |
// 강아지 사진 담을 변수 | |
List<String> catImages = []; | |
// 좋아요 사진 | |
List<String> favoriteImages = []; | |
// SharedPreferences 인스턴스 | |
SharedPreferences prefs; | |
// 생성자(Constructor) | |
// 랜덤강아지 사진 API가 호출될 때 실행되도록 설정 | |
CatService(this.prefs) { | |
getRandomCatImages(); // api 호출 | |
// favorites로 저장된 favoriteImages를 가져옵니다. | |
// 저장된 값이 없는 경우 null을 반환하므로 이때는 빈 배열을 넣어줍니다. | |
favoriteImages = prefs.getStringList("favorites") ?? []; | |
} | |
// 랜덤 강아지 사진 API 호출 | |
void getRandomCatImages() async { | |
catImages = []; | |
var result = await Dio().get( | |
"https://api.thedogapi.com/v1/images/search?limit=10&mime_types=jpg", | |
); | |
for (int i = 0; i < result.data.length; i++) { | |
var map = result.data[i]; // 반복문을 돌며 i번째의 map에 접근 | |
catImages.add(map['url']); // catImages에 이미지 추가 | |
} | |
notifyListeners(); // 새로고침 | |
} | |
// 좋아요 토글 | |
void toggleFavoriteImage(String catImage) { | |
if (favoriteImages.contains(catImage)) { | |
favoriteImages.remove(catImage); // 이미 좋아요한 경우 제거 | |
} else { | |
favoriteImages.add(catImage); // 새로운 사진 추가 | |
} | |
// favoriteImages를 favorites라는 이름으로 저장하기 | |
prefs.setStringList("favorites", favoriteImages); | |
notifyListeners(); // 새로고침 | |
} | |
} | |
/// 홈 페이지 | |
class HomePage extends StatelessWidget { | |
const HomePage({Key? key}) : super(key: key); | |
@override | |
Widget build(BuildContext context) { | |
return Consumer<CatService>( | |
builder: (context, catService, child) { | |
return Scaffold( | |
appBar: AppBar( | |
title: Text("랜덤 강아지"), | |
backgroundColor: Colors.amber, | |
actions: [ | |
// 좋아요 페이지로 이동 | |
IconButton( | |
icon: Icon(Icons.favorite), | |
onPressed: () { | |
Navigator.push( | |
context, | |
MaterialPageRoute(builder: (context) => FavoritePage()), | |
); | |
}, | |
), | |
IconButton( | |
icon: Icon(Icons.refresh), | |
onPressed: () { | |
catService.getRandomCatImages(); // 새로고침 | |
}, | |
) | |
], | |
), | |
// 강아지 사진 목록 | |
body: GridView.count( | |
mainAxisSpacing: 8, | |
crossAxisSpacing: 8, | |
padding: EdgeInsets.all(8), | |
crossAxisCount: 2, | |
children: List.generate( | |
catService.catImages.length, // 보여주려는 항목 개수 | |
(index) { | |
String catImage = catService.catImages[index]; | |
return GestureDetector( | |
onTap: () { | |
catService.toggleFavoriteImage(catImage); | |
}, | |
child: Stack( | |
children: [ | |
// 사진 | |
Positioned.fill( | |
child: Image.network( | |
catImage, | |
fit: BoxFit.cover, | |
), | |
), | |
// 좋아요 | |
Positioned( | |
bottom: 8, | |
right: 8, | |
child: Icon( | |
Icons.favorite, | |
color: catService.favoriteImages.contains(catImage) | |
? Colors.amber | |
: Colors.transparent, | |
), | |
), | |
], | |
), | |
); | |
}, | |
), | |
), | |
); | |
}, | |
); | |
} | |
} | |
/// 좋아요 페이지 | |
class FavoritePage extends StatelessWidget { | |
const FavoritePage({Key? key}) : super(key: key); | |
@override | |
Widget build(BuildContext context) { | |
return Consumer<CatService>( | |
builder: (context, catService, child) { | |
return Scaffold( | |
appBar: AppBar( | |
title: Text("좋아요"), | |
backgroundColor: Colors.amber, | |
), | |
body: GridView.count( | |
mainAxisSpacing: 8, | |
crossAxisSpacing: 8, | |
padding: EdgeInsets.all(8), | |
crossAxisCount: 2, | |
children: List.generate( | |
catService.favoriteImages.length, // 보여주려는 항목 개수 | |
(index) { | |
String catImage = catService.favoriteImages[index]; | |
return GestureDetector( | |
onTap: () { | |
catService.toggleFavoriteImage(catImage); | |
}, | |
child: Stack( | |
children: [ | |
// 사진 | |
Positioned.fill( | |
child: Image.network( | |
catImage, | |
fit: BoxFit.cover, | |
), | |
), | |
// 좋아요 | |
Positioned( | |
bottom: 8, | |
right: 8, | |
child: Icon( | |
Icons.favorite, | |
color: catService.favoriteImages.contains(catImage) | |
? Colors.amber | |
: Colors.transparent, | |
), | |
), | |
], | |
), | |
); | |
}, | |
), | |
), | |
); | |
}, | |
); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment