【问题标题】:Flutter - The getter 'length' was called on nullFlutter - 在 null 上调用了 getter 'length'
【发布时间】:2023-03-08 22:55:02
【问题描述】:

我正在尝试开发一个颤振应用程序。这种颤动正在为纸牌游戏创建团队。组队创建后,可以通过积分进行统计,不用去想每个人有多少分。

但是我遇到了一个异常,我知道异常在哪里以及它的含义,但我不知道如何解决这个问题。我希望你们中的一些人可以帮助我。

这是引发错误的代码:

import 'package:flutter/material.dart';


class Punktezaehler extends StatefulWidget{

  final List<String> spieler_namen;
  Punktezaehler(this.spieler_namen);

  @override
  State<StatefulWidget> createState() => new _Punktezaehler(this.spieler_namen);
}


class _Punktezaehler extends State<Punktezaehler>{

  final List<String> spieler_namen;
  _Punktezaehler(this.spieler_namen);

  List<int> punkteanzahl_teamEins;
  List<int> punkteanzahl_teamZwei;

  @override
  Widget build(BuildContext context) {


    var spieler1 = spieler_namen[0].substring(0,3);
    var spieler2 = spieler_namen[1].substring(0,3);
    var spieler3 = spieler_namen[2].substring(0,3);
    var spieler4 = spieler_namen[3].substring(0,3);

    return new Scaffold(
      appBar: new AppBar(
        automaticallyImplyLeading: false,
        title: new Text("$spieler1 & $spieler2 vs" +" $spieler3 & $spieler4"),
        actions: <Widget>[

        ],
      ),
      body: Container(
        child: new Row(
          children: <Widget>[
            new Column(
              children: <Widget>[
                new IconButton(
                    icon: Icon(Icons.exposure_plus_2),
                    onPressed: () => punkte_hinzuzaehlen(1, 2)
                )
              ],
            ),
            new Column(
              children: <Widget>[
                //new FlatButton(onPressed: () => print(punkteanzahl_teamEins.length), child: new Text("Punkte")),
                ListView.builder(
                  itemCount: punkteanzahl_teamEins.length, //--> Error is thrown here
                  itemBuilder: (context, index){
                    return Text(punkteanzahl_teamEins[index].toString());
                  }
                ),
                new Row()
              ],
            ),
            new Column(
              children: <Widget>[
                new IconButton(
                    icon: Icon(Icons.exposure_plus_2),
                    onPressed: () => punkte_hinzuzaehlen(2, 2)
                )],
            )
          ],
        )
      ),
    );
  }

  void punkte_hinzuzaehlen(int team, int nummer){
    if (team == 1){
      //Team 1 bekommt die Punkte
      print("Team 1 gets points");
    }
    else if(team == 2){
      //Team 2 bekommt die Punkte
      print("Team 2 gets points");
    }
  }
}

这是错误信息:

══╡ EXCEPTION CAUGHT BY GESTURE ╞═══════════════════════════════════════════════════════════════════
I/flutter (26028): The following NoSuchMethodError was thrown while handling a gesture:
I/flutter (26028): The getter 'length' was called on null.
I/flutter (26028): Receiver: null
I/flutter (26028): Tried calling: length

修复后,我得到另一个错误:

══╡ EXCEPTION CAUGHT BY RENDERING LIBRARY ╞═════════════════════════════════════════════════════════
I/flutter (26028): The following assertion was thrown during performResize():
I/flutter (26028): Vertical viewport was given unbounded width.
I/flutter (26028): Viewports expand in the cross axis to fill their container and constrain their children to match
I/flutter (26028): their extent in the cross axis. In this case, a vertical viewport was given an unlimited amount of
I/flutter (26028): horizontal space in which to expand.

【问题讨论】:

  • 它可能在您的列表punkteanzahl_teamEins 填充数据长度之前被调用。解决方案是在数据进入时对其进行初始化或显示一些进度指示器

标签: android ios list flutter dart


【解决方案1】:

punkteanzahl_teamEins 仅被声明。但未初始化。所以它会抛出空错误。

你应该给punkteanzahl_teamEins赋值

List<int> punkteanzahl_teamEins = [1,4,5,7];

或根据要求从父级传递数据。

【讨论】:

  • Kepp 记住你可以初始化 emty list List&lt;int&gt; punkteanzahl_teamEins = []
  • 修复后我收到另一个错误消息:渲染库发现异常。如上所述
  • 试试这个:将你的容器包裹在 SingleChildScrollView 中并设置水平滚动方向。
  • 或者你也可以用空数组初始化。
【解决方案2】:

当我们尝试在null-objects 上发送或调用值、方法和属性时会发生这种情况

对我来说,当我尝试在 http 请求中发送 null 值时,会出现此问题,flutter 会自动转换为字符串。这就是它给出错误的原因

为避免这种情况,首先检查它不是null,然后使用它,这是怎么做的

Dart 提供了一个 ?.?? 运算符用于空检查

??的使用

var result = anyValue ?? ""; 

使用?.

itemCount: punkteanzahl_teamEins?.length,

 
// To use more ways

1) final value = myObject?.someProperty.value;

2) var result = myObject?.someProperty.value ?? ""

【讨论】:

    【解决方案3】:

    我们花了很多时间来解决问题,最后我们得到了一个解决方案:请检查您 pubspec.yaml 并删除资产文件中多余的“-”,并请遵循该文件的结构比如间距等等。

    我们必须确保该问题仅存在于 pubspec.yaml 文件中

    【讨论】:

      【解决方案4】:

      第一个检查 spieler_namen 是否为空。如果为空,请使用下面的代码,我希望这能解决您的问题.....

      if(spieler_namen == null){
        new Container(width: 10.0,height:  10.0,);
       }else{
       your requirement .......
       }
      

      【讨论】:

        【解决方案5】:

        在我们的例子中,我们在调用 webservice 后 Internet 连接关闭时收到此错误。

        【讨论】:

        • 我对 AudioPlayer 库有同样的问题。然后我发现音频链接id无效。
        【解决方案6】:

        初始化您的列表,然后运行热重启(按R)。

        它工作正常。

        【讨论】:

          【解决方案7】:

          我通过重新访问 pubspec.yaml 中的此部分来解决此问题

          # To add assets to your application, add an assets section, like this:
          # assets:
          #  - images/a_dot_burr.jpeg
          #  - images/a_dot_ham.jpeg
          

          确保您的间距、连字符和文件名正确。 注意:您不需要列出每个图像文件;相反,您可以只列出他们的目录:

          assets:
          - images/
          

          【讨论】:

            猜你喜欢
            • 2021-08-11
            • 2021-12-10
            • 2021-05-25
            • 2020-10-12
            • 1970-01-01
            • 1970-01-01
            • 2021-07-21
            • 1970-01-01
            相关资源
            最近更新 更多