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
相关产品推荐
相关产品推荐

