snapshot.data[0] 抛出“无法无条件调用方法'[]',因为接收者可以是'null'

snapshot.data[0] throwing "The Method '[ ]' cannot be unconditionally invoked because the receiver can be 'null'

也得到

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

对于同一行:

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

如果这样做,我只会收到标题中的错误消息。

我实际上有 copy/pasted 来自我的另一个项目的 FutureBuilder,它工作得很好,但在这个项目中我得到了这个错误。唯一的区别是在不工作的项目中我看到了这个:

AsyncSnapshot<Object?>

在工作项目中我看到了这个:

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

While myAsyncFunction() returns a List<dynamic> using return json.decode(response.body);

您需要定义FutureBuilder 的类型参数。并使用 ! 运算符

将 snapshot.data 转换为非空
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();
          },
        )

此时使用snapshot.data![index]强制它不为空。

AsyncSnapshot<Object?> 中,对象可以为空,这意味着它可以有一个值或可以为空。现在您正在访问 snapshot.data[index] 之类的对象。这里 snapshot.data 可以为空,访问空数组的索引可能会导致错误。

因此,为了安全地访问您的数组,请将 snapshot.data[index] 替换为 snapshot.data?[index] ?? '' 或者如果您确定您的列表不能为空,则可以使用这样的空断言运算符 snapshot.data![index].