Flutter中如何验证ToggleButton?数组相等判断为何不生效?
问题原因与解决方案
为什么条件判断不生效?
Dart里的List是引用类型,直接用==比较的是两个List对象的内存地址,而非内容。你写的[false, false, false]是一个全新的List实例,和_selectedOptions的内存地址不同,哪怕内容完全一致,==也会返回false,因此无法进入if分支。
另外你还漏了一个细节:代码里仅创建了SnackBar,但没有调用显示方法,即便条件成立也不会弹出提示。
修复当前判断的方法
可以通过两种方式正确比较List内容:
- 使用
listEquals工具函数(需导入package:flutter/foundation.dart)
import 'package:flutter/foundation.dart'; // ... onPressed: () { print('this is _selectedOptions: $_selectedOptions'); if (listEquals(_selectedOptions, [false, false, false])) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( duration: Duration(seconds: 5), content: Text('You should select at least 1 option '), ), ); } }
- 手动遍历检查所有元素
onPressed: () { print('this is _selectedOptions: $_selectedOptions'); bool allUnselected = true; for (bool val in _selectedOptions) { if (val) { allUnselected = false; break; } } if (allUnselected) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( duration: Duration(seconds: 5), content: Text('You should select at least 1 option '), ), ); } }
更优的ToggleButton验证方式
无需和固定数组硬匹配,直接判断是否无任何选项被选中,写法更简洁且适配不同长度的选项列表:
- 方式一:用
every方法判断所有元素均为false
onPressed: () { print('this is _selectedOptions: $_selectedOptions'); if (_selectedOptions.every((val) => val == false)) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( duration: Duration(seconds: 5), content: Text('You should select at least 1 option '), ), ); } }
- 方式二:用
contains方法判断是否不存在选中项
onPressed: () { print('this is _selectedOptions: $_selectedOptions'); if (!_selectedOptions.contains(true)) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( duration: Duration(seconds: 5), content: Text('You should select at least 1 option '), ), ); } }
内容的提问来源于stack exchange,提问作者best_of_man
相关产品推荐
相关产品推荐

