diff --git a/lib/generators/model_code_generator.dart b/lib/generators/model_code_generator.dart index ebd4061..f473f8a 100644 --- a/lib/generators/model_code_generator.dart +++ b/lib/generators/model_code_generator.dart @@ -85,8 +85,15 @@ class ModelCodeGenerator extends ModelGenerator { // 生成属性 model.properties.forEach((propName, property) { final dartType = getDartPropertyType(property); - // 根据文档判断是否可空:只有显式标记为 nullable: true 的才可空 - final nullable = property.nullable ? '?' : ''; + // 判断是否可空: + // 1. String 类型(非 date-time/date)强制为非空,忽略 Swagger 的 nullable 标记 + // 2. 如果有 defaultValue,则不可空(因为 json_annotation 会保证有值) + // 3. 否则根据 nullable 标记决定 + final isNormalString = property.type == PropertyType.string && + property.format != 'date-time' && + property.format != 'date'; + final hasDefaultValue = property.defaultValue != null || isNormalString; + final nullable = hasDefaultValue ? '' : (property.nullable ? '?' : ''); final dartPropName = StringUtils.toDartPropertyName(propName); if (property.description.isNotEmpty) { @@ -113,8 +120,14 @@ class ModelCodeGenerator extends ModelGenerator { buffer.writeln(' const $className({'); model.properties.forEach((propName, property) { final dartPropName = StringUtils.toDartPropertyName(propName); - // 对于非可空属性,必须添加 required 修饰符 - final shouldBeRequired = !property.nullable; + // 判断是否需要 required 修饰符: + // 1. String 类型(非 date-time/date)强制需要 required,忽略 Swagger 的 nullable 标记 + // 2. 其他非可空字段需要 required + // 3. 可空字段不需要 required + final isNormalString = property.type == PropertyType.string && + property.format != 'date-time' && + property.format != 'date'; + final shouldBeRequired = isNormalString || !property.nullable; final required = shouldBeRequired ? 'required ' : ''; buffer.writeln(' ${required}this.$dartPropName,'); }); @@ -303,8 +316,15 @@ class ModelCodeGenerator extends ModelGenerator { // 生成属性 model.properties.forEach((propName, property) { final dartType = getDartPropertyType(property); - // 根据文档判断是否可空:只有显式标记为 nullable: true 的才可空 - final nullable = property.nullable ? '?' : ''; + // 判断是否可空: + // 1. String 类型(非 date-time/date)强制为非空,忽略 Swagger 的 nullable 标记 + // 2. 如果有 defaultValue,则不可空(因为 json_annotation 会保证有值) + // 3. 否则根据 nullable 标记决定 + final isNormalString = property.type == PropertyType.string && + property.format != 'date-time' && + property.format != 'date'; + final hasDefaultValue = property.defaultValue != null || isNormalString; + final nullable = hasDefaultValue ? '' : (property.nullable ? '?' : ''); final dartPropName = StringUtils.toDartPropertyName(propName); if (property.description.isNotEmpty) { @@ -331,8 +351,14 @@ class ModelCodeGenerator extends ModelGenerator { buffer.writeln(' const $className({'); model.properties.forEach((propName, property) { final dartPropName = StringUtils.toDartPropertyName(propName); - // 对于非可空属性,必须添加 required 修饰符 - final shouldBeRequired = !property.nullable; + // 判断是否需要 required 修饰符: + // 1. String 类型(非 date-time/date)强制需要 required,忽略 Swagger 的 nullable 标记 + // 2. 其他非可空字段需要 required + // 3. 可空字段不需要 required + final isNormalString = property.type == PropertyType.string && + property.format != 'date-time' && + property.format != 'date'; + final shouldBeRequired = isNormalString || !property.nullable; final required = shouldBeRequired ? 'required ' : ''; buffer.writeln(' ${required}this.$dartPropName,'); }); @@ -388,6 +414,21 @@ class ModelCodeGenerator extends ModelGenerator { annotations.add('name: \'$propName\''); } + // String类型默认值处理 + if (property.type == PropertyType.string && + property.format != 'date-time' && + property.format != 'date') { + // 为String类型添加默认值为空字符串 + if (property.defaultValue != null) { + // 如果OpenAPI文档中有明确的默认值,使用它 + final defaultVal = property.defaultValue.toString(); + annotations.add('defaultValue: \'$defaultVal\''); + } else { + // 如果没有默认值,使用空字符串作为默认值 + annotations.add('defaultValue: \'\''); + } + } + // DateTime类型需要特殊处理 if (property.type == PropertyType.string && (property.format == 'date-time' || property.format == 'date')) { @@ -395,6 +436,20 @@ class ModelCodeGenerator extends ModelGenerator { // annotations.add('fromJson: DateTime.parse, toJson: _dateTimeToString'); } + // 其他类型的默认值处理 + if (property.type != PropertyType.string && property.defaultValue != null) { + final defaultVal = property.defaultValue; + if (property.type == PropertyType.integer || + property.type == PropertyType.number) { + annotations.add('defaultValue: $defaultVal'); + } else if (property.type == PropertyType.boolean) { + annotations.add('defaultValue: $defaultVal'); + } else { + // 对于其他类型,将默认值作为字符串处理 + annotations.add('defaultValue: \'$defaultVal\''); + } + } + // 枚举类型的处理 if (property.type == PropertyType.reference) { // 检查是否是枚举类型(这里需要更复杂的逻辑来判断)