Skip to content

Commit 89b7602

Browse files
committed
fix: search error and cache videos
1 parent e9357bb commit 89b7602

File tree

6 files changed

+72
-40
lines changed

6 files changed

+72
-40
lines changed

client/lib/screens/main_screen.dart

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,19 +46,15 @@ class _MainScreenState extends State<MainScreen> {
4646
body: IndexedStack(
4747
index: _selectedBottomNavIndex,
4848
children: [
49-
MainScreenListView(
50-
cleanList: cleanList,
51-
videoSearchDelegate: videoSearchDelegate),
52-
MainScreenFavoriteView(
53-
cleanList: cleanList,
54-
videoSearchDelegate: videoSearchDelegate)
49+
MainScreenListView(cleanList: cleanList),
50+
MainScreenFavoriteView(cleanList: cleanList)
5551
],
5652
),
5753
bottomNavigationBar: CustomBottomNavigationBar(
5854
selectedBottomNavIndex: _selectedBottomNavIndex,
5955
onTap: (index) => setState(() {
6056
_selectedBottomNavIndex = index;
61-
videoSearchDelegate.ignoreBookmarkIcon = index == 1;
57+
videoSearchDelegate.showOnlyBookmarkItems = index == 1;
6258
})));
6359
});
6460
}

client/lib/service.dart

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ class GrpcClient {
1111
final Pr12erServiceClient _client =
1212
Pr12erServiceClient(getKkweonOktetoChannel());
1313

14+
List<Video>? _videoCache;
15+
1416
Future<String> sendMessage(String message) async {
1517
final request = HelloRequest()..body = message;
1618
final response = await _client.getHello(request);
@@ -19,10 +21,14 @@ class GrpcClient {
1921
}
2022

2123
Future<List<Video>> getVideos() async {
24+
if (_videoCache != null) return _videoCache!;
25+
2226
final request = GetVideosRequest();
2327
final response = await _client.getVideos(request);
2428

25-
return response.videos;
29+
_videoCache = response.videos;
30+
31+
return _videoCache!;
2632
}
2733

2834
Future<Detail> getDetail(int videoId) async {

client/lib/widgets/main/main_screen_favorite_view.dart

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,9 @@ class MainScreenFavoriteView extends StatelessWidget {
1010
const MainScreenFavoriteView({
1111
Key? key,
1212
required this.cleanList,
13-
required this.videoSearchDelegate,
1413
}) : super(key: key);
1514

1615
final List<Video> cleanList;
17-
final VideoSearchDelegate videoSearchDelegate;
1816

1917
@override
2018
Widget build(BuildContext context) {
@@ -24,13 +22,11 @@ class MainScreenFavoriteView extends StatelessWidget {
2422
if (!snapshot.hasData) {
2523
return const Center(child: CircularProgressIndicator());
2624
}
27-
28-
final Set<int> favoriteVideoMap = snapshot.data!;
25+
final favoriteMap = snapshot.requireData;
2926
return PRVideos(
3027
cleanList: cleanList
31-
.where((element) => favoriteVideoMap.contains(element.prId))
32-
.toList(growable: false),
33-
videoSearchDelegate: videoSearchDelegate,
28+
.where((element) => favoriteMap.contains(element.prId))
29+
.toList(),
3430
hideBookmarkIcon: true,
3531
);
3632
},

client/lib/widgets/main/main_screen_list_view.dart

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,14 @@ class MainScreenListView extends StatelessWidget {
77
const MainScreenListView({
88
Key? key,
99
required this.cleanList,
10-
required this.videoSearchDelegate,
1110
}) : super(key: key);
1211

1312
final List<Video> cleanList;
14-
final VideoSearchDelegate videoSearchDelegate;
1513

1614
@override
1715
Widget build(BuildContext context) {
1816
return PRVideos(
1917
cleanList: cleanList,
20-
videoSearchDelegate: videoSearchDelegate,
2118
hideBookmarkIcon: false,
2219
);
2320
}

client/lib/widgets/main/pr12video.dart

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,17 @@ import 'package:provider/provider.dart';
33
import 'package:pr12er/protos/pkg/pr12er/messages.pb.dart';
44
import 'package:pr12er/screens/detail_screen.dart';
55
import 'package:pr12er/view_models/view_model_videos.dart';
6-
import 'package:pr12er/widgets/main/video_search_delegate.dart';
76

87
class PRVideos extends StatelessWidget {
9-
final VideoSearchDelegate videoSearchDelegate;
108
final List<Video> cleanList;
119
final bool hideBookmarkIcon;
1210

1311
const PRVideos(
14-
{Key? key,
15-
required this.cleanList,
16-
required this.videoSearchDelegate,
17-
required this.hideBookmarkIcon})
12+
{Key? key, required this.cleanList, required this.hideBookmarkIcon})
1813
: super(key: key);
1914

2015
@override
2116
Widget build(BuildContext context) {
22-
videoSearchDelegate.dataRef = cleanList;
23-
2417
return ListView.builder(
2518
padding: const EdgeInsets.all(8),
2619
itemCount: cleanList.length,

client/lib/widgets/main/video_search_delegate.dart

Lines changed: 58 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
import 'package:flutter/material.dart';
22
import 'package:pr12er/protos/pkg/pr12er/messages.pb.dart';
3+
import 'package:pr12er/service.dart';
4+
import 'package:pr12er/view_models/view_model_videos.dart';
35
import 'package:pr12er/widgets/main/pr12video.dart';
6+
import 'package:provider/provider.dart';
47

58
class VideoSearchDelegate extends SearchDelegate {
6-
late List<Video> dataRef;
7-
late bool ignoreBookmarkIcon;
9+
List<Video> dataRef = [];
10+
bool showOnlyBookmarkItems = false;
811

912
@override
1013
ThemeData appBarTheme(BuildContext context) {
@@ -33,30 +36,71 @@ class VideoSearchDelegate extends SearchDelegate {
3336
);
3437
}
3538

36-
Widget getSearchResult() {
37-
final videos = dataRef.where((video) {
39+
Widget getSearchResult(BuildContext context) {
40+
return FutureBuilder<List<Video>>(
41+
future: context.read<GrpcClient>().getVideos(),
42+
builder: (context, snapshot) {
43+
if (!snapshot.hasData) {
44+
return const Center(child: CircularProgressIndicator());
45+
}
46+
47+
dataRef = snapshot.requireData;
48+
49+
if (showOnlyBookmarkItems) {
50+
return FutureBuilder<Set<int>>(
51+
future: context.read<FavoriteVideoViewModel>().favoriteVideosMap,
52+
builder: (context, snapshot) {
53+
if (!snapshot.hasData) {
54+
return const Center(child: CircularProgressIndicator());
55+
}
56+
final map = snapshot.requireData;
57+
dataRef = dataRef
58+
.where((element) => map.contains(element.prId))
59+
.toList(growable: false);
60+
61+
final List<Video> videos = getInterestedVideos();
62+
63+
return ListView.builder(
64+
padding: const EdgeInsets.all(8),
65+
itemCount: videos.length,
66+
itemBuilder: (BuildContext context, int index) => PR12Video(
67+
prID: index,
68+
video: videos[index],
69+
hideBookmarkIcon: showOnlyBookmarkItems));
70+
},
71+
);
72+
}
73+
74+
final List<Video> videos = getInterestedVideos();
75+
76+
return ListView.builder(
77+
padding: const EdgeInsets.all(8),
78+
itemCount: videos.length,
79+
itemBuilder: (BuildContext context, int index) => PR12Video(
80+
prID: index,
81+
video: videos[index],
82+
hideBookmarkIcon: showOnlyBookmarkItems));
83+
},
84+
);
85+
}
86+
87+
List<Video> getInterestedVideos() {
88+
var videos = dataRef.where((video) {
3889
final searchLower = query.toLowerCase();
3990
final titleLower = video.title.toLowerCase();
4091

4192
return titleLower.contains(searchLower);
4293
}).toList();
43-
44-
return ListView.builder(
45-
padding: const EdgeInsets.all(8),
46-
itemCount: videos.length,
47-
itemBuilder: (BuildContext context, int index) => PR12Video(
48-
prID: index,
49-
video: videos[index],
50-
hideBookmarkIcon: ignoreBookmarkIcon));
94+
return videos;
5195
}
5296

5397
@override
5498
Widget buildResults(BuildContext context) {
55-
return getSearchResult();
99+
return getSearchResult(context);
56100
}
57101

58102
@override
59103
Widget buildSuggestions(BuildContext context) {
60-
return getSearchResult();
104+
return getSearchResult(context);
61105
}
62106
}

0 commit comments

Comments
 (0)