Flutter中根据布尔值条件显示Widget遇_TypeError问题求助
Flutter条件显示Widget报错:_TypeError (type 'Null' is not a subtype of type 'Widget')
我希望根据布尔变量的值条件显示Widget,但遇到上述类型错误。代码如下:
import 'package:expense_tracker/Models/expense.dart'; import 'package:flutter/material.dart'; class ExpensesItem extends StatelessWidget { const ExpensesItem(this.isAdditionalDisplayed, this.expense, {super.key,}); final Expense expense; final bool isAdditionalDisplayed; // 布尔变量 _displayAdditional() { if(isAdditionalDisplayed == true) { Column( children: [ Row( children: [ SizedBox( height: 100, width: 360, child: Text(expense.additional))], ) ], ); } if(isAdditionalDisplayed == false) { SizedBox(height: 0,); } } // 意图:根据布尔值显示对应Widget,false时显示空SizedBox @override Widget build(BuildContext context) { return Card( child: Padding( padding: const EdgeInsets.symmetric( horizontal: 20, vertical: 16, ), child: Column( children: [ Text(expense.title), const SizedBox(height: 4), Column( children: [ Row( children: [ SizedBox( height: 100, width: 360, child: Text(expense.additional))], ) ], ), _displayAdditional(), // 此处触发错误 ], ), ), ); } }
尝试的操作及困惑
- 在第二个if语句中检查
isAdditionalDisplayed是否为null,得到错误:操作数不能为null,因此该条件始终为'false',建议移除该条件。 - 调用
_displayAdditional()时添加感叹号_displayAdditional()!,得到错误:_TypeError (Null check operator used on a null value)。 - 同时修改会触发两个错误,单独修改触发对应错误,困惑的是一处提示变量不能为null,另一处却提示它为null。
问题根源及解决方法
核心问题是**_displayAdditional()方法没有返回值**:你在if分支里创建了Widget,但没有用return关键字返回,方法默认返回null,而Column的children列表要求每个元素都是Widget类型,null不符合要求,才会抛出类型错误。
修正后的代码如下:
import 'package:expense_tracker/Models/expense.dart'; import 'package:flutter/material.dart'; class ExpensesItem extends StatelessWidget { const ExpensesItem(this.isAdditionalDisplayed, this.expense, {super.key,}); final Expense expense; final bool isAdditionalDisplayed; // 明确声明返回类型为Widget,确保返回值符合要求 Widget _displayAdditional() { // 布尔值直接判断,无需==true if(isAdditionalDisplayed) { return Column( children: [ Row( children: [ SizedBox( height: 100, width: 360, child: Text(expense.additional) ) ], ) ], ); } else { // 用else替代冗余的第二个if,同时加const优化性能 return const SizedBox(height: 0); } } @override Widget build(BuildContext context) { return Card( child: Padding( padding: const EdgeInsets.symmetric( horizontal: 20, vertical: 16, ), child: Column( children: [ Text(expense.title), const SizedBox(height: 4), Column( children: [ Row( children: [ SizedBox( height: 100, width: 360, child: Text(expense.additional))], ) ], ), _displayAdditional(), ], ), ), ); } }
关于之前困惑的解释
- 提示
isAdditionalDisplayed不能为null:因为你声明它为final bool(非空布尔类型),所以它永远不会是null,检查null的条件确实多余,IDE会提示移除。 - 加
!报错:因为_displayAdditional()本身返回的是null(没有return语句),你用!强制将null转为非空Widget,自然会触发"Null check operator used on a null value"错误。
内容的提问来源于stack exchange,提问作者nh44
相关产品推荐
相关产品推荐

