novyronst/lib/tools/util/search_history_util.dart

64 lines
2.0 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'dart:convert';
import 'package:novyronst/tools/util/sp_tool.dart';
import 'package:shared_preferences/shared_preferences.dart';
/// 本地搜索历史SharedPreferenceskey 与 [AppSp] 规则一致(`.search.history`)。
class SearchHistoryUtil {
SearchHistoryUtil._();
static const String _storageKey = 'search.history';
static const int _maxHistory = 20;
static Future<List<String>> _readList(SharedPreferences prefs) async {
final raw = prefs.getString(_storageKey);
if (raw == null || raw.isEmpty) return [];
try {
final decoded = jsonDecode(raw);
if (decoded is! List) return [];
return decoded.map((e) => e.toString()).where((s) => s.isNotEmpty).toList();
} catch (_) {
return [];
}
}
static Future<void> _writeList(SharedPreferences prefs, List<String> list) async {
await prefs.setString(_storageKey, jsonEncode(list));
}
/// 查询搜索历史列表(新记录在前)。
static Future<List<String>> getSearchList() async {
final prefs = await SpTool.getInstance();
return _readList(prefs);
}
/// 添加一条搜索;去重、去空白,并移到最前。
static Future<void> addSearch(String keyword) async {
final q = keyword.trim();
if (q.isEmpty) return;
final prefs = await SpTool.getInstance();
final list = await _readList(prefs);
list.removeWhere((e) => e == q);
list.insert(0, q);
if (list.length > _maxHistory) {
list.removeRange(_maxHistory, list.length);
}
await _writeList(prefs, list);
}
/// 删除单条搜索记录。
static Future<void> deleteSearch(String keyword) async {
final prefs = await SpTool.getInstance();
final list = await _readList(prefs);
list.removeWhere((e) => e == keyword);
await _writeList(prefs, list);
}
/// 清空全部搜索历史。
static Future<void> clearAllSearch() async {
final prefs = await SpTool.getInstance();
await prefs.remove(_storageKey);
}
}