Skip to content

Commit 14fe95e

Browse files
Merge pull request #7 from leandro-mancini/feat/shared/widgets
Feat/shared/widgets
2 parents 34563ec + 34b206d commit 14fe95e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+1064
-872
lines changed

apps/flutter/suflex/project.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"name": "flutter-suflex",
44
"sourceRoot": "apps/flutter/suflex/src",
55
"projectType": "application",
6+
"implicitDependencies": ["flutter-characters", "flutter-episodes"],
67
"targets": {
78
"analyze": {
89
"executor": "@nrwl/workspace:run-commands",

apps/flutter/suflex/pubspec.lock

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ packages:
8484
source: sdk
8585
version: "0.0.0"
8686
flutter_api:
87-
dependency: "direct main"
87+
dependency: transitive
8888
description:
8989
path: "../../../libs/flutter/api"
9090
relative: true
@@ -132,6 +132,13 @@ packages:
132132
url: "https://pub.dartlang.org"
133133
source: hosted
134134
version: "0.0.2"
135+
flutter_shared:
136+
dependency: "direct main"
137+
description:
138+
path: "../../../libs/flutter/shared"
139+
relative: true
140+
source: path
141+
version: "0.0.1"
135142
flutter_svg:
136143
dependency: transitive
137144
description:
@@ -345,6 +352,13 @@ packages:
345352
url: "https://pub.dartlang.org"
346353
source: hosted
347354
version: "2.1.1"
355+
skeletons:
356+
dependency: "direct main"
357+
description:
358+
name: skeletons
359+
url: "https://pub.dartlang.org"
360+
source: hosted
361+
version: "0.0.3"
348362
sky_engine:
349363
dependency: transitive
350364
description: flutter

apps/flutter/suflex/pubspec.yaml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,13 @@ dependencies:
3434
mobx: ^2.1.1
3535
intl: ^0.17.0
3636
shared_preferences: ^2.0.15
37+
skeletons: ^0.0.3
3738
flutter_characters:
3839
path: ../../../libs/flutter/characters
3940
flutter_episodes:
4041
path: ../../../libs/flutter/episodes
41-
flutter_api:
42-
path: ../../../libs/flutter/api
42+
flutter_shared:
43+
path: ../../../libs/flutter/shared
4344

4445

4546
# The following adds the Cupertino Icons font to your application.

libs/flutter/api/lib/src/shared/shared_pref.dart

Lines changed: 0 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -37,38 +37,3 @@ class SharedPref {
3737
prefs.setString(key, s);
3838
}
3939
}
40-
41-
// import 'dart:convert';
42-
43-
// import 'package:flutter_api/flutter_api.dart';
44-
// import 'package:shared_preferences/shared_preferences.dart';
45-
46-
// class SharedPref {
47-
// read(String key) async {
48-
// SharedPreferences prefs = await SharedPreferences.getInstance();
49-
50-
// Map<String, dynamic> json = prefs.getString(key);
51-
// var user = Character.fromJson(json);
52-
53-
// // Map json = jsonDecode(prefs.getString(key));
54-
55-
// print(user);
56-
57-
// // jsonDecode(prefs.getString(key))
58-
59-
// // json.decode();
60-
61-
// return prefs.getString(key);
62-
// }
63-
64-
// save(String key, value) async {
65-
// SharedPreferences prefs = await SharedPreferences.getInstance();
66-
67-
// prefs.setString(key, json.encode(value));
68-
// }
69-
70-
// remove(String key) async {
71-
// final prefs = await SharedPreferences.getInstance();
72-
// prefs.remove(key);
73-
// }
74-
// }
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"shared_preferences_ios","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences_ios-2.1.1\\\\","native_build":true,"dependencies":[]}],"android":[{"name":"shared_preferences_android","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences_android-2.0.14\\\\","native_build":true,"dependencies":[]}],"macos":[{"name":"shared_preferences_macos","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences_macos-2.0.4\\\\","native_build":true,"dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\path_provider_linux-2.1.7\\\\","native_build":false,"dependencies":[]},{"name":"shared_preferences_linux","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences_linux-2.1.1\\\\","native_build":false,"dependencies":["path_provider_linux"]}],"windows":[{"name":"path_provider_windows","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\path_provider_windows-2.1.3\\\\","native_build":false,"dependencies":[]},{"name":"shared_preferences_windows","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences_windows-2.1.1\\\\","native_build":false,"dependencies":["path_provider_windows"]}],"web":[{"name":"shared_preferences_web","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences_web-2.0.4\\\\","dependencies":[]}]},"dependencyGraph":[{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"shared_preferences","dependencies":["shared_preferences_android","shared_preferences_ios","shared_preferences_linux","shared_preferences_macos","shared_preferences_web","shared_preferences_windows"]},{"name":"shared_preferences_android","dependencies":[]},{"name":"shared_preferences_ios","dependencies":[]},{"name":"shared_preferences_linux","dependencies":["path_provider_linux"]},{"name":"shared_preferences_macos","dependencies":[]},{"name":"shared_preferences_web","dependencies":[]},{"name":"shared_preferences_windows","dependencies":["path_provider_windows"]}],"date_created":"2022-10-22 01:57:39.281944","version":"3.0.5"}
1+
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"shared_preferences_ios","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences_ios-2.1.1\\\\","native_build":true,"dependencies":[]}],"android":[{"name":"shared_preferences_android","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences_android-2.0.14\\\\","native_build":true,"dependencies":[]}],"macos":[{"name":"shared_preferences_macos","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences_macos-2.0.4\\\\","native_build":true,"dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\path_provider_linux-2.1.7\\\\","native_build":false,"dependencies":[]},{"name":"shared_preferences_linux","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences_linux-2.1.1\\\\","native_build":false,"dependencies":["path_provider_linux"]}],"windows":[{"name":"path_provider_windows","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\path_provider_windows-2.1.3\\\\","native_build":false,"dependencies":[]},{"name":"shared_preferences_windows","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences_windows-2.1.1\\\\","native_build":false,"dependencies":["path_provider_windows"]}],"web":[{"name":"shared_preferences_web","path":"C:\\\\src\\\\flutter\\\\.pub-cache\\\\hosted\\\\pub.dartlang.org\\\\shared_preferences_web-2.0.4\\\\","dependencies":[]}]},"dependencyGraph":[{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"shared_preferences","dependencies":["shared_preferences_android","shared_preferences_ios","shared_preferences_linux","shared_preferences_macos","shared_preferences_web","shared_preferences_windows"]},{"name":"shared_preferences_android","dependencies":[]},{"name":"shared_preferences_ios","dependencies":[]},{"name":"shared_preferences_linux","dependencies":["path_provider_linux"]},{"name":"shared_preferences_macos","dependencies":[]},{"name":"shared_preferences_web","dependencies":[]},{"name":"shared_preferences_windows","dependencies":["path_provider_windows"]}],"date_created":"2022-10-22 05:18:52.864957","version":"3.0.5"}

