【问题标题】:Flutter: Ternary Condition is not working颤振:三元条件不起作用
【发布时间】:2021-06-13 16:48:39
【问题描述】:

我正在尝试为 Visibility() 小部件创建条件。我已经通过两种方式尝试过。在1st way 中,第二个条件运行良好,但第一个条件不起作用。

与第 2 种方式相同,我的第 2 种情况可以正常工作,但第 1 和第 3 种情况无法正常工作。

我也检查了字符串值和id值没问题。

请有人描述我,有什么问题

第一种方式

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()
                   
                ),

第二种方式:

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上签到

【问题讨论】:

    标签: flutter dart visibility ternary


    【解决方案1】:

    我建议您创建一个布尔函数或 getter 来计算所有条件,然后您可以使用以下任一方法:

    if(condition)
    Container(
     child: .....
    )
    

    condition ? Container(child: ...) : Container()
    

    第二个容器是空的。

    【讨论】:

    • if()else() 条件在 widget() 中不起作用,起初我尝试了您的第二种方式。然后转到 Visibility()
    • if() 条件在小部​​件中不起作用是什么意思你能分享不起作用的代码吗
    • 无法将元素类型“Set”分配给列表类型“Widget”。
    【解决方案2】:

    我查看了您的三元组,我认为您在 educationLevelName == "H.S.C or Equivalent" &amp;&amp; (examinationNameID != 8 || examinationNameID != 11) 中使用了 || 而不是 &amp;&amp;。如果我正确理解了您的情况,如果 examinationNameID 不是 8 或 11,那么您应该使用 &amp;&amp; 运算符。

    这是我对您的代码所做的一个小重构,用于分离您的条件并修复它:

    bool isVisible(String educationLevelName, int examinationNameID) =>
        (educationLevelName == "H.S.C or Equivalent" &&
            (examinationNameID != 8 && examinationNameID != 11)) ||
        (educationLevelName == "S.S.C or Equivalent" && examinationNameID != 3);
    

    我也做了一些单元测试来检查预期的返回值,你可以try it on DartPad

    【讨论】:

    • 其实这里不是2个条件,而是我在第二种方式中描述的3个条件
    • 他将最后一个条件与第一个条件结合起来,因为其中一部分是多余的
    • 你能检查一下这个网址吗dartpad.dev/1fbedf5f1c12ac5122b141cd33b33749
    【解决方案3】:

    如果我明白了,这是你的 3 个条件:

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

    你简化为:

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

    我觉得你的情况不对,这样可能会更好:

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

    案例 1:

      String _educationLevelName = "H.S.C or Equivalent";
      int examinationNameID = 8;
    

    => 未显示,因为条件必须是“H.S.C or Equivalent” AND id !=(8 AND 11)

    案例 2:

      String _educationLevelName = "H.S.C or Equivalent";
      int examinationNameID = 3;
    

    => 显示

    顺便说一句,您可以简化代码(删除真/假,因为您已经在检查布尔值):

    Visibility(
                      visible: (_educationLevelName == "H.S.C or Equivalent" &&
                                  (examinationNameID != 8 && examinationNameID != 11)) 
                              || (_educationLevelName == "S.S.C or Equivalent" && examinationNameID != 3),
                      child: Container()
                       
                    ),
    

    【讨论】:

    【解决方案4】:

    为了便于理解,可以这样写

      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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-17
      • 2018-09-18
      • 2018-11-17
      • 2021-02-20
      • 2021-04-04
      • 1970-01-01
      • 1970-01-01
      • 2021-02-23
      相关资源
      最近更新 更多