我有一个代码如下:
var book = Provider.of<Book>(context, listen: false);
ElevatedButton(
onPressed: () async {
FilePickerResult? result = await FilePicker.platform
.pickFiles(
allowMultiple: false, type: FileType.image
);
if (result != null) {
uploadImageURL = await s3URLGet(); // Gets a URL
await s3FileUpload(uploadImageURL!, result); // Uploads the file
setState(() {
print(
'this is upload url ${uploadImageURL!}'); // It works and prints out a correct URL
book.images?[book.imageIndex].imageUrl =
uploadImageURL!; //This doesn't work
});
print(' this is what uploaded ${book.images?[book.imageIndex].imageUrl}'); // Prints out null
}
},子级:文本('上载图像'),),
我不知道为什么它不能在这里赋值变量?
book.images?[book.imageIndex].imageUrl = uploadImageURL!;
这些是相关的类:
class Book with ChangeNotifier {
List<BookImage>? images;
int imageIndex = 0;
changeImageIndex(int index) {
imageIndex = index;
notifyListeners();
}
}
class BookImage {
String? imageUrl;
}
我还发现问题出在List
成员上。例如,如果我这样做:
book.imageIndex = 100;
成功了
1条答案
按热度按时间ovfsdjhp1#
正如评论和聊天中所讨论的,您拥有:
但是如果
book.images
是null
,那么表达式将被短路,并且?
之后的所有内容都将被忽略。正如您的注解所示,您从未向
book.images
分配任何内容,因此它将 * 始终 * 为null
。即使我像
List<BookImage>? images = [];
一样修改类定义,它仍然不起作用!这仍然不起作用,因为即使
book.images
不再是null
,它现在仍然是一个 emptyList
。访问List
中不存在的元素不会自动增长List
,也不会自动示例化一个元素(BookImage
)。必须显式地示例化每个
BookImage
对象,并且必须显式地将其添加到book.images
列表中,如果您的目标是在使用FilePicker
完成onPressed
处理程序之后执行此操作,那么您的逻辑似乎有点落后;与其确定索引并尝试在该索引处创建BookImage
对象,不如创建并添加BookImage
对象,然后确定刚刚添加的元素的索引。请注意,如果您将
book.images
更改为不可空(并将其初始化为空List
),并且添加了BookImage
构造函数,则上述内容可以简化为book.images.add(BookImage(uploadImageURL!))
。