dart snapshot.data[0] throwing“无法无条件调用方法“[ ]”,因为接收器可以为“null”

osh3o9ms  于 2023-07-31  发布在  其他
关注(0)|答案(3)|浏览(106)

也得到

Try making the call condtional (using ?.) or adding a null check to the target

字符串
对于同一行:

Text("${snapshot.data[index]}")


如果我这样做,我只得到标题的错误消息。
我实际上已经从我的另一个项目中复制/粘贴了一个FutureBuilder,它工作得很好,但在这个项目中,我得到了这个错误。唯一的区别是,在不工作的项目中,我看到了这一点:

AsyncSnapshot<Object?>


and in the working加工project项目I see this:

AsyncSnapshot<dynamic>


如果鼠标悬停在snapshot
整个部分看起来像这样:

FutureBuilder(
          future: http_functions.myAsyncFunction(),
          builder: (context, snapshot) {
            return snapshot.hasData
                ? Scrollbar(
                    controller: _scrollController,
                    isAlwaysShown: true,
                    thickness: 4,
                    child: ListView.builder(
                      physics: const AlwaysScrollableScrollPhysics(),
                      shrinkWrap: true,
                      controller: _scrollController,
                      itemCount: 10,
                      itemBuilder: (context, index) {
                        return Card(
                          child: ListTile(
                            title: Text("${snapshot.data[index]}"),
                          ),
                        );
                      },
                    ),
                  )
                : const CircularProgressIndicator();
          },
        )


myAsyncFunction()使用return json.decode(response.body);返回List<dynamic>

l2osamch

l2osamch1#

您需要定义FutureBuilder的类型参数。并snapshot.data使用!运算符将www.example.com强制转换为非空

FutureBuilder<List<dynamic>>(
          future: http_functions.myAsyncFunction(),
          builder: (context, snapshot) {
            return snapshot.hasData
                ? Scrollbar(
                    controller: _scrollController,
                    isAlwaysShown: true,
                    thickness: 4,
                    child: ListView.builder(
                      physics: const AlwaysScrollableScrollPhysics(),
                      shrinkWrap: true,
                      controller: _scrollController,
                      itemCount: 10,
                      itemBuilder: (context, index) {
                        return Card(
                          child: ListTile(
                            title: Text("${snapshot.data![index]}"),
                          ),
                        );
                      },
                    ),
                  )
                : const CircularProgressIndicator();
          },
        )

字符串

ruarlubt

ruarlubt2#

AsyncSnapshot<Object?>中,对象是可空的,这意味着它可以有一个值,也可以是null。现在您正在访问像snapshot.data[index]这样的对象。这里snapshot.data可以为null,访问null数组的索引可能会导致错误。
因此,为了安全地访问您的数组,请将snapshot.data[index]替换为snapshot.data?[index] ?? '',或者如果您确定您的列表不能为空snapshot.data![index],则可以像这样使用nullAssert操作符。

icomxhvb

icomxhvb3#

使用snapshot.data?.docs?[0].data()。如果不为null,则返回值,否则返回null。

相关问题