【问题标题】:The method '[]' can't be unconditionally invoked because the receiver can be 'null'. (flutter)无法无条件调用方法“[]”,因为接收者可以为“null”。 (扑)
【发布时间】:2021-10-05 05:13:20
【问题描述】:

我正在使用具有两次下载的 FutureBuilder,并将每个索引放在一个列表中以在我的应用程序中加载/显示它们。使用 null 安全存在错误:

不能无条件调用方法“[]”,因为接收者可以为“null”。

尝试使调用有条件(使用'?.')或向目标添加空检查('!')。

如何解决快照 (snapshot.data[0]) 中的这个错误?感谢您的帮助。

          FutureBuilder(
            future: Future.wait([downloadsuche(), downloadsuchvorschlag()]),
            builder: (context, snapshot) {
              if (snapshot.hasData) {
                //List<AdressSuche> adresse = snapshot.data;

                List<AdressSuche> adresse = snapshot.data[0];
                List<AdressSuche> sv1 = snapshot.data[1];

                return IconButton(
                  icon: const Icon(Icons.search),
                  onPressed: () {
                    showSearch(context: context, delegate: DataSearch(adresse, sv1));
                  },
                );
              } else if (snapshot.hasError) {
                return IconButton(icon: const Icon(Icons.search), onPressed: () {});
                //return RefreshIndicator(onRefresh: _refreshdata, child: Center(child: CircularProgressIndicator()));
              }
              return IconButton(icon: const Icon(Icons.search), onPressed: () {});
            },
          ),

【问题讨论】:

    标签: flutter dart dart-null-safety


    【解决方案1】:

    替换

    List<AdressSuche> adresse = snapshot.data[0];
    List<AdressSuche> sv1 = snapshot.data[1];
    

    var adresse = (snapshot.data as List)[0] as List<AdressSuche>;
    var sv1 = (snapshot.data as List)[1] as List<AdressSuche>;
    

    【讨论】:

    • 为什么不只是snapshot.data![0]
    • @PatrickMahomes snapshot.data! 返回一个 Object 并且您不能在其上使用 [] 运算符。
    • 谢谢。代码没有错误。我必须在编译后测试函数。但仍有很多零安全问题需要解决。
    【解决方案2】:

    替换

    List<AdressSuche> adresse = snapshot.data[0];
    List<AdressSuche> sv1 = snapshot.data[1];
    

    var list = snapshot.data! as List;
    
    List<dynamic> adresse = list[0];
    List<dynamic> sv1 = list[1];
    

    【讨论】:

    • 这行不通,因为snapshot.data 返回Object?,并且你不能在Object 上使用[] 运算符,并且Dart 为空安全。
    • 对不起! @copsOnRoad,我认为问题仅在于空安全性。我编辑了我的答案,所以请检查一下
    • 谢谢。代码没有错误。我必须在编译后测试函数。但仍有很多零安全问题需要解决。
    • @CopsOnRoad 我用你的答案作为参考(因为我不擅长写作),但我添加了空安全处理,因为这是问题提供的问题。顺便说一句,你也不赞成我的回答哈哈哈
    【解决方案3】:

    只需添加“!”在snapshot.data 之后作为snapshot.data 可能为空。

    FutureBuilder(
                future: Future.wait([downloadsuche(), downloadsuchvorschlag()]),
                builder: (context, snapshot) {
                  if (snapshot.hasData) {
                    //List<AdressSuche> adresse = snapshot.data!;
    
                    List<AdressSuche> adresse = snapshot.data![0]; //add '!' over here
                    List<AdressSuche> sv1 = snapshot.data![1];  // and here
    
                    return IconButton(
                      icon: const Icon(Icons.search),
                      onPressed: () {
                        showSearch(context: context, delegate: DataSearch(adresse, sv1));
                      },
                    );
                  } else if (snapshot.hasError) {
                    return IconButton(icon: const Icon(Icons.search), onPressed: () {});
                    //return RefreshIndicator(onRefresh: _refreshdata, child: Center(child: CircularProgressIndicator()));
                  }
                  return IconButton(icon: const Icon(Icons.search), onPressed: () {});
                },
              ),
    

    【讨论】:

    • 已经试过了。结果:没有为“对象”类型定义运算符“[]”。
    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 2021-09-18
    • 2021-09-05
    • 2021-08-27
    • 1970-01-01
    相关资源
    最近更新 更多