From 9fdb8410d3b93dc87a16dd38f0bd22635a81938f Mon Sep 17 00:00:00 2001 From: fufesou Date: Fri, 3 Jul 2026 12:49:32 +0800 Subject: [PATCH] fix: parse exit code of flutter web (#15501) * fix: parse exit code of flutter web Signed-off-by: fufesou * fix: exit-code, debug print Signed-off-by: fufesou --------- Signed-off-by: fufesou --- flutter/lib/models/terminal_model.dart | 30 ++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/flutter/lib/models/terminal_model.dart b/flutter/lib/models/terminal_model.dart index 3374b9782..2b3fd4837 100644 --- a/flutter/lib/models/terminal_model.dart +++ b/flutter/lib/models/terminal_model.dart @@ -1,7 +1,6 @@ import 'dart:async'; import 'dart:convert'; import 'package:desktop_multi_window/desktop_multi_window.dart'; -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hbb/common.dart'; import 'package:flutter_hbb/consts.dart'; @@ -251,6 +250,33 @@ class TerminalModel with ChangeNotifier { } } + static int getExitCodeFromEvt(Map evt) { + if (evt.containsKey('exit_code')) { + final v = evt['exit_code']; + if (v is int) { + // Desktop and mobile send exit_code as an int + return v; + } else if (v is String) { + // Web sends exit_code as a string + final parsed = int.tryParse(v); + if (parsed != null) { + return parsed; + } else { + debugPrint( + '[TerminalModel] Failed to parse exit_code as integer: $v. Expected a numeric string.'); + return 0; + } + } else { + debugPrint( + '[TerminalModel] Unexpected exit_code type: ${v.runtimeType}, value: $v. Expected int or String.'); + return 0; + } + } else { + debugPrint('[TerminalModel] Event does not contain exit_code'); + return 0; + } + } + void handleTerminalResponse(Map evt) { final String? type = evt['type']; final int evtTerminalId = getTerminalIdFromEvt(evt); @@ -473,7 +499,7 @@ class TerminalModel with ChangeNotifier { } void _handleTerminalClosed(Map evt) { - final int exitCode = evt['exit_code'] ?? 0; + final int exitCode = getExitCodeFromEvt(evt); _writeToTerminal('\r\nTerminal closed with exit code: $exitCode\r\n'); _terminalOpened = false; notifyListeners();