libs/flutter/characters/lib/src/characters_controller.dart

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,47 @@ var characterService = CharacterService();
77
class CharactersController = CharactersControllerBase with _$CharactersController;
88

99
abstract class CharactersControllerBase with Store {
10+
@observable
11+
List<Character> allCharacters = <Character>[];
12+
1013
@observable
1114
List<Character> characters = <Character>[];
1215

1316
@observable
1417
bool hasCharacters = false;
1518

19+
@observable
20+
bool hasFilterCharacters = false;
21+
1622
@action
1723
getAllCharacters() async {
18-
characters = await characterService.getAllCharacters();
24+
allCharacters = await characterService.getAllCharacters();
25+
characters = allCharacters;
1926
hasCharacters = true;
2027
}
2128

2229
@action
2330
getFilteredCharacters(CharacterFilters filters) async {
2431
hasCharacters = false;
2532

26-
characters = await characterService.getFilteredCharacters(filters);
33+
allCharacters = await characterService.getFilteredCharacters(filters);
34+
characters = allCharacters;
2735

2836
hasCharacters = true;
2937
}
38+
39+
@action
40+
getFilteredToCharacter(String value) async {
41+
if (value.isEmpty) {
42+
hasFilterCharacters = false;
43+
characters = allCharacters;
44+
} else {
45+
List<Character> searchCharacter = allCharacters
46+
.where((element) => element.name.toLowerCase().contains(value.toLowerCase()))
47+
.toList();
48+
49+
hasFilterCharacters = true;
50+
characters = searchCharacter;
51+
}
52+
}
3053
}

libs/flutter/characters/lib/src/characters_controller.g.dart

Lines changed: 45 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

libs/flutter/characters/lib/src/characters_page.dart

Lines changed: 56 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import 'package:flutter/material.dart';
22
import 'package:flutter_api/flutter_api.dart';
33
import 'package:flutter_characters/src/characters_controller.dart';
4-
import 'package:flutter_characters/src/widgets/feedback_page_widget.dart';
54
import 'package:flutter_characters/src/widgets/filters_widget.dart';
65
import 'package:flutter_mobx/flutter_mobx.dart';
76
import 'package:flutter_modular/flutter_modular.dart';
7+
import 'package:flutter_shared/flutter_shared.dart';
88

