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

Flutter中StreamBuilder取值运算时报'int不是Widget子类型'错误如何解决

问题原因

你把变量赋值语句直接放在了Row的children数组中,这个数组要求所有元素都必须是Widget类型,但_dose = streamSnapshot.data!.docs[index]["dose_ml_Kg"]*20这个赋值语句的返回值是int类型的计算结果,不属于Widget,因此触发类型不匹配错误。


修复方案

方案1:直接在Text中运算(无需额外变量)

直接把计算逻辑写在Text组件的参数里,不需要单独定义_dose变量,代码更简洁:

children: [
  Text(streamSnapshot.data!.docs[index]["nome"].toString()),
  Text(streamSnapshot.data!.docs[index]["dose_ml_Kg"].toString()),
  Text(streamSnapshot.data!.docs[index]["dose_max"].toString()),
  // 直接计算后转字符串展示
  Text((streamSnapshot.data!.docs[index]["dose_ml_Kg"] * 20).toString()),
],

方案2:先赋值变量再渲染

如果确实需要先把计算结果存到_dose变量中,需要把itemBuilder的箭头函数改为函数体,先完成变量赋值再返回组件:

itemBuilder: (context, index) {
  // 先在函数体内完成变量赋值,不要放在children数组中
  num _dose = (streamSnapshot.data!.docs[index]["dose_ml_Kg"] as num) * 20;
  return GestureDetector(
    // 原有GestureDetector内的代码保持不变
    onTap: () {},
    child: Card(
      color: Colors.amberAccent[100],
      child: Padding(
        padding: EdgeInsets.fromLTRB(_margem * .1,
            _margem * .1, _margem * .1, _margem * .1),
        child: Row(
          crossAxisAlignment: CrossAxisAlignment.center,
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          children: [
            Text(streamSnapshot.data!.docs[index]["nome"].toString()),
            Text(streamSnapshot.data!.docs[index]["dose_ml_Kg"].toString()),
            Text(streamSnapshot.data!.docs[index]["dose_max"].toString()),
            Text(_dose.toString()),
          ],
        ),
      ),
    ),
  );
}

额外提示:建议从Firestore读取字段后先做显式类型转换,避免字段类型不符引发的运行时错误。


内容的提问来源于stack exchange,提问作者Byron Rodrigues

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 02:39:00