颤动:三元条件不起作用

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 个条件:

  1. _educationLevelName == "H.S.C 或同等学历" && examinationNameID != 8
  2. _educationLevelName == "S.S.C 或同等学历" && examinationNameID != 3
  3. _educationLevelName == "H.S.C 或同等学历" && examinationNameID != 11

您将其简化为:

  1. _educationLevelName == "H.S.C 或同等学历" && (examinationNameID != 8 || examinationNameID != 11)
  2. _educationLevelName == "S.S.C 或同等学历" && examinationNameID != 3

我觉得你的条件不对,这个可能更好:

  1. _educationLevelName == "H.S.C 或同等学历" && (examinationNameID != 8 && examinationNameID != 11)
  2. _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);