99
class CharactersPage extends StatefulWidget {
1010
const CharactersPage({Key? key}) : super(key: key);
@@ -34,69 +34,36 @@ class _CharactersPageState extends State<CharactersPage> {
3434
Widget build(BuildContext context) {
3535
return Scaffold(
3636
backgroundColor: Colors.white,
37-
appBar: buildAppBar(),
38-
body: SafeArea(
39-
child: buildList(),
40-
),
41-
);
42-
}
43-
44-
AppBar buildAppBar() {
45-
return AppBar(
46-
elevation: 0,
47-
backgroundColor: Colors.white,
48-
title: const Text('Personagens', style: TextStyle(color: Colors.black87, fontSize: 16),),
49-
actions: [
50-
IconButton(
51-
icon: const Icon(
52-
Icons.bookmark_added,
53-
color: Colors.red,
54-
),
55-
onPressed: () => Modular.to.pushNamed('/favorites'),
56-
),
57-
IconButton(
58-
icon: const Icon(
59-
Icons.filter_list_outlined,
60-
color: Colors.red,
61-
),
62-
onPressed: () => changeFilter(),
63-
)
64-
],
65-
bottom: AppBar(
66-
elevation: 0,
67-
automaticallyImplyLeading: false,
68-
backgroundColor: Colors.white,
69-
title: SizedBox(
70-
height: 42,
71-
child: TextField(
72-
controller: searchValueController,
73-
cursorColor: Colors.grey,
74-
decoration: InputDecoration(
75-
contentPadding: const EdgeInsets.all(0),
76-
fillColor: Colors.grey[100],
77-
filled: true,
78-
border: OutlineInputBorder(
79-
borderRadius: BorderRadius.circular(12),
80-
borderSide: BorderSide.none
81-
),
82-
hintText: 'Buscar personagens',
83-
hintStyle: const TextStyle(
84-
color: Colors.grey,
85-
fontSize: 16
86-
),
87-
prefixIcon: Container(
88-
padding: const EdgeInsets.symmetric(horizontal: 16),
89-
width: 18,
90-
child: const Icon(Icons.search),
91-
)
37+
appBar: AppBarWidget(
38+
title: 'Personagens',
39+
searchHintText: 'Buscar personagens',
40+
searchController: searchValueController,
41+
textInputAction: TextInputAction.search,
42+
onSubmitted: (value) {
43+
Modular.to.pushNamed('/character/search/$value')
44+
.then((value) => charactersController.getAllCharacters());
45+
searchValueController.clear();
46+
},
47+
onChanged: ((value) => charactersController.getFilteredToCharacter(value)),
48+
actions: [
49+
IconButton(
50+
icon: const Icon(
51+
Icons.bookmark_added,
52+
color: Colors.red,
9253
),
93-
onSubmitted: (value) {
94-
Modular.to.pushNamed('/character/search/$value');
95-
searchValueController.clear();
96-
},
97-
textInputAction: TextInputAction.search,
54+
onPressed: () => Modular.to.pushNamed('/favorites'),
9855
),
99-
),
56+
IconButton(
57+
icon: const Icon(
58+
Icons.filter_list_outlined,
59+
color: Colors.red,
60+
),
61+
onPressed: () => changeFilter(),
62+
)
63+
],
64+
),
65+
body: SafeArea(
66+
child: buildList(),
10067
),
10168
);
10269
}
@@ -105,26 +72,37 @@ class _CharactersPageState extends State<CharactersPage> {
10572
return Observer(
10673
builder: (_) {
10774
if (charactersController.characters.isEmpty && charactersController.hasCharacters) {
108-
return const FeedbackPageWidget(
109-
illustration: 'assets/illustrations/search.svg',
110-
message: 'Desculpe, não conseguimos \n encontrar o personagem',
75+
return SingleChildScrollView(
76+
child: FeedbackPageWidget(
77+
illustration: Assets.ilSearch,
78+
message: 'Desculpe, não conseguimos \n encontrar o personagem',
79+
description: 'Não se preocupe, ainda podemos \nbuscar no banco de dados.',
80+
enabledAction: true,
81+
textButton: 'Buscar',
82+
onPressed: () {
83+
Modular.to.pushNamed('/character/search/${searchValueController.text}')
84+
.then((value) => charactersController.getAllCharacters());
85+
searchValueController.clear();
86+
},
87+
),
11188
);
11289
}
11390

114-
return charactersController.hasCharacters ? ListView.builder(
115-
itemCount: charactersController.characters.length,
116-
itemBuilder: (context, index) {
117-
return ListTile(
118-
leading: CircleAvatar(
91+
return SkeletonListWidget(
92+
itemCount: 10,
93+
isLoading: !charactersController.hasCharacters,
94+
child: ListView.builder(
95+
itemCount: charactersController.characters.length,
96+
itemBuilder: (context, index) {
97+
return ListTileWidget(
98+
title: charactersController.characters[index].name,
99+
subtitle: charactersController.characters[index].species,
119100
backgroundImage: NetworkImage(charactersController.characters[index].image),
120-
backgroundColor: Colors.grey[300]
121-
),
122-
title: Text(charactersController.characters[index].name),
123-
subtitle: Text(charactersController.characters[index].species),
124-
onTap: () => Modular.to.pushNamed('/character/${charactersController.characters[index].id}'),
125-
);
126-
},
127-
) : const Center(child: CircularProgressIndicator(),);
101+
onTap: () => Modular.to.pushNamed('/character/${charactersController.characters[index].id}'),
102+
);
103+
},
104+
),
105+
);
128106
},
129107
);
130108
}

0 commit comments

Comments
 (0)