Flutter解密WebSocket数据时出现await仅可在async函数中使用报错如何解决
问题原因
- 报错的核心是
await关键字只能在标记了async的函数体内使用,你当前在两个非async函数上下文里调用了await:socket.listen的回调函数没有加async标记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
相关产品推荐
相关产品推荐

