From e868e7878353c96bbe682ca5b342433bf4b2a5a4 Mon Sep 17 00:00:00 2001 From: Sam-Fic <169824983+Sam-Fic@users.noreply.github.com> Date: Tue, 10 Nov 2026 23:29:01 +0800 Subject: [PATCH] =?UTF-8?q?fix(project):=20=E5=8B=BE=E9=80=89=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=E8=AF=BB=E5=8F=96=E7=AB=AF=E8=A1=A5=20null=20?= =?UTF-8?q?=E9=98=B2=E5=BE=A1=E4=B8=8E=E8=B7=AF=E5=BE=84=E5=BD=92=E4=B8=80?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit checked_fields 字段名兼容 (8f4f793) 的两个遗留隐患: - get_string_element 对非字符串元素 (Flet 旧文件可能是对象数组) 返回 null: cli 端会把 null 收进 checked_paths, project_manager 端 File.new_for_path (null) 触发 G_IS_FILE critical, 循环内跳过 - 勾选匹配是字符串精确比较 (path in checked_files), Flet 若写 正斜杠/相对路径则勾选依然对不上: 读取端经 File.get_path () 归一化到本版规范形态, 相对路径按 work_dir 解析 (两处对称, 归一化逻辑放 ProjectManager.canonicalize_checked_path 共用) --- src/cli.vala | 8 +++++++- src/services/project_manager.vala | 26 ++++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/cli.vala b/src/cli.vala index cb80696..8ca98d5 100644 --- a/src/cli.vala +++ b/src/cli.vala @@ -512,7 +512,13 @@ public class CliController : GLib.Object { if (checked_arr != null) { for (int i = 0; i < checked_arr.get_length (); i++) { var p = checked_arr.get_string_element (i); - checked_paths.add (p); + // Flet 旧文件可能是对象数组等非字符串元素, get_string_element + // 对其返回 null, 跳过而不是把 null 收进集合 + if (p == null || p == "") continue; + var canonical = ProjectManager.canonicalize_checked_path (p, work_dir); + if (canonical != null) { + checked_paths.add (canonical); + } } } diff --git a/src/services/project_manager.vala b/src/services/project_manager.vala index 62c0397..7414c86 100644 --- a/src/services/project_manager.vala +++ b/src/services/project_manager.vala @@ -1,6 +1,24 @@ using Gee; public class ProjectManager : GLib.Object { + + // 项目文件里勾选路径的归一化: Flet 版可能写正斜杠或相对 work_dir 的路径, + // 而本版勾选匹配 (path in checked_files, CheckStateModel) 是字符串精确比较, + // 必须转成 File.get_path () 的规范形态才能命中; 无法解析时原样返回。 + public static string? canonicalize_checked_path (string path, File? work_dir) { + if (path == "") return null; + try { + var f = File.new_for_path (path); + if (!GLib.Path.is_absolute (path) && work_dir != null) { + f = work_dir.resolve_relative_path (path); + } + var canonical = f.get_path (); + return (canonical != null && canonical != "") ? canonical : path; + } catch (Error e) { + return path; + } + } + public static void load_project_file ( string file_path, Gee.ArrayList items, @@ -61,8 +79,12 @@ public class ProjectManager : GLib.Object { if (checked_arr != null) { for (int i = 0; i < checked_arr.get_length (); i++) { var p = checked_arr.get_string_element (i); - if (File.new_for_path (p).query_exists ()) { - checked_paths.add (p); + // Flet 旧文件可能是对象数组等非字符串元素, get_string_element + // 对其返回 null, 跳过而不是把 null 收进集合 + if (p == null || p == "") continue; + var canonical = canonicalize_checked_path (p, work_dir); + if (canonical != null && File.new_for_path (canonical).query_exists ()) { + checked_paths.add (canonical); } } }