Flutter类型转换报错:Null非int子类型但实际值非空的原因排查
问题原因分析
你的报错type 'Null' is not a subtype of type 'int' in type cast,根源不在answer['score']本身,而是**answerQuestion函数的返回值是void,导致你把void(运行时等价于null)强制转换成int**,具体拆解:
看错误行的代码逻辑:
() => answerQuestion(answer['score']) as int这个箭头函数的执行逻辑是:先调用
answerQuestion(answer['score']),再把该函数的返回值做as int类型转换。如果
answerQuestion的函数定义是无返回值的(比如void answerQuestion(int score) {...}),那么调用它的结果在Dart中会被视为null(void类型表达式的求值结果就是null)。此时你试图把null强制转为int,就会触发类型转换错误。IDE显示
score的值为10是正确的——answer['score']确实是你硬编码的非空值,并且已经正确传递给了answerQuestion,但问题出在函数调用后的类型转换步骤。
为什么移除类型转换就解决问题?
当你去掉as int后,箭头函数的返回值是void(对应运行时的null),而如果Answer组件的第一个参数接受的是VoidCallback(无返回值的函数类型),此时类型匹配,自然不会再报错。
验证与修正方向
- 检查
answerQuestion的函数定义:确认它的返回类型是否为void。如果是,那就是上述原因。 - 如果你需要箭头函数返回score的值,有两种修正方式:
- 让
answerQuestion返回传入的score,比如:int answerQuestion(int score) { // 你的原有逻辑 return score; } - 或者直接执行函数调用,不需要返回值:
() { answerQuestion(answer['score'] as int); },
- 让
内容的提问来源于stack exchange,提问作者Todd F
相关产品推荐
相关产品推荐

