参数类型 'List<Slots?>?' 无法分配给参数类型 'List<Slots>?'

The argument type 'List<Slots?>?' can't be assigned to the parameter type 'List<Slots>?'

我最近将我的代码迁移到空安全。在 dart migrate 命令中出现以下错误。

无法将参数类型 'List<Slots?>?' 分配给 lib/responsemodels/appointment/calendar/calendar_response 处的参数类型 'List?'。g.dart:17:5

突出显示下面的错误抛出行

calendar_response.dart

// GENERATED CODE - DO NOT MODIFY BY HAND

part of 'calendar_response.dart';

// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************

CalenderResponse _$CalenderResponseFromJson(Map<String, dynamic> json) {
  return CalenderResponse(
    json['createdAt'] as String?,
    json['dayInWeek'] as String?,
    json['isHavingSlot'] as String?,
    json['message'] as String?,
    json['schedulerId'] as String?,
    json['selectedDate'] as String?,
    **(json['slotTimings'] as List?)
        ?.map(
            (e) => e == null ? null : Slots.fromJson(e as Map<String, dynamic>))
        ?.toList(),**
    json['status'] as String?,
    json['updatedAt'] as String?,
    json['currenttime'] as String?,
  );
}

CalenderAvailableDatesResponse _$CalenderAvailableDatesResponseFromJson(
    Map<String, dynamic> json) {
  return CalenderAvailableDatesResponse(
      (json['dateList'] as List?)?.map((e) => e as String).toList(),
      json['message'] as String?,
      json['status'] as String?,
      json['currenttime'] as String?);
}

slots_response.dart

import 'package:json_annotation/json_annotation.dart';

part 'slots_response.g.dart';

@JsonSerializable(createToJson: false)
class SlotsResponse {
  final String? status;
  final String? message;
  final List<SlotsGroups>? availableGroups;
  SlotsResponse(this.availableGroups, this.message, this.status);

  factory SlotsResponse.fromJson(Map<String, dynamic> map) =>
      _$SlotsResponseFromJson(map);
}

@JsonSerializable(createToJson: false)
class SlotsGroups {
  final String? groupId;
  final String? vendorId;
  final String? groupName;
  final String? status;
  final String? createdAt;
  final String? updatedAt;
  final List<Slots>? availSlots;

  SlotsGroups(this.availSlots, this.createdAt, this.groupId, this.groupName,
      this.status, this.updatedAt, this.vendorId);

  factory SlotsGroups.fromJson(Map<String, dynamic> map) =>
      _$SlotsGroupsFromJson(map);
}

@JsonSerializable(createToJson: false)
class Slots {
  late final String? slotId;
  late final String? startTime;
  late final String? endTime;
  late final String? duration;
  late final String? startDateStrTime;
  late final String? endDateStrTime;
  late final String? stGivenString;
  late final String? endGivenString;
  late final String? status;
  late final String? createdAt;
  late final String? updatedAt;
  late final String? isAnyAppointment;
  late final BookingDetails? bookingDetails;

  Slots(
      this.createdAt,
      this.duration,
      this.endDateStrTime,
      this.endGivenString,
      this.endTime,
      this.slotId,
      this.stGivenString,
      this.bookingDetails,
      this.isAnyAppointment,
      this.startDateStrTime,
      this.startTime,
      this.status,
      this.updatedAt);

  factory Slots.fromJson(Map<String, dynamic> map) => _$SlotsFromJson(map);
}

@JsonSerializable(createToJson: false)
class BookingDetails {
  final String? customerName;
  final String? serviceName;

  BookingDetails(this.customerName, this.serviceName);

  factory BookingDetails.fromJson(Map<String, dynamic> map) =>
      _$BookingDetailsFromJson(map);
}

calendar_response.dart

import 'package:awomowa/responsemodels/appointment/slots/slots_response.dart';
import 'package:json_annotation/json_annotation.dart';

part 'calendar_response.g.dart';

@JsonSerializable(createToJson: false)
class CalenderResponse {
  final String? status;
  final String? message;
  final String? isHavingSlot;
  final String? schedulerId;

  final String? dayInWeek;
  final String? selectedDate;
  final String? createdAt;
  final String? updatedAt;
  final List<Slots>? slotTimings;
  final String? currenttime;
  
  CalenderResponse(
      this.createdAt,
      this.dayInWeek,
      this.isHavingSlot,
      this.message,
      this.schedulerId,
      this.selectedDate,
      this.slotTimings,
      this.status,
      this.updatedAt,
      this.currenttime);

  factory CalenderResponse.fromJson(Map<String, dynamic> map) =>
      _$CalenderResponseFromJson(map);
}

@JsonSerializable(createToJson: false)
class CalenderAvailableDatesResponse {
  final String? status;
  final String? message;
  final List<String>? dateList;
  final String? currenttime;

  CalenderAvailableDatesResponse(this.dateList, this.message, this.status,this.currenttime);
  factory CalenderAvailableDatesResponse.fromJson(Map<String, dynamic> map) =>
      _$CalenderAvailableDatesResponseFromJson(map);
}

问题是map中使用的函数可以returnnull。换句话说:它的 return 类型是 Slots?,而不是 Slots.

要解决它,您可以从列表中过滤掉空值,将列表从 List<Slots?> 变成 List<Slots>,就像这样

(json['slotTimings'] as List?)
    ?.map(
        (e) => e == null ? null : Slots.fromJson(e as Map<String, dynamic>))
    .whereType<Slots>().toList(),

我假设您正在使用 json_annotationjson_serializablebuild_runner。正如在 **.g 文件中指定的那样。

// GENERATED CODE - DO NOT MODIFY BY HAND

您应该修改您的 模型 文件以适应那里的 issue/situation 然后 运行:
flutter pub run build_runner build

flutter pub run build_runner build --delete-conflicting-outputs