3 Commits
5 changed files with 66 additions and 21 deletions
+27
View File
@@ -1,5 +1,32 @@
# Changelog
## 1.0.3 - 2026-07-15
### Summary
- Hotfix release persisting the hide-archived toggle so it survives page navigation and app restarts.
### Fixed
- Fixed the hide-archived toggle resetting to show archived projects whenever the project list page was rebuilt or the app was restarted; the setting is now persisted via SharedPreferences in ProjectViewModel.
### Build
- Bumped Flutter app version to 1.0.3+4 for the v1.0.3 release tag.
### Assets
- Package Name: com.ooopos.line
- App Version: 1.0.3+4
- Signature Check: apksigner verify --verbose --print-certs <apk>
- Release assets (split-per-ABI):
| Asset | ABI | Size (bytes) | SHA256 |
|---|---|---:|---|
| app-armeabi-v7a-release.apk | armeabi-v7a | 20704616 | d41cae579672303746449e086564b59067a3b74244845824e7749ef48951ee22 |
| app-arm64-v8a-release.apk | arm64-v8a | 22634962 | d01b252bf065b74cd653ef172d45f9a5627977cce4f6aa918fe97e14deb1075f |
| app-x86_64-release.apk | x86_64 | 23807057 | e5c099c853cb94d136ebf19c9847d07cf9361252fa7154e9ac16b1d960b96520 |
### References
- 161f175 fix(project): persist hide-archived toggle across page rebuilds
- 75c9d21 build(release): bump version to 1.0.3+4
## 1.0.2 - 2026-07-15
### Summary
+21
View File
@@ -52,6 +52,9 @@ class ProjectViewModel extends ChangeNotifier {
/// 项目排序顺序,默认降序
ProjectSortOrder _sortOrder = ProjectSortOrder.descending;
/// 是否隐藏已归档项目(持久化)
bool _hideArchived = false;
/// 获取项目列表
List<Project> get projects => _projects;
@@ -77,6 +80,9 @@ class ProjectViewModel extends ChangeNotifier {
/// 获取项目排序顺序
ProjectSortOrder get sortOrder => _sortOrder;
/// 获取是否隐藏已归档项目
bool get hideArchived => _hideArchived;
/// 获取已归档项目数量
int get archivedCount => _projects.where((p) => p.isArchived).length;
@@ -98,6 +104,7 @@ class ProjectViewModel extends ChangeNotifier {
log('Loading projects...');
try {
await _loadSortOrder();
await _loadHideArchived();
_projects = await _databaseService.getProjects();
_sortProjects();
_projectCount = _projects.length;
@@ -554,6 +561,20 @@ class ProjectViewModel extends ChangeNotifier {
log('Project sort field loaded: $_sortField, order loaded: $_sortOrder');
}
/// 从本地存储加载隐藏归档项目设置
Future<void> _loadHideArchived() async {
final prefs = await SharedPreferences.getInstance();
_hideArchived = prefs.getBool('project_hide_archived') ?? false;
}
/// 设置是否隐藏已归档项目并持久化
Future<void> setHideArchived(bool value) async {
_hideArchived = value;
final prefs = await SharedPreferences.getInstance();
await prefs.setBool('project_hide_archived', value);
notifyListeners();
}
/// 获取排序字段的显示名称
/// [sortField] 排序字段
/// 返回排序字段的显示名称
+5 -8
View File
@@ -40,7 +40,6 @@ class _ProjectListPageState extends State<ProjectListPage> {
String _searchQuery = '';
List<Project> _filteredProjects = [];
bool _isSearchMode = false;
bool _hideArchived = false;
int _searchRequestSequence = 0;
@override
@@ -238,7 +237,7 @@ class _ProjectListPageState extends State<ProjectListPage> {
? _filteredProjects
: viewModel.projects;
final projects =
_hideArchived && !_isSearchMode
viewModel.hideArchived && !_isSearchMode
? rawProjects.where((p) => !p.isArchived).toList()
: rawProjects;
@@ -871,7 +870,7 @@ class _ProjectListPageState extends State<ProjectListPage> {
// 在搜索模式下,直接使用传入的project参数
// 在非搜索模式下,确保索引有效
final currentProject =
(_isSearchMode || _hideArchived)
(_isSearchMode || viewModel.hideArchived)
? project
: (index < viewModel.projects.length
? viewModel.projects[index]
@@ -1410,18 +1409,16 @@ class _ProjectListPageState extends State<ProjectListPage> {
},
),
BottomSheetOption.normal(
title: _hideArchived ? '显示归档项目' : '隐藏归档项目',
title: viewModel.hideArchived ? '显示归档项目' : '隐藏归档项目',
icon: Icon(
_hideArchived
viewModel.hideArchived
? CupertinoIcons.eye
: CupertinoIcons.eye_slash,
color: Theme.of(context).colorScheme.primary,
),
onTap: () {
Navigator.pop(context);
setState(() {
_hideArchived = !_hideArchived;
});
viewModel.setHideArchived(!viewModel.hideArchived);
},
),
BottomSheetOption.cancel(
+1 -1
View File
@@ -1,7 +1,7 @@
name: line
description: "A timeline app for project management and life recording."
publish_to: 'none'
version: 1.0.2+3
version: 1.0.3+4
environment:
sdk: ^3.7.2
+12 -12
View File
@@ -1,29 +1,29 @@
{
"latestVersion": "1.0.2",
"versionCode": 3,
"latestVersion": "1.0.3",
"versionCode": 4,
"minRequiredVersionCode": 1,
"releaseNotes": "1. 修复添加记录时无法移除背景图片的问题\n2. 新增时间间隔显示模式(距离上一条 / 距离第一条 / 两者)\n3. 新增项目归档功能(归档后只读浏览,灰色遮罩标识)\n4. 新增应用内更新检测(每 24 小时自动检测,支持应用内安装 APK)\n5. 优化录音按钮图标样式",
"releaseNotes": "修复隐藏归档项目设置退出后不生效的问题",
"publishDate": "2026-07-15",
"assets": [
{
"abi": "arm64-v8a",
"versionCode": 2003,
"url": "https://git.ooopos.site/agnoy/line/releases/download/v1.0.2/app-arm64-v8a-release.apk",
"sha256": "6c8efa0bae2395647e8d676f76d3bb187183f389f3538b7e0d8f2e6579e7278b",
"versionCode": 2004,
"url": "https://git.ooopos.site/agnoy/line/releases/download/v1.0.3/app-arm64-v8a-release.apk",
"sha256": "d01b252bf065b74cd653ef172d45f9a5627977cce4f6aa918fe97e14deb1075f",
"size": 22634962
},
{
"abi": "armeabi-v7a",
"versionCode": 1003,
"url": "https://git.ooopos.site/agnoy/line/releases/download/v1.0.2/app-armeabi-v7a-release.apk",
"sha256": "bc5f6254484443207c86a3376ba413fecd2717bcaf1fee09e6a8a3947ee7a227",
"versionCode": 1004,
"url": "https://git.ooopos.site/agnoy/line/releases/download/v1.0.3/app-armeabi-v7a-release.apk",
"sha256": "d41cae579672303746449e086564b59067a3b74244845824e7749ef48951ee22",
"size": 20704616
},
{
"abi": "x86_64",
"versionCode": 4003,
"url": "https://git.ooopos.site/agnoy/line/releases/download/v1.0.2/app-x86_64-release.apk",
"sha256": "1d42e5f06a931ad4fcd2129d287996a63830247bcee0b75f1f6aa85a1d495311",
"versionCode": 4004,
"url": "https://git.ooopos.site/agnoy/line/releases/download/v1.0.3/app-x86_64-release.apk",
"sha256": "e5c099c853cb94d136ebf19c9847d07cf9361252fa7154e9ac16b1d960b96520",
"size": 23807057
}
]