fix:搜索和我的页面

This commit is contained in:
jingyun
2026-06-07 11:16:19 +08:00
parent ac794ae58a
commit 544468f207
+38 -16
View File
@@ -47,33 +47,22 @@ class ReportsPage extends HookConsumerWidget {
final theme = ShadTheme.of(context);
final searchController = useTextEditingController();
final query = ref.watch(reportFilterProvider);
final snapshot = ref.watch(filteredReportsProvider);
final allReportsSnapshot = ref.watch(reportsProvider);
final snapshot = ref.watch(reportsProvider);
final institutionsSnapshot = ref.watch(institutionsProvider);
final controller = ref.read(reportFilterProvider.notifier);
final allReports = allReportsSnapshot.maybeWhen(
data: (items) => items,
orElse: () => const <ReportCardModel>[],
);
final institutions = institutionsSnapshot.maybeWhen(
data: (items) => items,
orElse: () => const <Institution>[],
);
useEffect(() {
if (searchController.text != query.search) {
searchController.text = query.search;
}
return null;
}, [query.search]);
return snapshot.when(
loading: () => const LoadingState(label: '正在搜索研报'),
loading: () => const LoadingState(label: '正在加载研报'),
error: (error, _) => ErrorState(
message: error.toString(),
onRetry: () => ref.invalidate(filteredReportsProvider),
onRetry: () => ref.invalidate(reportsProvider),
),
data: (items) {
data: (allReports) {
final items = _applyReportQuery(allReports, query);
return SingleChildScrollView(
padding: const EdgeInsets.fromLTRB(
YantingSpacing.screenX,
@@ -220,6 +209,39 @@ class ReportsPage extends HookConsumerWidget {
}
}
List<ReportCardModel> _applyReportQuery(
List<ReportCardModel> items,
ReportQuery query,
) {
final search = query.search.trim().toLowerCase();
final filtered = items.where((item) {
final haystack =
'${item.titleCn} ${item.subtitleCn} ${item.oneLiner} '
'${item.institution.nameCn} ${item.institution.nameEn} '
'${item.topics.join(' ')}'
.toLowerCase();
if (search.isNotEmpty && !haystack.contains(search)) {
return false;
}
if (query.topic != null && !item.topics.contains(query.topic)) {
return false;
}
if (query.institutionId != null &&
item.institution.id != query.institutionId) {
return false;
}
if (query.hasAudio && !item.hasAudio) {
return false;
}
return true;
}).toList();
filtered.sort((a, b) {
final result = (b.releasedAt ?? '').compareTo(a.releasedAt ?? '');
return query.sort == ReportSort.oldest ? -result : result;
});
return filtered;
}
void _openFilterSheet(
BuildContext context, {
required List<ReportCardModel> items,