类型 'List<dynamic>' 不是类型 'List<Attachment>' 的子类型

type 'List<dynamic>' is not a subtype of type 'List<Attachment>'

我为此使用 flutter form builder to get image with camera/gallery and then I want to attach them to an email(I use mailer)但是当我尝试发送电子邮件时出现以下错误:

type 'List< dynamic >' is not a subtype of type 'List< Attachment >'

有没有办法将动态列表转换为附件列表?

这是我的代码:

我使用 FormBuilderImagePicker 小部件获取图像:

FormBuilderImagePicker(
 attribute: 'image',
 onChanged: (value) {
  _attachments.add(value);
  debugPrint('attachments: $_attachments');
},
maxImages: 3,
defaultImage:
AssetImage('assets/images/icons8-plus-64.png'),
validators: [
 FormBuilderValidators.required(),
],
),

这是我发送电子邮件的代码:

  void sendEmailWithoutPosition(
  String name,
  String destination,
  String subject,
  String description,
  String email,
  String number,
  List<Attachment> attachments,
  BuildContext context) async {
message = Message()
  ..from = Address(username, name)
  ..recipients.add(destination)
  ..subject = ' Petiție ${subject.toString()} - aplicația e-Rădăuți'
  ..html = 'Către, ${destination.toString()} <br><br> Stimată doamnă/ Stimate domn,'
      '<br><br>Subsemnatul ${name.toString()}, vă supun atenției următoarea problemă:<br><br>'
      '$description<br><br>În conformitate cu atribuțiile pe care le aveți, vă rog să luați'
      ' măsurile ce se impun.<br><br>'
      'Prezenta sesizare reprezintă o petiție în sensul O.G. nr. 27/2002 privind activitatea de soluționare a petițiilor și '
      'a fost transmisă prin intermediul aplicației mobile e-Rădăuți, dezvoltată'
      ' de Ascociația Rădăuțiul Civic, prin funcționalitatea „Sesizează o problemă”.<br><br>'
      'Vă rog să îmi transmiteți răspunsul în termenul legal la adresa $email'
      '.<br><br>Cu stimă,<br><br>'
      '     $name<br><br>     Tel: $number/$email'
  ..attachments.addAll(attachments);
tryToSendEmail(message);
}

Future<bool> tryToSendEmail(var message) async {
final smtpServer = gmail(username, password);
try {
  final sendReport = await send(message, smtpServer);
  debugPrint('Message sent: ' + sendReport.toString());
} on MailerException catch (e) {
  print('Message not sent.');
  for (var p in e.problems) {
    print('Problem: ${p.code}: ${p.msg}');
  }
}
}

我尝试使用此代码映射列表:

List<Attachment> listAttachments = _attachments
                            .map((e) => e as Attachment)
                            .toList();
                        List<Attachment> listAttachmentsNew =
                            listAttachments.cast<Attachment>();

但现在我收到以下错误:

通过更深入地研究包的结构,我建议您使用构造函数:附件是一个抽象 class,它不能被简单地强制转换。根据您可以执行的附件类型:

//FOR FILE ATTACHMENTS
List<Attachment> listAttachments = _attachments.map((e) => FileAttachment(e.file)).toList();
//FOR STRING ATTACHMENTS
List<Attachment> listAttachments = _attachments.map((e) => StringAttachment(e.data)).toList();

显然根据您的数据调整代码。 要更好地了解这些 class 的结构,请查看此页面:Attachment class github reference

更新: 我查看了您正在使用的库,但它缺少文档。不要使用 onChanged,请尝试使用 onImage。这样,每次选择图像时,您都应该获得所需的数据。

我认为您应该传递 List<dynamic> 附件而不是 List<Attachment>。试试看。