颤动:三元条件不起作用
Flutter: Ternary Condition is not working
我正在尝试为 Visibility()
小部件创建条件。我已经通过两种方式尝试过这个。在 1st way
中,第二个条件工作正常,但第一个条件不工作。
与第二种方式相同,我的第二种情况运行良好,但第一种和第三种情况无效。
我也检查了字符串值和id值没问题
请有人描述我,问题是什么
1st way
Visibility(
visible: (_educationLevelName == "H.S.C or Equivalent" &&
(examinationNameID != 8 || //1st condition
examinationNameID != 11)) ||
(_educationLevelName == "S.S.C or Equivalent" &&
examinationNameID != 3) //2nd condition
? true
: false,
child: Container()
),
2nd way:
Visibility(
visible: (_educationLevelName == "H.S.C or Equivalent" &&
examinationNameID !=
8) || //<<================== //1st condition
(_educationLevelName == "S.S.C or Equivalent" &&
examinationNameID !=
3) || //<<================== //2nd condition
(_educationLevelName == "H.S.C or Equivalent" &&
examinationNameID !=
11) //<<================== //3rd condition
? true
: false,
child: Container(),
),
您可以在DartPad
签到
我建议您创建一个布尔函数或 getter 来计算所有条件,然后您可以使用以下任一方法:
if(condition)
Container(
child: .....
)
或
condition ? Container(child: ...) : Container()
第二个容器是空的。
我查看了你的三进制,我认为你在 educationLevelName == "H.S.C or Equivalent" && (examinationNameID != 8 || examinationNameID != 11)
中使用了 ||
而不是 &&
。如果我正确理解您的情况,如果 examinationNameID
不是 8 或 11,那么您应该使用 &&
运算符。
这是我对您的代码所做的一个小重构,用于分离您的条件并修复它:
bool isVisible(String educationLevelName, int examinationNameID) =>
(educationLevelName == "H.S.C or Equivalent" &&
(examinationNameID != 8 && examinationNameID != 11)) ||
(educationLevelName == "S.S.C or Equivalent" && examinationNameID != 3);
我还进行了一些单元测试来检查预期的 return 值,您可以 try it on DartPad.
如果我没看错,这是你的第 3 个条件:
- _educationLevelName == "H.S.C 或同等学历" && examinationNameID != 8
- _educationLevelName == "S.S.C 或同等学历" && examinationNameID != 3
- _educationLevelName == "H.S.C 或同等学历" && examinationNameID != 11
您将其简化为:
- _educationLevelName == "H.S.C 或同等学历" && (examinationNameID != 8 || examinationNameID != 11)
- _educationLevelName == "S.S.C 或同等学历" && examinationNameID != 3
我觉得你的条件不对,这个可能更好:
- _educationLevelName == "H.S.C 或同等学历" && (examinationNameID != 8 && examinationNameID != 11)
- _educationLevelName == "S.S.C 或同等学历" && examinationNameID != 3
案例一:
String _educationLevelName = "H.S.C or Equivalent";
int examinationNameID = 8;
=> 未显示,因为条件必须是“H.S.C 或等效项”AND id !=(8 AND 11)
案例二:
String _educationLevelName = "H.S.C or Equivalent";
int examinationNameID = 3;
=> 显示
顺便说一下,您可以简化代码(删除 true/false 因为您已经在检查布尔值):
Visibility(
visible: (_educationLevelName == "H.S.C or Equivalent" &&
(examinationNameID != 8 && examinationNameID != 11))
|| (_educationLevelName == "S.S.C or Equivalent" && examinationNameID != 3),
child: Container()
),
可以这样写,方便理解
String lvl = 'hsc';
int year = 8;
bool isValidForHsc = lvl == 'hsc' && ![8, 11].contains(year);
bool isValidForSsc = lvl == 'ssc' && year != 3;
print('$lvl - $year');
print('isValidForHsc - $isValidForHsc');
print('isValidForSsc - $isValidForSsc');
否则,你可以这样组合逻辑
bool isValid = (lvl == 'hsc' && ![8, 11].contains(year)) || (lvl == 'ssc' && year != 3);
我正在尝试为 Visibility()
小部件创建条件。我已经通过两种方式尝试过这个。在 1st way
中,第二个条件工作正常,但第一个条件不工作。
与第二种方式相同,我的第二种情况运行良好,但第一种和第三种情况无效。
我也检查了字符串值和id值没问题
请有人描述我,问题是什么
1st way
Visibility(
visible: (_educationLevelName == "H.S.C or Equivalent" &&
(examinationNameID != 8 || //1st condition
examinationNameID != 11)) ||
(_educationLevelName == "S.S.C or Equivalent" &&
examinationNameID != 3) //2nd condition
? true
: false,
child: Container()
),
2nd way:
Visibility(
visible: (_educationLevelName == "H.S.C or Equivalent" &&
examinationNameID !=
8) || //<<================== //1st condition
(_educationLevelName == "S.S.C or Equivalent" &&
examinationNameID !=
3) || //<<================== //2nd condition
(_educationLevelName == "H.S.C or Equivalent" &&
examinationNameID !=
11) //<<================== //3rd condition
? true
: false,
child: Container(),
),
您可以在DartPad
签到我建议您创建一个布尔函数或 getter 来计算所有条件,然后您可以使用以下任一方法:
if(condition)
Container(
child: .....
)
或
condition ? Container(child: ...) : Container()
第二个容器是空的。
我查看了你的三进制,我认为你在 educationLevelName == "H.S.C or Equivalent" && (examinationNameID != 8 || examinationNameID != 11)
中使用了 ||
而不是 &&
。如果我正确理解您的情况,如果 examinationNameID
不是 8 或 11,那么您应该使用 &&
运算符。
这是我对您的代码所做的一个小重构,用于分离您的条件并修复它:
bool isVisible(String educationLevelName, int examinationNameID) =>
(educationLevelName == "H.S.C or Equivalent" &&
(examinationNameID != 8 && examinationNameID != 11)) ||
(educationLevelName == "S.S.C or Equivalent" && examinationNameID != 3);
我还进行了一些单元测试来检查预期的 return 值,您可以 try it on DartPad.
如果我没看错,这是你的第 3 个条件:
- _educationLevelName == "H.S.C 或同等学历" && examinationNameID != 8
- _educationLevelName == "S.S.C 或同等学历" && examinationNameID != 3
- _educationLevelName == "H.S.C 或同等学历" && examinationNameID != 11
您将其简化为:
- _educationLevelName == "H.S.C 或同等学历" && (examinationNameID != 8 || examinationNameID != 11)
- _educationLevelName == "S.S.C 或同等学历" && examinationNameID != 3
我觉得你的条件不对,这个可能更好:
- _educationLevelName == "H.S.C 或同等学历" && (examinationNameID != 8 && examinationNameID != 11)
- _educationLevelName == "S.S.C 或同等学历" && examinationNameID != 3
案例一:
String _educationLevelName = "H.S.C or Equivalent";
int examinationNameID = 8;
=> 未显示,因为条件必须是“H.S.C 或等效项”AND id !=(8 AND 11)
案例二:
String _educationLevelName = "H.S.C or Equivalent";
int examinationNameID = 3;
=> 显示
顺便说一下,您可以简化代码(删除 true/false 因为您已经在检查布尔值):
Visibility(
visible: (_educationLevelName == "H.S.C or Equivalent" &&
(examinationNameID != 8 && examinationNameID != 11))
|| (_educationLevelName == "S.S.C or Equivalent" && examinationNameID != 3),
child: Container()
),
可以这样写,方便理解
String lvl = 'hsc';
int year = 8;
bool isValidForHsc = lvl == 'hsc' && ![8, 11].contains(year);
bool isValidForSsc = lvl == 'ssc' && year != 3;
print('$lvl - $year');
print('isValidForHsc - $isValidForHsc');
print('isValidForSsc - $isValidForSsc');
否则,你可以这样组合逻辑
bool isValid = (lvl == 'hsc' && ![8, 11].contains(year)) || (lvl == 'ssc' && year != 3);