fix: wire backend<->engine data flow so content renders and input works

This commit is contained in:
2026-08-01 20:20:25 +08:00
parent 76ce9a01b1
commit 1ab485dffe
2 changed files with 63 additions and 9 deletions

View File

@@ -1,3 +1,6 @@
import 'dart:async';
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:flutter_alacritty/flutter_alacritty.dart';
@@ -25,6 +28,8 @@ class _TerminalScreenState extends State<TerminalScreen> {
final FocusNode _focus = FocusNode();
RttyPtyBackend? _backend;
StreamSubscription<Uint8List>? _engineOutputSub;
StreamSubscription<Uint8List>? _backendOutputSub;
final _host = TextEditingController(text: '127.0.0.1');
final _port = TextEditingController(text: '8080');
@@ -66,14 +71,22 @@ class _TerminalScreenState extends State<TerminalScreen> {
_backend = RttyPtyBackend();
});
_backend!.onStateChanged = (s) {
final engine = _engine!;
final backend = _backend!;
// 双向接线backend 输出(服务端 ANSI→ 引擎渲染;
// 引擎输出(用户输入)→ backend 发回服务端写入远端 PTY。
_engineOutputSub = engine.output.listen(backend.write);
_backendOutputSub = backend.output.listen(engine.feed);
backend.onStateChanged = (s) {
if (!mounted) return;
setState(() => _state = s);
if (s == ConnState.disconnected || s == ConnState.error) {
_sessionId = null;
}
};
_backend!.onReady = (id, cols, rows) {
backend.onReady = (id, cols, rows) {
if (!mounted) return;
setState(() {
_sessionId = id;
@@ -82,12 +95,17 @@ class _TerminalScreenState extends State<TerminalScreen> {
});
};
await _backend!.connect(host: host, port: port, session: session);
await backend.connect(host: host, port: port, session: session);
}
void _disconnect() => _tearDownSession();
void _tearDownSession() {
_engineOutputSub?.cancel();
_engineOutputSub = null;
_backendOutputSub?.cancel();
_backendOutputSub = null;
final b = _backend;
if (b != null) {
b.onStateChanged = null;