You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Fixed / 修复
Fixed the Database tab's two search boxes being completely dead: neither passed onChanged to InspectorSearchField, so typing never updated the keyword. The global search now filters databases/tables as you type, and the in-database search re-queries with a server-side cell filter (resetting to page one).
Fixed the log filter list freezing once 500 entries accumulated: the filter cache keyed on "view identity + length", but the log view is a stable UnmodifiableListView and the ring buffer keeps its length constant once full, so neither condition detected new data. Caches now invalidate on a monotonic service data version (InspectorService.logVersion).
Fixed the persistence ring buffer writing duplicate rows: a reassembled multi-line log re-enqueued under the same id (N rows on disk, N duplicates on replay with growing content), a network request was enqueued twice (send + response, two copies in the session archive), and an aggregated error re-enqueued on every repeat hit. Pending buffers are now keyed by entry id (last write wins) and loads dedupe by eid, so databases written by older versions replay cleanly too.
修复持久化环形缓冲写入重复行:续行合并的多行日志会以同一 id 重复入队(落 N 行、重启回放出现 N 次且内容递增),网络请求「发送 + 响应」各入队一次(会话存档里同一请求出现两条),聚合异常每次重复命中都入队。待刷盘缓冲改为按条目 id 覆盖写(last-wins),读取侧按 eid 去重,旧版本写出的库也能干净回放。
Fixed ZeroInspectorKit.dispose() restoring FlutterError.onError in the wrong order, which permanently replaced the host's own handler with a dead callback and silently broke host error reporting (Sentry / Firebase Crashlytics, …). Dispose now also releases the FlutterMemoryAllocations bridge subscription and closes the SQLite viewer's cached read-only connections, and re-init() swaps in a fresh provider instead of leaving stale connections registered.
Fixed a toast crash: InspectorToast could call OverlayEntry.remove() twice (tap-to-dismiss plus the auto-dismiss timer), which asserts in debug, and threw when the overlay was already unmounted. Removal is now idempotent, the timer is cancelable, and overlay teardown is tolerated. The memory viewer's private toast implementation (uncancellable delayed remove, no mounted guard) now reuses the shared component.
Fixed the Database viewer calling setState after await without a mounted check, which threw "setState() called after dispose()" when switching tabs or closing the panel mid-query.
修复数据库查看器在 await 后未检查 mounted 直接 setState 的问题——查询期间切换 Tab 或关闭面板会抛 "setState() called after dispose()"。
Fixed _decorateMaterialApp silently dropping highContrastTheme / highContrastDarkTheme (high-contrast themes), themeAnimationDuration / themeAnimationCurve / themeAnimationStyle (theme switch animation) and onNavigationNotification (system back notifications) when injecting the route observer — host-app behavior changed the moment the inspector was attached.
Fixed runAppWithInspector() not forwarding enableErrorCapture: the one-liner integration could not turn error aggregation off, and its Zone handler aggregated uncaught errors regardless of the flag. The flag now passes through to init() and gates the Zone aggregation.
修复 runAppWithInspector() 不透传 enableErrorCapture 的问题——一句话式集成无法关闭异常聚合,且其 Zone 回调无视该开关照样聚合未捕获异常。现在该参数透传给 init() 并控制 Zone 内的聚合。
Fixed copy / share flows reporting success unconditionally: ExportService.copy / copyLogs / copyNet / copyText now return whether the clipboard write succeeded, and the cURL / JSON / single-log / stack copy toasts report failures instead of claiming success.
Fixed the Network viewer's filter cache never hitting (identical compared a freshly wrapped UnmodifiableListView every call, so every rebuild re-scanned everything); it now uses the same data-version counter. Multi-select delete uses a new batched API (InspectorService.removeNetworkRequests) with a single mutation and notification instead of one rebuild per deleted row.
Fixed the Timeline viewer re-merging on every build when the merged result was empty (empty session or all sources hidden).
修复时间线查看器在归并结果为空(空会话或全部来源被隐藏)时每次 build 都重新全量归并的问题。
Fixed (native) / 修复(原生)
Fixed the iOS console-log listener: the dup2 redirection of stdout/stderr was never restored, so host prints stayed trapped in an unread pipe (and could block once the pipe buffer filled), the log array grew without bound, and repeated starts stacked redirects that could never be undone. It now backs up and restores the original fds, keeps a bounded ring buffer, and guards against re-entry.
Added opt-in replay of the previous session's network records: NetworkRequest.fromJson, InspectorService.restoreNetworkRequests and init(enableNetworkReplay: true) (also exposed on runAppWithInspector()). Logs, errors and alerts replay as before; network records stay archived unless the flag is on, because mixing historical with live requests is easy to misread.
Added the public getters InspectorService.logVersion / networkVersion — monotonic data versions that let UI caches invalidate precisely (the root cause behind both the frozen log filter and the never-hitting network filter cache).