You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

开发Flutter跨端应用,寻求支持x0vnc的VNC Viewer方案

实现Flutter跨端VNC Viewer的简便方案

针对你的需求(Flutter移动端+Web端连接Ubuntu的x0vncserver),推荐以下两种无需依赖JS库的简便实现方式:

1. 纯Dart VNC客户端库(首选)

使用dart_vnc这个纯Dart实现的VNC客户端,它完全基于Dart编写,无需原生代码或WebView依赖,天然支持Flutter全平台(iOS/Android/Web),是最简便的方案。

实现步骤:

  • 添加依赖到pubspec.yaml:
dependencies:
  dart_vnc: ^0.4.0 # 替换为最新版本
  • 核心代码示例:
import 'package:dart_vnc/dart_vnc.dart';
import 'package:flutter/material.dart';

class VncViewerPage extends StatefulWidget {
  final String host;
  final int port;
  final String password;

  const VncViewerPage({required this.host, required this.port, required this.password, Key? key}) : super(key: key);

  @override
  State<VncViewerPage> createState() => _VncViewerPageState();
}

class _VncViewerPageState extends State<VncViewerPage> {
  late VncClient client;
  Uint8List? frameBuffer;
  Size? screenSize;

  @override
  void initState() {
    super.initState();
    _connectToVnc();
  }

  Future<void> _connectToVnc() async {
    client = VncClient(
      host: widget.host,
      port: widget.port,
      password: widget.password,
    );

    // 监听帧更新
    client.onFrameUpdate.listen((update) {
      setState(() {
        frameBuffer = client.frameBuffer.asUint8List();
        screenSize = Size(client.frameBuffer.width.toDouble(), client.frameBuffer.height.toDouble());
      });
    });

    // 连接服务器
    try {
      await client.connect();
      await client.authenticate();
      await client.initialize();
    } catch (e) {
      debugPrint('VNC连接失败: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('VNC Viewer')),
      body: frameBuffer == null || screenSize == null
          ? const Center(child: CircularProgressIndicator())
          : InteractiveViewer(
              child: Image.memory(
                frameBuffer!,
                width: screenSize!.width,
                height: screenSize!.height,
                fit: BoxFit.contain,
              ),
            ),
    );
  }

  @override
  void dispose() {
    client.disconnect();
    super.dispose();
  }
}
  • 交互处理:该库支持发送鼠标点击、拖拽、键盘输入等事件,可通过client.sendPointerEvent、client.sendKeyEvent等API实现,具体可参考库的文档。

2. 轻量WebView嵌入(备选)

如果纯Dart库无法满足某些特殊需求,也可以用webview_flutter包嵌入极简的VNC Web客户端(比如noVNC核心逻辑),但需要将noVNC静态资源打包到Flutter项目中,相比纯Dart方案稍繁琐,但也能实现跨端支持。

x0vncserver配置注意事项

确保Ubuntu端的x0vncserver正确配置:

  • 设置连接密码:x0vncserver -passwordfile ~/.vnc/passwd(无密码文件时先执行vncpasswd生成)
  • 开放默认VNC端口:sudo ufw allow 5900/tcp
  • 启动服务器指定桌面会话:x0vncserver -display :0 -passwordfile ~/.vnc/passwd(:0对应当前桌面会话)

内容的提问来源于stack exchange,提问作者the.cicada.himself

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 18:18:28