Skip to content

Commit 91d2e80

Browse files
committed
feat: 自动排序搜索的结果
1 parent 1f554e4 commit 91d2e80

File tree

4 files changed

+103
-64
lines changed

4 files changed

+103
-64
lines changed

lib/pages/search/controller.dart

Lines changed: 55 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,74 @@ import 'package:miru_app/utils/extension.dart';
44
import 'package:miru_app/utils/extension_runtime.dart';
55

66
class SearchPageController extends GetxController {
7-
final RxList<ExtensionRuntime> runtimeList = <ExtensionRuntime>[].obs;
8-
9-
final RxString search = ''.obs;
10-
117
Rx<ExtensionType?> cuurentExtensionType = Rx(null);
8+
final search = ''.obs;
9+
final searchResultList = <SearchResult>[].obs;
10+
String _randomKey = "";
1211

1312
@override
1413
void onInit() {
1514
getRuntime();
15+
ever(search, (callback) => getRuntime());
1616
super.onInit();
1717
}
1818

1919
getRuntime({ExtensionType? type}) {
20+
_randomKey = DateTime.now().millisecondsSinceEpoch.toString();
2021
cuurentExtensionType.value = type;
2122
final exts = ExtensionUtils.extensions.values.toList();
2223
if (type != null) {
2324
exts.removeWhere((element) => element.extension.type != type);
2425
}
25-
runtimeList.clear();
26-
runtimeList.addAll(exts);
26+
searchResultList.clear();
27+
for (var element in exts) {
28+
searchResultList.add(SearchResult(runitme: element));
29+
}
30+
getResult(_randomKey);
31+
}
32+
33+
Future<void> getResult(String key) async {
34+
final futures = <Future>[];
35+
36+
for (var i = 0; i < searchResultList.length; i++) {
37+
final element = searchResultList[i];
38+
Future<List<ExtensionListItem>> resultFuture;
39+
40+
if (search.value == "") {
41+
resultFuture = element.runitme.latest(1);
42+
} else {
43+
resultFuture = element.runitme.search(search.value, 1);
44+
}
45+
46+
futures.add(resultFuture.then((result) {
47+
if (_randomKey != key) {
48+
return;
49+
}
50+
element.result = result;
51+
if (result.isNotEmpty) {
52+
searchResultList.removeAt(i);
53+
searchResultList.insert(0, element);
54+
}
55+
}).catchError((e) {
56+
element.error = e.toString();
57+
}));
58+
}
59+
60+
await Future.wait(futures);
2761
}
62+
63+
getPackgeByIndex(int index) {
64+
return searchResultList[index].runitme.extension.package;
65+
}
66+
}
67+
68+
class SearchResult {
69+
final ExtensionRuntime runitme;
70+
List<ExtensionListItem>? result;
71+
String? error;
72+
SearchResult({
73+
required this.runitme,
74+
this.error,
75+
this.result,
76+
});
2877
}

