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

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也会引发编译/运行错误

修复方案

  1. 修改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 = "网络异常,请检查网络连接";
    });
  }
}
  1. 可选兜底优化:给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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:36:00