【问题标题】:Why does the Null check operator used on a null value trigger here?为什么在这里触发空值时使用的空检查运算符?
【发布时间】:2021-07-17 07:25:36
【问题描述】:

嘿,我对用于空值错误的空检查运算符有疑问。总的来说,我对此几乎没有任何问题,仅在一种情况下。

所以我有一个网站,您可以在其中选择两个选项,这总是有效的,但在这种情况下不是

因此,我认为我的数据集中存在缺陷,因此没有定义一个值。我检查了一下,似乎是正确的:

这里我复制了一部分有缺陷的数据:

                       {
                      "title":"105 PS",
                      "unterscheidungsData":[
                         {
                            "difference":"Hubraum 1422 cm³",
                            "title":"1.4 TDI DPF BlueMotion Technology",
                            "wholeText ":"Ölverlust\n\nBremse\n\nBatterie(2009-2013)\n\nSteuerkette(2009 - 2011)\n\nZündspule(2009 - 2010)\n\nZündkerze(2009 - 2013)\n\nScheinwerfer(2010)"
                         },
                         {
                            "difference ":"Hubraum 1598 cm³",
                            "title ":"1.6 TDI(DPF)",
                            "wholeText ":"Ölverlust\n\nBremse\n\nBatterie(2009-2013)\n\nSteuerkette(2009 - 2011)\n\nZündspule(2009 - 2010)\n\nZündkerze(2009 - 2013)\n\nScheinwerfer(2010)"
                         }
                      ]
                   }

&这里的数据非常好用,我比较了它们&并没有真正注意到语法上的任何差异

                      {
                      "title":"150 PS",
                      "unterscheidungsData":[
                         {
                            "difference":"Sportwagen, Crosswagon",
                            "title":"1.9 16V JTD M-Jet",
                            "wholeText":"abbrechende Drallklappen können zu Turbo- oder Motorschaden führen\n\nDefekte Ölpumpen\n\nDefekte Lichtmaschinen\n\nverschlissene Zweimassenschwungräder\n\nVerrußte und hängende Abgasrückführungsventile\n\nAusfall Bremsservo\n\nUndichte Wasserkühler auf der Innenseite\n\ngerissene Keilrippenriemen\n\ndefekte Anlasser"
                         },
                         {
                            "difference":"Normal",
                            "title":"2.4 10V JTD",
                            "wholeText":"Verrußte und hängende Abgasrückführungsventile\n\nAusfall Bremsservo\n\nUndichte Wasserkühler auf der Innenseite\n\ngerissene Keilrippenriemen\n\ndefekte Anlasser\n\nBeschädigungen der Ölwanne"
                         }
                      ]
                   },

                           

所以最后我认为我的代码有一些缺陷(这是我的列表视图构建器):

ListView.builder(
          itemCount: this.leistungData!.unterscheidungsData!.length,
          itemBuilder: (context, index) => GestureDetector(
            onTap: () {
              Navigator.push(context,
                  MaterialPageRoute(builder: (context) => AutoProbleme(
                    variantData: variantData,
                    unterscheidungsData: leistungData!.unterscheidungsData![index],
                    modell: modell,
                    modelData: modelData,
                  )));
            },
            child: Container(
              margin: EdgeInsets.all(10),
              height: MediaQuery.of(context).size.height * 0.05,
              width: MediaQuery.of(context).size.width * 0.9,
              child: Align(
                alignment: Alignment.center,
                child: Text(
                  this.leistungData!.unterscheidungsData![index].difference!,
                  textScaleFactor: 1.4,
                ),
              ),
              decoration: BoxDecoration(
                  color: Colors.white,
                  borderRadius: BorderRadius.circular(16)),
            ),
          )),

& 我不得不说我没有找到任何可以证明这种行为的理由。对我来说,数据看起来很好,它几乎总是有效,但我还是得到了这个错误。你有什么想法可能是什么问题吗?

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    如果您使用空断言运算符!,则应确保所有可空类型的表达式都不为空。

    The null assertion operator (!)

    如果您确定具有可空类型的表达式不为空,您 可以使用空断言运算符 (!) 让 Dart 将其视为 不可为空。通过添加 !就在表达式之后,你告诉 Dart 该值不会为空,并且可以安全地将其分配给 不可为空的变量。

    请注意文档中的以下几行:

    如果你错了,Dart 会在运行时抛出异常。这使得 !运算符不安全,所以除非你非常确定,否则不要使用它 表达式不为空。

    不好❌

    int? number;
    
    print(number! > 0);
    

    好✅

    int? number;
    
    if(number != null) {
       print(number > 0);
    }
    

    我建议您检查leistungData 是否为空,并使用CircularProgressIndicator 显示加载状态以防它为空:

    @override
    Widget build(BuildContext context) {
      if (leistungData == null || leistungData?.unterscheidungsData == null) {
        return CircularProgressIndicator();
      }
    
      return ListView.builder(
        itemCount: leistungData!.unterscheidungsData!.length,
        itemBuilder: (context, index) => GestureDetector(
          onTap: () {
            Navigator.push(
              context,
              MaterialPageRoute(
                builder: (context) => AutoProbleme(
                  variantData: variantData,
                  unterscheidungsData: leistungData!.unterscheidungsData![index],
                  modell: modell,
                  modelData: modelData,
                ),
              ),
            );
          },
          child: Container(
            margin: EdgeInsets.all(10),
            height: MediaQuery.of(context).size.height * 0.05,
            width: MediaQuery.of(context).size.width * 0.9,
            child: Align(
              alignment: Alignment.center,
              child: Text(
                leistungData!.unterscheidungsData![index]?.difference ?? '',
                textScaleFactor: 1.4,
              ),
            ),
            decoration: BoxDecoration(
              color: Colors.white,
              borderRadius: BorderRadius.circular(16),
            ),
          ),
        ),
      );
    }
    

    【讨论】:

    • 谢谢你会尝试找出错误被触发的原因)
    【解决方案2】:

    当非空运算符用于空值时会出现此错误

    int? data;
    
    
    void main() {
      print(data!.value); 
    }
    

    如果数据值没有赋值,上面的代码会报错。

    解决方案:

    ?. 运算符用于检查 null 值,?? 用于在给定值为 null 时提供默认值

     int? data;
        
        
        void main() {
          print(data?.value ?? "Default Value"); 
        }
    

    【讨论】:

    • 感谢您的回答,我明白了,但是您知道在这种情况下触发的原因吗?
    • 您的值之一为空,请检查!。调试模式下的操作符,或者提供不同的默认值,你会知道的
    • @Nikita 从堆栈跟踪中识别触发错误的行。从那里,找出哪个变量为空。从那里向后工作以找出它是空的。
    • 谢谢你试试
    • @Nikita:如果它适合你,你能接受答案吗?
    猜你喜欢
    • 2021-12-03
    • 2021-01-24
    • 2022-07-06
    • 2021-08-10
    • 2022-01-18
    • 2021-08-13
    • 2021-08-04
    • 2021-07-09
    • 2021-04-29
    相关资源
    最近更新 更多