lib/pages/search/view.dart

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -124,17 +124,17 @@ class _SearchPageState extends State<SearchPage> {
124124
},
125125
body: Obx(
126126
() {
127-
final list = c.runtimeList;
127+
// ignore: invalid_use_of_protected_member
128+
final list = c.searchResultList.value;
128129
return SearchAllExtSearch(
129130
key: ValueKey(
130131
c.search.value + c.cuurentExtensionType.value.toString(),
131132
),
132133
kw: c.search.value,
133134
runtimeList: list,
134135
onClickMore: (index) {
135-
final package = list[index].extension.package;
136136
Get.to(SearchExtensionPage(
137-
package: package,
137+
package: c.getPackgeByIndex(index),
138138
keyWord: c.search.value,
139139
));
140140
},
@@ -251,14 +251,13 @@ class _SearchPageState extends State<SearchPage> {
251251
c.search.value + c.cuurentExtensionType.value.toString(),
252252
),
253253
kw: c.search.value,
254-
runtimeList: c.runtimeList,
254+
// ignore: invalid_use_of_protected_member
255+
runtimeList: c.searchResultList.value,
255256
onClickMore: (index) {
256-
final package = c.runtimeList[index].extension.package;
257-
258257
router.push(Uri(
259258
path: "/search_extension",
260259
queryParameters: {
261-
"package": package,
260+
"package": c.getPackgeByIndex(index),
262261
"keyWord": c.search.value,
263262
},
264263
).toString());

lib/pages/search/widgets/search_all_extension.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ import 'dart:io';
33
import 'package:flutter/material.dart';
44
import 'package:get/get.dart';
55
import 'package:miru_app/pages/main/controller.dart';
6+
import 'package:miru_app/pages/search/controller.dart';
67
import 'package:miru_app/pages/search/widgets/search_all_tile.dart';
78
import 'package:miru_app/router/router.dart';
8-
import 'package:miru_app/utils/extension_runtime.dart';
99
import 'package:miru_app/utils/i18n.dart';
1010
import 'package:miru_app/widgets/button.dart';
1111

@@ -17,7 +17,7 @@ class SearchAllExtSearch extends StatefulWidget {
1717
required this.onClickMore,
1818
}) : super(key: key);
1919
final String kw;
20-
final List<ExtensionRuntime> runtimeList;
20+
final List<SearchResult> runtimeList;
2121
final Function(int) onClickMore;
2222

2323
@override
@@ -55,7 +55,7 @@ class _SearchAllExtSearchState extends State<SearchAllExtSearch> {
5555
itemBuilder: (context, index) {
5656
return SearchAllTile(
5757
kw: widget.kw,
58-
runtime: widget.runtimeList[index],
58+
searchResult: widget.runtimeList[index],
5959
onClickMore: () {
6060
widget.onClickMore(index);
6161
},

lib/pages/search/widgets/search_all_tile.dart

Lines changed: 39 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import 'dart:io';
22

33
import 'package:flutter/material.dart';
4-
import 'package:miru_app/utils/extension_runtime.dart';
4+
import 'package:miru_app/pages/search/controller.dart';
55
import 'package:miru_app/utils/i18n.dart';
66
import 'package:miru_app/widgets/extension_item_card.dart';
77
import 'package:miru_app/widgets/horizontal_list.dart';
@@ -10,13 +10,13 @@ import 'package:miru_app/widgets/progress_ring.dart';
1010
class SearchAllTile extends StatefulWidget {
1111
const SearchAllTile({
1212
Key? key,
13-
required this.runtime,
13+
required this.searchResult,
1414
required this.onClickMore,
1515
required this.kw,
1616
}) : super(key: key);
1717

1818
final String kw;
19-
final ExtensionRuntime runtime;
19+
final SearchResult searchResult;
2020
final Function() onClickMore;
2121

2222
@override
@@ -27,55 +27,46 @@ class _SearchAllTileState extends State<SearchAllTile> {
2727
@override
2828
Widget build(BuildContext context) {
2929
return Center(
30-
child: FutureBuilder(
31-
key: ValueKey(widget.kw),
32-
future: widget.kw.isNotEmpty
33-
? widget.runtime.search(widget.kw, 1)
34-
: widget.runtime.latest(1),
35-
builder: ((context, snapshot) {
36-
return HorizontalList(
37-
onClickMore: widget.onClickMore,
38-
title: widget.runtime.extension.name,
39-
contentBuilder: (controller) {
40-
if (snapshot.hasError) {
41-
return Text(snapshot.error.toString());
42-
}
30+
child: HorizontalList(
31+
onClickMore: widget.onClickMore,
32+
title: widget.searchResult.runitme.extension.name,
33+
contentBuilder: (controller) {
34+
if (widget.searchResult.error != null) {
35+
return Text(widget.searchResult.error!.split('\n').first);
36+
}
37+
if (widget.searchResult.result == null) {
38+
return const ProgressRing();
39+
}
4340

44-
if (!snapshot.hasData) {
45-
return const ProgressRing();
46-
}
41+
final data = widget.searchResult.result;
4742

48-
final data = snapshot.data;
43+
if (data != null && data.isEmpty) {
44+
return Text('common.no-result'.i18n);
45+
}
4946

50-
if (snapshot.data != null && snapshot.data!.isEmpty) {
51-
return Text('common.no-result'.i18n);
52-
}
53-
54-
return SizedBox(
55-
height: Platform.isAndroid ? 170 : 280,
56-
child: ListView.builder(
57-
scrollDirection: Axis.horizontal,
58-
controller: controller,
59-
itemCount: data!.length,
60-
itemBuilder: ((context, index) {
61-
return Container(
62-
width: Platform.isAndroid ? 110 : 170,
63-
margin: const EdgeInsets.only(right: 16),
64-
child: ExtensionItemCard(
65-
key: ValueKey(data[index].url),
66-
title: data[index].title,
67-
url: data[index].url,
68-
package: widget.runtime.extension.package,
69-
cover: data[index].cover,
70-
update: data[index].update,
71-
),
72-
);
73-
}),
74-
),
75-
);
76-
},
47+
return SizedBox(
48+
height: Platform.isAndroid ? 170 : 280,
49+
child: ListView.builder(
50+
scrollDirection: Axis.horizontal,
51+
controller: controller,
52+
itemCount: data!.length,
53+
itemBuilder: ((context, index) {
54+
return Container(
55+
width: Platform.isAndroid ? 110 : 170,
56+
margin: const EdgeInsets.only(right: 16),
57+
child: ExtensionItemCard(
58+
key: ValueKey(data[index].url),
59+
title: data[index].title,
60+
url: data[index].url,
61+
package: widget.searchResult.runitme.extension.package,
62+
cover: data[index].cover,
63+
update: data[index].update,
64+
),
65+
);
66+
}),
67+
),
7768
);
78-
}),
69+
},
7970
),
8071
);
8172
}

0 commit comments

Comments
 (0)