Flutter项目Text组件空值与硬件键盘断言失败报错求助
Flutter短链生成项目两处报错解决方案
问题1:Text组件非空字符串断言错误
报错原文:Failed assertion: line 378 pos 10: 'data != null': A non-null String must be provided to a Text widget
错误原因
你没有对短链接口的返回结果做异常判断和空安全处理:
- 当输入内容为空、网络异常、接口返回失败时,
result['result']['short_url']会返回null - 把null赋值给
shortUrl后传入buildRow方法的Text组件,就触发了Flutter的非空断言校验报错 - 额外注意:高版本
http库要求请求参数为Uri类型,你原代码中直接传字符串url也会引发编译/运行错误
修复方案
- 修改
getData方法,添加参数校验、网络请求异常捕获、接口返回校验和空安全处理:
import 'package:flutter/services.dart'; // 后续屏蔽键盘报错也需要用到该包 getData() async { // 先校验输入内容不为空 if(urlcontroller.text.trim().isEmpty) { ScaffoldMessenger.of(context).showSnackBar(const SnackBar( content: Text('请先输入需要缩短的链接'), duration: Duration(seconds: 1), )); return; } try { var requestUrl = 'https://api.shrtco.de/v2/shorten?url=${urlcontroller.text}'; // 字符串转Uri适配高版本http库 var response = await http.get(Uri.parse(requestUrl)); if(response.statusCode == 200) { var result = jsonDecode(response.body); // 判断接口返回成功标识 if(result['ok'] == true) { setState(() { // 空安全兜底,取不到值默认返回空字符串 shortUrl = result['result']?['short_url'] ?? ""; }); } else { setState(() { shortUrl = "链接缩短失败,请重试"; }); } } else { setState(() { shortUrl = "请求失败,状态码:${response.statusCode}"; }); } } catch(e) { setState(() { shortUrl = "网络异常,请检查网络连接"; }); } }
- 可选兜底优化:给
buildRow方法的Text组件添加空安全处理,避免后续其他场景传入null:
buildRow(String title, String data, bool original) { return SingleChildScrollView( child: original ? Container( alignment: Alignment.center, child: Text( data ?? '', // 空值兜底 )) : Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ Text( title ?? '', ), Text( data ?? '', ), InkWell( onTap: () => copy(shortUrl), child: Icon(Icons.content_copy)) ], ), ); }
问题2:硬件键盘事件断言失败错误
报错原文:
A KeyUpEvent is dispatched, but the state shows that the physical key is pressed on a different logical key. If this occurs in real application, please report this bug to Flutter...
'package:flutter/src/services/hardware_keyboard.dart':
Failed assertion: line 444 pos 16: '_pressedKeys[event.physicalKey] == event.logicalKey'
错误原因
这是Flutter 3.10以下版本SDK的已知桌面端调试bug,和你的业务代码无关:仅在Windows/macOS桌面端调试时,按下数字锁定、大小写切换、组合键后输入焦点停留在TextField上时触发,不会影响release包的正常运行。
修复方案
- 临时规避:调试时点击窗口空白区域取消TextField的输入焦点,或重启调试会话即可消除报错
- 永久修复1:将Flutter SDK升级到3.10及以上稳定版,该问题已在官方后续版本修复
- 永久修复2:不想升级SDK的话,在main方法入口添加代码清空键盘状态即可屏蔽报错:
void main() { WidgetsFlutterBinding.ensureInitialized(); // 清空硬件键盘状态,屏蔽断言报错 HardwareKeyboard.instance.clearState(); runApp(const MyApp()); }
内容的提问来源于stack exchange,提问作者Nisa Efendioglu
相关产品推荐
相关产品推荐

