当前位置: 首页 > article >正文

Flutter WebSocket简单例子

引入插件 :web_socket_channel: ^3.0.1

使用如下代码:

class _MyHomePageState extends State<MyHomePage> {
  String text = "";
  var textController = TextEditingController();
  late IOWebSocketChannel channel;

  void _incrementCounter() {
    channel.sink.add(textController.text);
    textController.text = "";
  }

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

  @override
  Widget build(BuildContext context) {
    HttpClient httpClient = HttpClient();

    /// 解决证书问题
    httpClient.badCertificateCallback = (X509Certificate cert, String host, int port) {
      // String PEM = "XXXXXX";// 证书信息
      // if(cert.pem == PEM){
      //   return true;// 正式一致,则允许发送数据
      // }
      // return false;

      /// 这里可写死true
      return true;
    };
    channel = IOWebSocketChannel.connect(Uri.parse('ws://echo.websocket.org'), customClient: httpClient);
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text("WebSocket例子"),
      ),
      body: StreamBuilder(
          stream: channel.stream,
          builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.active) {
              text = "${snapshot.data}";
            } else if (snapshot.connectionState == ConnectionState.done) {
              text = "已断开连接,断开原因:${snapshot.error}";
            } else if (snapshot.connectionState == ConnectionState.waiting) {
              text = "连接中";
            } else {
              text = "...";
            }
            return Column(
              children: [
                Text(text),
                TextField(
                  controller: textController,
                ),
                TextButton(
                    onPressed: () {
                      channel.sink.close();
                    },
                    child: const Text("断开")),
                TextButton(
                    onPressed: () {
                      setState(() {});
                    },
                    child: const Text("重连")),
              ],
            );
          }),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}


http://www.kler.cn/news/331142.html

相关文章:

  • 《C++ 小游戏:简易飞机大战游戏的实现》
  • 第十二章--- fixed 和 setprecision 函数、round 函数、进制转换及底层逻辑
  • 【Unity单机游戏框架】K-Framework
  • Unity实战案例全解析:RTS游戏的框选和阵型功能(2) 生成选择框
  • Servlet的生命周期及用户提交表单页面的实现(实验报告)
  • ENV | WSL 拓展虚拟磁盘空间
  • 【mod分享】极品飞车12无间风云高清重置mod,车模重构和材质贴图高清化
  • 【C++篇】领略模板编程的进阶之美:参数巧思与编译的智慧
  • Element UI教程:如何将Radio单选框的圆框改为方框
  • 通信工程学习:什么是DNS域名系统
  • 做数据抓取工作要如何选择ip池
  • Windows 11 24H2正式发布
  • Linux如何查看每个文件及文件夹的大小
  • C语言复习概要(一)
  • 链表面试编程题
  • 在中序线索树中找到数据域A,并在其左子树中插入数据域为x的结点
  • Java JUC(三) AQS与同步工具详解
  • 机器学习【教育领域及其平台搭建】
  • 用好AI告别灵感枯竭!如何用300个选题提示词打造病毒式内容?
  • Python笔记 - 函数、方法和类装饰器