Skip to content

Commit

Permalink
add: 왕초보 버전 이미지 검색 앱
Browse files Browse the repository at this point in the history
  • Loading branch information
junsuk5 committed Apr 18, 2024
1 parent d09cb2b commit df6f29d
Show file tree
Hide file tree
Showing 17 changed files with 195 additions and 24 deletions.
6 changes: 6 additions & 0 deletions analysis_options.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,9 @@ linter:

# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options
analyzer:
exclude:
- "**/*.g.dart"
- "**/*.freezed.dart"
errors:
invalid_annotation_target: ignore
1 change: 0 additions & 1 deletion lib/00_common_data/repository/post_repository.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import '../data_source/json_place_holder_api.dart';
import '../model/post.dart';
import '../model/user.dart';

abstract interface class PostRepository {
Future<Post> getPost(int id);
Expand Down
4 changes: 2 additions & 2 deletions lib/02_future_set_state_sample/future_set_state.dart
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class _FutureSetStateState extends State<FutureSetState> {
@override
void initState() {
super.initState();
print('initState');
debugPrint('initState');

setState(() {
isLoading = true;
Expand All @@ -36,7 +36,7 @@ class _FutureSetStateState extends State<FutureSetState> {
// 그림 그리는 부분
@override
Widget build(BuildContext context) {
print('build');
debugPrint('build');
// 데이터 요청 절대 금지
// todoRepository.getTodos().then((todos) {
// setState(() {
Expand Down
1 change: 0 additions & 1 deletion lib/03_future_builder_sample/main.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import 'package:flutter/material.dart';
import 'package:learn_flutter_together/02_future_set_state_sample/future_set_state.dart';
import 'package:learn_flutter_together/03_future_builder_sample/future_builder_sample.dart';

import '../00_common_data/repository/todo_repository.dart';
Expand Down
2 changes: 0 additions & 2 deletions lib/04_album_photo/main.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
import 'package:flutter/material.dart';
import 'package:learn_flutter_together/04_album_photo/router/router.dart';

import 'presentation/album_list/album_list_screen.dart';

void main() {
runApp(const MyApp());
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:learn_flutter_together/00_common_data/model/photo.dart';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:learn_flutter_together/00_common_data/model/photo.dart';
import 'package:learn_flutter_together/00_common_data/repository/photo_repository.dart';
import 'package:learn_flutter_together/04_album_photo/presentation/photo_detail/photo_detail_screen.dart';
Expand Down
5 changes: 1 addition & 4 deletions lib/07_counter_inherited_widget/router/router.dart
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
import 'package:go_router/go_router.dart';
import 'package:learn_flutter_together/00_common_data/data_source/json_place_holder_api.dart';
import 'package:learn_flutter_together/00_common_data/repository/album_repository.dart';
import 'package:learn_flutter_together/04_album_photo/presentation/album_list/album_list_screen.dart';
import 'package:provider/provider.dart';

import '../../05_counter_mvvm/repository/counter_repository.dart';
import '../presentation/counter_screen.dart';
import '../presentation/counter_view_model.dart';
import 'package:provider/provider.dart';

// GoRouter configuration
final router = GoRouter(
Expand Down
12 changes: 12 additions & 0 deletions lib/09_use_case/domain/use_case/get_photos_top3_use_case.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import '../model/photo.dart';
import '../repository/photo_repository.dart';

class GetPhotosTop3UseCase {
final PhotoRepository _photoRepository;

GetPhotosTop3UseCase(this._photoRepository);

Future<List<Photo>> execute(String query) async {
return (await _photoRepository.getPhotos(query)).take(3).toList();
}
}
12 changes: 12 additions & 0 deletions lib/09_use_case/domain/use_case/get_photos_top5_use_case.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import '../model/photo.dart';
import '../repository/photo_repository.dart';

class GetPhotosTop5UseCase {
final PhotoRepository _photoRepository;

GetPhotosTop5UseCase(this._photoRepository);

Future<List<Photo>> execute(String query) async {
return (await _photoRepository.getPhotos(query)).take(5).toList();
}
}
19 changes: 15 additions & 4 deletions lib/09_use_case/domain/use_case/get_photos_use_case.dart
Original file line number Diff line number Diff line change
@@ -1,12 +1,23 @@
import 'package:learn_flutter_together/09_use_case/domain/use_case/get_photos_top3_use_case.dart';
import 'package:learn_flutter_together/09_use_case/domain/use_case/get_photos_top5_use_case.dart';

import '../model/photo.dart';
import '../repository/photo_repository.dart';

class GetPhotosUseCase {
final PhotoRepository _photoRepository;
final GetPhotosTop3UseCase _getPhotosTop3UseCase;
final GetPhotosTop5UseCase _getPhotosTop5UseCase;

GetPhotosUseCase(this._photoRepository);
const GetPhotosUseCase({
required GetPhotosTop3UseCase getPhotosTop3UseCase,
required GetPhotosTop5UseCase getPhotosTop5UseCase,
}) : _getPhotosTop3UseCase = getPhotosTop3UseCase,
_getPhotosTop5UseCase = getPhotosTop5UseCase;

Future<List<Photo>> execute(String query) async {
return (await _photoRepository.getPhotos(query)).take(3).toList();
if (DateTime.now().minute.isEven) {
return _getPhotosTop3UseCase.execute(query);
} else {
return _getPhotosTop5UseCase.execute(query);
}
}
}
16 changes: 16 additions & 0 deletions lib/09_use_case/domain/use_case/search_list_use_cases.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import 'package:learn_flutter_together/09_use_case/domain/use_case/get_photos_top3_use_case.dart';

import 'get_photos_top5_use_case.dart';
import 'get_photos_use_case.dart';

class SearchListUseCases {
final GetPhotosTop3UseCase getPhotosTop3UseCase;
final GetPhotosTop5UseCase getPhotosTop5UseCase;
final GetPhotosUseCase getPhotosUseCase;

const SearchListUseCases({
required this.getPhotosTop3UseCase,
required this.getPhotosTop5UseCase,
required this.getPhotosUseCase,
});
}
21 changes: 15 additions & 6 deletions lib/09_use_case/main.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import 'package:flutter/material.dart';
import 'package:learn_flutter_together/09_use_case/domain/use_case/get_photos_top3_use_case.dart';
import 'package:learn_flutter_together/09_use_case/domain/use_case/get_photos_top5_use_case.dart';
import 'package:learn_flutter_together/09_use_case/domain/use_case/get_photos_use_case.dart';
import 'package:learn_flutter_together/09_use_case/presentation/search_list/search_list_screen.dart';
import 'package:learn_flutter_together/09_use_case/presentation/search_list/search_list_view_model.dart';
Expand All @@ -24,15 +26,22 @@ class MyApp extends StatelessWidget {
),
home: ChangeNotifierProvider(
// cnp
create: (_) => SearchListViewModel(
getPhotosUseCase: GetPhotosUseCase(
PhotoRepositoryImpl(
photoDataSource: PhotoDataSource(),
create: (_) {
final repository = PhotoRepositoryImpl(
photoDataSource: PhotoDataSource(),
);

return SearchListViewModel(
getPhotosUseCase: GetPhotosUseCase(
getPhotosTop3UseCase: GetPhotosTop3UseCase(repository),
getPhotosTop5UseCase: GetPhotosTop5UseCase(repository),
),
),
),
);
},
child: const SearchListScreen(),
),
);
}
}


Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
import 'package:learn_flutter_together/09_use_case/domain/use_case/get_photos_use_case.dart';
import '../../domain/repository/photo_repository.dart';

import 'search_list_state.dart';

class SearchListViewModel with ChangeNotifier {
Expand Down
84 changes: 84 additions & 0 deletions lib/10_image_search_one_file/image_search_app.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;

import 'model/photo.dart';

void main() {
runApp(const MyApp());
}

class MyApp extends StatelessWidget {
const MyApp({super.key});

// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const ImageSearchApp(),
);
}
}

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

@override
State<ImageSearchApp> createState() => _ImageSearchAppState();
}

class _ImageSearchAppState extends State<ImageSearchApp> {
final _url =
'https://pixabay.com/api/?key=10711147-dc41758b93b263957026bdadb&q=yellow+flowers&image_type=photo';

Future<List<Photo>> getPhotos(String query) async {
final response = await http.get(Uri.parse(_url));
final List jsonList = jsonDecode(response.body)['hits'];
return jsonList.map((e) => Photo.fromJson(e)).toList();
}

final controller = TextEditingController();

@override
void dispose() {
controller.dispose();
super.dispose();
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('이미지 검색'),
),
body: Column(
children: [
TextField(
controller: controller,
),
ElevatedButton(
onPressed: () {
setState(() {});
},
child: const Text('검색'),
),
Expanded(
child: FutureBuilder<List<Photo>>(
future: getPhotos(controller.text),
builder: (context, snapshot) {
return ListView.builder(
itemBuilder: (BuildContext context, int index) {},
);
}),
),
],
),
);
}
}
15 changes: 15 additions & 0 deletions lib/10_image_search_one_file/model/photo.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import 'package:freezed_annotation/freezed_annotation.dart';

part 'photo.freezed.dart';

part 'photo.g.dart';

@freezed
class Photo with _$Photo {
const factory Photo({
required String tags,
@JsonKey(name: 'previewURL') required String imageUrl,
}) = _Photo;

factory Photo.fromJson(Map<String, Object?> json) => _$PhotoFromJson(json);
}
16 changes: 16 additions & 0 deletions pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -400,6 +400,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.0.5"
nested:
dependency: transitive
description:
name: nested
sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20"
url: "https://pub.dev"
source: hosted
version: "1.0.0"
package_config:
dependency: transitive
description:
Expand All @@ -424,6 +432,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.5.1"
provider:
dependency: "direct main"
description:
name: provider
sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c
url: "https://pub.dev"
source: hosted
version: "6.1.2"
pub_semver:
dependency: transitive
description:
Expand Down

0 comments on commit df6f29d

Please sign in to comment.