dart 如何在Flutter中为“List“成员分配一个新变量< Class>?

k97glaaz  于 2023-03-10  发布在  Flutter
关注(0)|答案(1)|浏览(150)

我有一个代码如下:

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;

成功了

ovfsdjhp

ovfsdjhp1#

正如评论和聊天中所讨论的,您拥有:

book.images?[book.imageIndex].imageUrl = uploadImageURL!;

但是如果book.imagesnull,那么表达式将被短路,并且?之后的所有内容都将被忽略。
正如您的注解所示,您从未向book.images分配任何内容,因此它将 * 始终 * 为null
即使我像List<BookImage>? images = [];一样修改类定义,它仍然不起作用!
这仍然不起作用,因为即使book.images不再是null,它现在仍然是一个 emptyList。访问List中不存在的元素不会自动增长List,也不会自动示例化一个元素(BookImage)。
必须显式地示例化每个BookImage对象,并且必须显式地将其添加到book.images列表中,如果您的目标是在使用FilePicker完成onPressed处理程序之后执行此操作,那么您的逻辑似乎有点落后;与其确定索引并尝试在该索引处创建BookImage对象,不如创建并添加BookImage对象,然后确定刚刚添加的元素的索引。

var bookImage = BookImage()..imageurl = uploadImageURL!;
(book.images ??= []).add(bookImage);

请注意,如果您将book.images更改为不可空(并将其初始化为空List),并且添加了BookImage构造函数,则上述内容可以简化为book.images.add(BookImage(uploadImageURL!))

相关问题