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]
.
也得到
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 的类型参数。并使用 !
运算符
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]
.