From 18dbe120e67664c94762cb994f3df50bb276e7ae Mon Sep 17 00:00:00 2001 From: Adby Santos Date: Sun, 6 Aug 2023 23:09:41 -0300 Subject: [PATCH] feat: improving performance --- .vscode/launch.json | 25 +++++++++++++++++++ android/build.gradle | 2 +- .../fetch_blog_posts_parameters.dart | 2 +- .../domain/entities/blog_post_entity.dart | 10 ++++++-- .../mapper/get_all_posts_from_api_mapper.dart | 11 +++++--- .../pages/home/bloc/blog_posts_bloc.dart | 6 ++--- .../home/bloc/states/blog_posts_states.dart | 21 ++++++---------- .../home/presenter/pages/home/home_page.dart | 1 + pubspec.lock | 20 +++++++-------- .../home/bloc/anime_posts_bloc_test.dart | 6 ++--- 10 files changed, 67 insertions(+), 37 deletions(-) create mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..6c72aed --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,25 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "desafio_bloc_1", + "request": "launch", + "type": "dart" + }, + { + "name": "desafio_bloc_1 (profile mode)", + "request": "launch", + "type": "dart", + "flutterMode": "profile" + }, + { + "name": "desafio_bloc_1 (release mode)", + "request": "launch", + "type": "dart", + "flutterMode": "release" + } + ] +} \ No newline at end of file diff --git a/android/build.gradle b/android/build.gradle index 62bb5d6..5d753ae 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -24,6 +24,6 @@ subprojects { project.evaluationDependsOn(':app') } -task clean(type: Delete) { +tasks.register("clean", Delete) { delete rootProject.buildDir } diff --git a/lib/app/core/constants/fetch_blog_posts_parameters.dart b/lib/app/core/constants/fetch_blog_posts_parameters.dart index 8ffb41a..83da0e9 100644 --- a/lib/app/core/constants/fetch_blog_posts_parameters.dart +++ b/lib/app/core/constants/fetch_blog_posts_parameters.dart @@ -1,4 +1,4 @@ class FetchBlogPostsParameters { static const initialPage = 0; - static var postsPerPage = 10; + static const postsPerPage = 10; } diff --git a/lib/app/modules/home/domain/entities/blog_post_entity.dart b/lib/app/modules/home/domain/entities/blog_post_entity.dart index 63d31f6..de6c9c0 100644 --- a/lib/app/modules/home/domain/entities/blog_post_entity.dart +++ b/lib/app/modules/home/domain/entities/blog_post_entity.dart @@ -1,8 +1,14 @@ -class BlogPostEntity { +import 'package:equatable/equatable.dart'; + +class BlogPostEntity extends Equatable { final String? title; final String? publicationDate; final String? description; final String? link; + final String? id; + + const BlogPostEntity({this.title, this.publicationDate, this.description, this.link, this.id}); - const BlogPostEntity({this.title, this.publicationDate, this.description, this.link}); + @override + List get props => [id]; } diff --git a/lib/app/modules/home/external/datasources/api/mapper/get_all_posts_from_api_mapper.dart b/lib/app/modules/home/external/datasources/api/mapper/get_all_posts_from_api_mapper.dart index 3ba790c..2d92924 100644 --- a/lib/app/modules/home/external/datasources/api/mapper/get_all_posts_from_api_mapper.dart +++ b/lib/app/modules/home/external/datasources/api/mapper/get_all_posts_from_api_mapper.dart @@ -7,23 +7,26 @@ class GetAllPostsFromApiMapper { } BlogPostEntity fromJson(Map json) { - checkKey(json, 'title', 'Campo title é não existe/é nulo. Response: $json'); - checkKey(json['title'], 'rendered', 'Campo title.rendered é não existe/é nulo. Response: $json'); - checkKey(json, 'date', 'Campo date é não existe/é nulo. Response: $json'); - checkKey(json, 'excerpt', 'Campo excerpt é não existe/é nulo. Response: $json'); + checkKey(json, 'title', 'Campo title não existe/é nulo. Response: $json'); + checkKey(json['title'], 'rendered', 'Campo title.rendered não existe/é nulo. Response: $json'); + checkKey(json, 'date', 'Campo date não existe/é nulo. Response: $json'); + checkKey(json, 'excerpt', 'Campo excerpt não existe/é nulo. Response: $json'); checkKey(json['excerpt'], 'rendered', 'Campo excerpt.rendered não existe/é nulo. Response: $json'); checkKey(json, 'link', 'Campo excerpt.rendered não existe/é nulo. Response: $json'); + checkKey(json, 'id', 'Campo id não existe/é nulo. Response: $json'); final title = json['title']?['rendered']; final publicationDate = json['date']; final description = json['excerpt']!['rendered']; final link = json['link']; + final id = json['id']; return BlogPostEntity( title: title, publicationDate: publicationDate, description: description, link: link, + id: id.toString(), ); } diff --git a/lib/app/modules/home/presenter/pages/home/bloc/blog_posts_bloc.dart b/lib/app/modules/home/presenter/pages/home/bloc/blog_posts_bloc.dart index 1374e41..aea69de 100644 --- a/lib/app/modules/home/presenter/pages/home/bloc/blog_posts_bloc.dart +++ b/lib/app/modules/home/presenter/pages/home/bloc/blog_posts_bloc.dart @@ -14,9 +14,9 @@ part 'states/blog_posts_states.dart'; class BlogPostsBloc extends Bloc { final GetAllPostsUseCase getAllPostsUseCase; - BlogPostsBloc(this.getAllPostsUseCase) : super(BlogPostsInitialState(const [])) { + BlogPostsBloc(this.getAllPostsUseCase) : super(const BlogPostsInitialState([])) { on((event, emit) async { - if(state is BlogPostsInitialState){ + if (state is BlogPostsInitialState) { await initializeDateFormatting('pt_BR'); } final currentPage = state.page; @@ -28,7 +28,7 @@ class BlogPostsBloc extends Bloc { }, (fetchedListOfPosts) { final listOfPostsToShow = [ ...state.blogPosts, - ...fetchedListOfPosts + ...fetchedListOfPosts, ]; return BlogPostsSuccessState(listOfPostsToShow, pageToBeFetched); })); diff --git a/lib/app/modules/home/presenter/pages/home/bloc/states/blog_posts_states.dart b/lib/app/modules/home/presenter/pages/home/bloc/states/blog_posts_states.dart index a4a05da..0cb78be 100644 --- a/lib/app/modules/home/presenter/pages/home/bloc/states/blog_posts_states.dart +++ b/lib/app/modules/home/presenter/pages/home/bloc/states/blog_posts_states.dart @@ -9,33 +9,28 @@ abstract class BlogPostsState extends Equatable { const BlogPostsState(this.blogPosts, this.page, this.postsPerPage); @override - List get props => [ - page, - postsPerPage, - blogPosts - ]; + List get props => [page, postsPerPage, blogPosts]; } class BlogPostsInitialState extends BlogPostsState { - BlogPostsInitialState(List blogPosts, {int? initialPage}) : super(blogPosts, initialPage ?? FetchBlogPostsParameters.initialPage, FetchBlogPostsParameters.postsPerPage); + const BlogPostsInitialState(List blogPosts, {int? initialPage}) + : super(blogPosts, initialPage ?? FetchBlogPostsParameters.initialPage, FetchBlogPostsParameters.postsPerPage); } class BlogPostsLoadingState extends BlogPostsState { - BlogPostsLoadingState(List blogPosts, int page) : super(blogPosts, page, FetchBlogPostsParameters.postsPerPage); + const BlogPostsLoadingState(List blogPosts, int page) : super(blogPosts, page, FetchBlogPostsParameters.postsPerPage); } class BlogPostsSuccessState extends BlogPostsState { - BlogPostsSuccessState(List blogPosts, int page) : super(blogPosts, page, FetchBlogPostsParameters.postsPerPage); + const BlogPostsSuccessState(List blogPosts, int page) : super(blogPosts, page, FetchBlogPostsParameters.postsPerPage); } class BlogPostsErrorState extends BlogPostsState { final String message; - BlogPostsErrorState(this.message, List blogPosts, int page) : super(blogPosts, page, FetchBlogPostsParameters.postsPerPage); + const BlogPostsErrorState(this.message, List blogPosts, int page) + : super(blogPosts, page, FetchBlogPostsParameters.postsPerPage); @override - List get props => super.props - ..addAll([ - message - ]); + List get props => super.props..addAll([message]); } diff --git a/lib/app/modules/home/presenter/pages/home/home_page.dart b/lib/app/modules/home/presenter/pages/home/home_page.dart index 0651a44..536b830 100644 --- a/lib/app/modules/home/presenter/pages/home/home_page.dart +++ b/lib/app/modules/home/presenter/pages/home/home_page.dart @@ -117,6 +117,7 @@ class _HomePageState extends State { return blogPostsState is BlogPostsLoadingState ? const HomeLoadingWidget() : const SizedBox(); } return BlogPostCardWidget( + key: Key(blogPostsList[index].id!), blogPost: blogPostsList[index], onTap: () => onTapBlogPostCard(blogPostsList[index].link), ); diff --git a/pubspec.lock b/pubspec.lock index a41eb24..7b20e32 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -45,10 +45,10 @@ packages: dependency: "direct dev" description: name: bloc_test - sha256: "43d5b2f3d09ba768d6b611151bdf20ca141ffb46e795eb9550a58c9c2f4eae3f" + sha256: af0de1a1e16a7536e95dcd7491e0a6d6078e11d2d691988e862280b74f5c7968 url: "https://pub.dev" source: hosted - version: "9.1.3" + version: "9.1.4" boolean_selector: dependency: transitive description: @@ -221,10 +221,10 @@ packages: dependency: "direct main" description: name: dio - sha256: a9d76e72985d7087eb7c5e7903224ae52b337131518d127c554b9405936752b8 + sha256: ce75a1b40947fea0a0e16ce73337122a86762e38b982e1ccb909daa3b9bc4197 url: "https://pub.dev" source: hosted - version: "5.2.1+1" + version: "5.3.2" equatable: dependency: "direct main" description: @@ -508,10 +508,10 @@ packages: dependency: transitive description: name: plugin_platform_interface - sha256: "6a2128648c854906c53fa8e33986fc0247a1116122f9534dd20e3ab9e16a32bc" + sha256: "43798d895c929056255600343db8f049921cbec94d31ec87f1dc5c16c01935dd" url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.1.5" pool: dependency: transitive description: @@ -729,10 +729,10 @@ packages: dependency: transitive description: name: url_launcher_android - sha256: "15f5acbf0dce90146a0f5a2c4a002b1814a6303c4c5c075aa2623b2d16156f03" + sha256: "78cb6dea3e93148615109e58e42c35d1ffbf5ef66c44add673d0ab75f12ff3af" url: "https://pub.dev" source: hosted - version: "6.0.36" + version: "6.0.37" url_launcher_ios: dependency: transitive description: @@ -793,10 +793,10 @@ packages: dependency: transitive description: name: vm_service - sha256: b8c67f5fa3897b122cf60fe9ff314f7b0ef71eab25c5f8b771480bc338f48823 + sha256: "0fae432c85c4ea880b33b497d32824b97795b04cdaa74d270219572a1f50268d" url: "https://pub.dev" source: hosted - version: "11.7.2" + version: "11.9.0" watcher: dependency: transitive description: diff --git a/test/app/modules/home/presenter/pages/home/bloc/anime_posts_bloc_test.dart b/test/app/modules/home/presenter/pages/home/bloc/anime_posts_bloc_test.dart index d562158..f61907a 100644 --- a/test/app/modules/home/presenter/pages/home/bloc/anime_posts_bloc_test.dart +++ b/test/app/modules/home/presenter/pages/home/bloc/anime_posts_bloc_test.dart @@ -27,7 +27,7 @@ void main() { build: () => BlogPostsBloc(useCaseMock), act: (bloc) => bloc.add(const GetBlogPostsEvent()), expect: () => [ - BlogPostsLoadingState(const [], 0), + const BlogPostsLoadingState([], 0), BlogPostsSuccessState(resultFromUsecase, 1) ], verify: (bloc) { @@ -45,8 +45,8 @@ void main() { build: () => BlogPostsBloc(useCaseMock), act: (bloc) => bloc.add(const GetBlogPostsEvent()), expect: () => [ - BlogPostsLoadingState(const [], 0), - BlogPostsErrorState('Erro', const [], 0) + const BlogPostsLoadingState([], 0), + const BlogPostsErrorState('Erro', [], 0) ], verify: (bloc) { final blogPosts = bloc.state.blogPosts;