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

Flutter解密WebSocket数据时出现await仅可在async函数中使用报错如何解决

问题原因
  • 报错的核心是 await 关键字只能在标记了 async 的函数体内使用,你当前在两个非async函数上下文里调用了await:
    1. socket.listen 的回调函数没有加 async 标记
    2. setState 的回调函数也没有加 async 标记
  • 额外还有逻辑错误:socket.listen 外部的那行解密代码访问了只有回调内部才有的 event 变量,运行时会抛出未定义错误
  • 现有展示逻辑用的是原始数据变量 weightSO,解密完成后需要替换为 weightRT 才能展示解密后的数据
修正后的代码

socket 逻辑修正

socketData() async {
  Socket socket = await Socket.connect('192.168.0.1', 4005);
  print('connected');
  const key = '11111'; // 固定密钥提前声明,避免每次接收数据重复创建

  // send 0
  socket.add(utf8.encode('0'));
  // 给listen的回调加上async标记,支持内部调用await
  socket.listen((List<int> event) async {
    final receivedStr = utf8.decode(event);
    // 先执行异步解密,完成后再调用setState更新状态
    final decryptedStr = await FlutterAesEcbPkcs5.decryptString(receivedStr, key);
    setState(() {
      weightSO = receivedStr;
      weightRT = decryptedStr;
    });
    print(receivedStr);
    socket.add(utf8.encode('0'));
  });

  await Future.delayed(Duration(seconds: 300));
  socket.close();
}

展示逻辑修正

@override
Widget build(BuildContext context) {
  return Scaffold(
    body: Column(
        mainAxisSize: MainAxisSize.min,
        children: <Widget>[
          SizedBox(height: 35.0),
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceAround,
            children: <Widget>[
              FlatButton(
                disabledColor: Colors.pink,
                textColor: Colors.blueGrey,
                color: Colors.transparent,
                child: Text('Weight', textScaleFactor: 2),
                onPressed: getWeight,
                padding: EdgeInsets.fromLTRB(30.0, 10.0, 30, 10.0),
              ),
            ],
          ),
          Container(
            // 替换为解密后的weightRT变量
            child: Text('$weightRT', style: TextStyle(fontSize: 45.0, color: Colors.blueGrey)),
            padding: EdgeInsets.fromLTRB(0, 0.0, 0, 20.0),
          ),
        ]),
  );
}
注意点
  • 不要在 setState 回调里执行异步操作,setState 应当仅用来同步更新状态变量,异步逻辑提前执行完成后再调用 setState
  • 确保 weightRT 变量有初始值,避免空安全异常,比如可以初始赋值为空字符串 String weightRT = '';
  • 解密过程可能抛出异常,建议加 try-catch 捕获异常避免应用崩溃

内容的提问来源于stack exchange,提问作者Andrii Havrylyak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 01:39:03