// 搜索状态 — SearchBloc 输出的 UI 状态 part of 'search_bloc.dart'; /// 搜索结果分类 tab enum SearchResultTab { all('全部'), journal('日记'), template('模板'), tag('标签'); const SearchResultTab(this.label); final String label; } /// 搜索状态基类 sealed class SearchState { const SearchState(); } /// 初始状态 — 未执行任何搜索 final class SearchInitial extends SearchState { const SearchInitial(); } /// 加载中 — 正在查询日记 final class SearchLoading extends SearchState { const SearchLoading(); } /// 搜索结果已加载 final class SearchLoaded extends SearchState { /// 日记搜索结果列表 final List results; /// 当前活跃的心情筛选条件 final String? activeMood; /// 当前活跃的标签筛选条件 final String? activeTag; /// 当前活跃的关键词 final String? activeKeyword; /// 当前选中的结果分类 tab final SearchResultTab activeTab; /// 搜索历史(内存中保存,最多 10 条) final List searchHistory; const SearchLoaded({ this.results = const [], this.activeMood, this.activeTag, this.activeKeyword, this.activeTab = SearchResultTab.all, this.searchHistory = const [], }); /// 是否有活跃的筛选条件 bool get hasActiveFilter => activeMood != null || activeTag != null || activeKeyword != null; SearchLoaded copyWith({ List? results, String? activeMood, bool clearActiveMood = false, String? activeTag, bool clearActiveTag = false, String? activeKeyword, bool clearActiveKeyword = false, SearchResultTab? activeTab, List? searchHistory, }) => SearchLoaded( results: results ?? this.results, activeMood: clearActiveMood ? null : (activeMood ?? this.activeMood), activeTag: clearActiveTag ? null : (activeTag ?? this.activeTag), activeKeyword: clearActiveKeyword ? null : (activeKeyword ?? this.activeKeyword), activeTab: activeTab ?? this.activeTab, searchHistory: searchHistory ?? this.searchHistory, ); } /// 搜索出错 final class SearchError extends SearchState { final String message; const SearchError(this.message); }