Skip to content

Commit b777431

Browse files
committed
Refactor search API. Make up a SearchResults class to collect both search result and promotion. TO prepare for #6
1 parent d49f5c1 commit b777431

File tree

3 files changed

+36
-21
lines changed

3 files changed

+36
-21
lines changed

lib/search_data_source.dart

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,26 @@ class SearchResult {
4949
: result.image.contextLink.hashCode;
5050
}
5151

52+
class Promotion {
53+
final customsearch.Promotion promotion;
54+
55+
Promotion(this.promotion);
56+
}
57+
58+
/// A wrapper class to aggregate all the search result fields that we need.
59+
class SearchResults {
60+
List<SearchResult> searchResults;
61+
List<Promotion> promotions;
62+
63+
SearchResults({this.searchResults, this.promotions}) {
64+
this.searchResults ??= List<SearchResult>();
65+
this.promotions ??= List<Promotion>();
66+
}
67+
}
68+
5269
/// Abstract class for Search Data Source.
5370
abstract class SearchDataSource {
54-
Future<List<SearchResult>> search(String query, {String searchType});
71+
Future<SearchResults> search(String query, {String searchType});
5572
}
5673

5774
class _StaticSearchResponse {
@@ -63,9 +80,7 @@ class _StaticSearchResponse {
6380
{this.assetPath, this.searchType, this.searchResponseJsonString});
6481
}
6582

66-
6783
class FakeSearchDataSource implements SearchDataSource {
68-
6984
final Map<String, _StaticSearchResponse> searchResponses = {
7085
'web': _StaticSearchResponse(
7186
assetPath: 'res/sampledata/nytimes_sample_data.json'),
@@ -76,7 +91,6 @@ class FakeSearchDataSource implements SearchDataSource {
7691
assetPath: 'res/sampledata/nytimes_with_promotion.json'),
7792
};
7893

79-
8094
FakeSearchDataSource() {
8195
searchResponses.keys.forEach((key) {
8296
loadAssetToSearchResponse(key, searchResponses[key].assetPath);
@@ -89,19 +103,20 @@ class FakeSearchDataSource implements SearchDataSource {
89103
}
90104

91105
@override
92-
Future<List<SearchResult>> search(String query, {String searchType}) async {
93-
var results = List<SearchResult>();
106+
Future<SearchResults> search(String query, {String searchType}) async {
94107
if (!searchResponses.containsKey(query)) {
95-
return results;
108+
return SearchResults();
96109
}
97110
if (searchResponses[query].searchType != searchType) {
98-
return results;
111+
return SearchResults();
99112
}
113+
var results = List<SearchResult>();
100114
Map searchMap = jsonDecode(searchResponses[query].searchResponseJsonString);
101115
customsearch.Search search = customsearch.Search.fromJson(searchMap);
102116
search.items.forEach(
103117
(item) => results.add(SearchResult.escapeLineBreakInSnippet(item)));
104-
return Set<SearchResult>.from(results).toList();
118+
return SearchResults(
119+
searchResults: Set<SearchResult>.from(results).toList());
105120
}
106121
}
107122

@@ -117,14 +132,15 @@ class CustomSearchDataSource implements SearchDataSource {
117132
}
118133

119134
@override
120-
Future<List<SearchResult>> search(String query, {String searchType}) async {
135+
Future<SearchResults> search(String query, {String searchType}) async {
121136
var results = List<SearchResult>();
122137
customsearch.Search search =
123138
await this.api.cse.list(query, cx: this.cx, searchType: searchType);
124139
if (search.items != null) {
125140
search.items.forEach((item) => results.add(SearchResult(item)));
126141
}
127-
return Set<SearchResult>.from(results).toList();
142+
return SearchResults(
143+
searchResults: Set<SearchResult>.from(results).toList());
128144
}
129145
}
130146

lib/search_result_page.dart

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -253,12 +253,11 @@ class CustomSearchSearchDelegate extends SearchDelegate<SearchResult> {
253253

254254
@override
255255
Widget buildResults(BuildContext context) {
256-
return FutureBuilder<List<SearchResult>>(
256+
return FutureBuilder<SearchResults>(
257257
future: dataSource.search(query,
258258
searchType: this.searchType == SearchType.web ? null : 'image'),
259259
// a previously-obtained Future<List<SearchResult>> or null
260-
builder:
261-
(BuildContext context, AsyncSnapshot<List<SearchResult>> snapshot) {
260+
builder: (BuildContext context, AsyncSnapshot<SearchResults> snapshot) {
262261
switch (snapshot.connectionState) {
263262
case ConnectionState.none:
264263
return Text('Press button to start.');
@@ -274,18 +273,18 @@ class CustomSearchSearchDelegate extends SearchDelegate<SearchResult> {
274273
mainAxisSpacing: 4.0,
275274
crossAxisSpacing: 4.0,
276275
padding: const EdgeInsets.all(4.0),
277-
children: List.generate(snapshot.data.length, (index) {
276+
children: List.generate(snapshot.data.searchResults.length,
277+
(index) {
278278
return new ImageSearchResultCard(
279-
searchResult: snapshot.data[index],
279+
searchResult: snapshot.data.searchResults[index],
280280
searchDelegate: this);
281281
}));
282282
case SearchType.web:
283-
print(snapshot.data.length);
284283
return ListView.builder(
285-
itemCount: snapshot.data.length,
284+
itemCount: snapshot.data.searchResults.length,
286285
itemBuilder: (BuildContext context, int index) {
287286
return new WebSearchResultCard(
288-
searchResult: snapshot.data[index],
287+
searchResult: snapshot.data.searchResults[index],
289288
searchDelegate: this);
290289
});
291290
default:

test/search_data_source_test.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ void main() {
88
.readAsString()
99
.then((String contents) {
1010
var dataSource = FakeSearchDataSource();
11-
dataSource.search('whatever').then((searchResult) {
12-
searchResult.forEach((result) => print(result));
11+
dataSource.search('whatever').then((searchResults) {
12+
searchResults.searchResults.forEach((result) => print(result));
1313
});
1414
});
1515
});

0 commit comments

Comments
 (0)