问题
我目前正在学习Flutter,熟悉TS.虽然Flutter/Dart以强类型而闻名,但我在试图缩小可空类型(这在TS中是可能的)时遇到了困难.
具体地说,我使用了FutureBuilder
和一个Rocc函数来获取数据,并try 基于这些数据构建小部件.为了简洁起见,数据是List<{ path: String, ... }>
.但是,我无法访问snapshot.data
:
我的方法看起来很蠢.我查了一下文档,我找到的最接近的解决方案是type promotion,但我相信这不是我想要的.
代码
child: FutureBuilder(
future: _selectedImages,
builder: (context, snapshot) {
// error: dart(unchecked_use_of_nullable_value)
if (snapshot.hasData) {
log(snapshot.data[0].path);
}
// error: dart(unchecked_use_of_nullable_value)
if (snapshot.hasData && snapshot.data.isNotEmpty) {
log(snapshot.data[0].path);
}
// this works
if (snapshot.hasData) {
final tmp = snapshot.data?[0].path;
if (tmp != null) {
log(tmp);
}
}
},
),
编辑@ pskink
我相信我涵盖了所有的 case ,为什么错误仍然弹出,你知道为什么吗?
// this works
// builder: ((context, snapshot) =>
// switch ((snapshot.connectionState, snapshot.data)) {
// // TODO: Handle this case.
// (ConnectionState.none, _) =>
// Text('null ${snapshot.data.toString()}'),
// (ConnectionState.waiting, _) => const Text('text'),
// (ConnectionState.active, _) => const Text('text'),
// (ConnectionState.done, null) => const Text('text'),
// (ConnectionState.done, final data?) => const Text('text'),
// }),
builder: (context, snapshot) {
switch ((snapshot.connectionState, snapshot.data)) {
case (ConnectionState.none, _):
return Text('null ${snapshot.data.toString()}');
case (ConnectionState.waiting, _):
return const Text('text');
case (ConnectionState.active, _):
return const Text('text');
case (ConnectionState.done, null):
return const Text('text');
case (ConnectionState.done, final data?):
return const Text('text');
// no error if have this
// default:
// return const Text('text');
}
}