amplify-codegen
amplify-codegen copied to clipboard
fix: add a type for null safety
Description of changes
If you apply null safety, flutter model is created incorrectly.
Flutter (Channel stable, 3.7.9, on macOS 13.2.1 22D68 darwin-x64, locale ko-KR) Dart SDK version: 2.19.6 (stable) (Tue Mar 28 13:41:04 2023 +0000) on "macos_x64"
/*
* Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file. This file is distributed
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
// NOTE: This file is generated and may not follow lint rules defined in your app
// Generated files can be excluded from analysis in analysis_options.yaml
// For more info, see: https://dart.dev/guides/language/analysis-options#excluding-code-from-analysis
// ignore_for_file: public_member_api_docs, annotate_overrides, dead_code, dead_codepublic_member_api_docs, depend_on_referenced_packages, file_names, library_private_types_in_public_api, no_leading_underscores_for_library_prefixes, no_leading_underscores_for_local_identifiers, non_constant_identifier_names, null_check_on_nullable_type_parameter, prefer_adjacent_string_concatenation, prefer_const_constructors, prefer_if_null_operators, prefer_interpolation_to_compose_strings, slash_for_doc_comments, sort_child_properties_last, unnecessary_const, unnecessary_constructor_name, unnecessary_late, unnecessary_new, unnecessary_null_aware_assignments, unnecessary_nullable_for_final_variable_declarations, unnecessary_string_interpolations, use_build_context_synchronously
import 'ModelProvider.dart';
import 'package:amplify_core/amplify_core.dart';
import 'package:flutter/foundation.dart';
/** This is an auto generated class representing the Comment type in your schema. */
@immutable
class Comment extends Model {
static const classType = const _CommentModelType();
final String id;
final String? _content;
final Post? _post;
final TemporalDateTime? _createdAt;
final TemporalDateTime? _updatedAt;
@override
getInstanceType() => classType;
@Deprecated('[getId] is being deprecated in favor of custom primary key feature. Use getter [modelIdentifier] to get model identifier.')
@override
String getId() => id;
CommentModelIdentifier get modelIdentifier {
return CommentModelIdentifier(
id: id
);
}
String? get content {
return _content;
}
Post? get post {
return _post;
}
TemporalDateTime? get createdAt {
return _createdAt;
}
TemporalDateTime? get updatedAt {
return _updatedAt;
}
const Comment._internal({required this.id, content, post, createdAt, updatedAt}): _content = content, _post = post, _createdAt = createdAt, _updatedAt = updatedAt;
factory Comment({String? id, String? content, Post? post}) {
return Comment._internal(
id: id == null ? UUID.getUUID() : id,
content: content,
post: post);
}
bool equals(Object other) {
return this == other;
}
@override
bool operator ==(Object other) {
if (identical(other, this)) return true;
return other is Comment &&
id == other.id &&
_content == other._content &&
_post == other._post;
}
@override
int get hashCode => toString().hashCode;
@override
String toString() {
var buffer = new StringBuffer();
buffer.write("Comment {");
buffer.write("id=" + "$id" + ", ");
buffer.write("content=" + "$_content" + ", ");
buffer.write("post=" + (_post != null ? _post!.toString() : "null") + ", ");
buffer.write("createdAt=" + (_createdAt != null ? _createdAt!.format() : "null") + ", ");
buffer.write("updatedAt=" + (_updatedAt != null ? _updatedAt!.format() : "null"));
buffer.write("}");
return buffer.toString();
}
Comment copyWith({String? content, Post? post}) {
return Comment._internal(
id: id,
content: content ?? this.content,
post: post ?? this.post);
}
Comment.fromJson(Map<String, dynamic> json)
: id = json['id'],
_content = json['content'],
_post = json['post']?['serializedData'] != null
? Post.fromJson(new Map<String, dynamic>.from(json['post']['serializedData']))
: null,
_createdAt = json['createdAt'] != null ? TemporalDateTime.fromString(json['createdAt']) : null,
_updatedAt = json['updatedAt'] != null ? TemporalDateTime.fromString(json['updatedAt']) : null;
Map<String, dynamic> toJson() => {
'id': id, 'content': _content, 'post': _post?.toJson(), 'createdAt': _createdAt?.format(), 'updatedAt': _updatedAt?.format()
};
Map<String, Object?> toMap() => {
'id': id, 'content': _content, 'post': _post, 'createdAt': _createdAt, 'updatedAt': _updatedAt
};
static final QueryModelIdentifier<CommentModelIdentifier> MODEL_IDENTIFIER = QueryModelIdentifier<CommentModelIdentifier>();
static final QueryField ID = QueryField(fieldName: "id");
static final QueryField CONTENT = QueryField(fieldName: "content");
static final QueryField POST = QueryField(
fieldName: "post",
fieldType: ModelFieldType(ModelFieldTypeEnum.model, ofModelName: 'Post'));
static var schema = Model.defineSchema(define: (ModelSchemaDefinition modelSchemaDefinition) {
modelSchemaDefinition.name = "Comment";
modelSchemaDefinition.pluralName = "Comments";
modelSchemaDefinition.authRules = [
AuthRule(
authStrategy: AuthStrategy.GROUPS,
groupClaim: "cognito:groups",
groups: [ "Admins" ],
provider: AuthRuleProvider.USERPOOLS,
operations: [
ModelOperation.DELETE
]),
AuthRule(
authStrategy: AuthStrategy.OWNER,
ownerField: "owner",
identityClaim: "cognito:username",
provider: AuthRuleProvider.USERPOOLS,
operations: [
ModelOperation.CREATE,
ModelOperation.UPDATE,
ModelOperation.DELETE,
ModelOperation.READ
]),
AuthRule(
authStrategy: AuthStrategy.PUBLIC,
operations: [
ModelOperation.READ
])
];
modelSchemaDefinition.addField(ModelFieldDefinition.id());
modelSchemaDefinition.addField(ModelFieldDefinition.field(
key: Comment.CONTENT,
isRequired: false,
ofType: ModelFieldType(ModelFieldTypeEnum.string)
));
modelSchemaDefinition.addField(ModelFieldDefinition.belongsTo(
key: Comment.POST,
isRequired: false,
targetNames: ['postCommentsId'],
ofModelName: 'Post'
));
modelSchemaDefinition.addField(ModelFieldDefinition.nonQueryField(
fieldName: 'createdAt',
isRequired: false,
isReadOnly: true,
ofType: ModelFieldType(ModelFieldTypeEnum.dateTime)
));
modelSchemaDefinition.addField(ModelFieldDefinition.nonQueryField(
fieldName: 'updatedAt',
isRequired: false,
isReadOnly: true,
ofType: ModelFieldType(ModelFieldTypeEnum.dateTime)
));
});
}
class _CommentModelType extends ModelType<Comment> {
const _CommentModelType();
@override
Comment fromJson(Map<String, dynamic> jsonData) {
return Comment.fromJson(jsonData);
}
@override
String modelName() {
return 'Comment';
}
}
/**
* This is an auto generated class representing the model identifier
* of [Comment] in your schema.
*/
@immutable
class CommentModelIdentifier implements ModelIdentifier<Comment> {
final String id;
/** Create an instance of CommentModelIdentifier using [id] the primary key. */
const CommentModelIdentifier({
required this.id});
@override
Map<String, dynamic> serializeAsMap() => (<String, dynamic>{
'id': id
});
@override
List<Map<String, dynamic>> serializeAsList() => serializeAsMap()
.entries
.map((entry) => (<String, dynamic>{ entry.key: entry.value }))
.toList();
@override
String serializeAsString() => serializeAsMap().values.join('#');
@override
String toString() => 'CommentModelIdentifier(id: $id)';
@override
bool operator ==(Object other) {
if (identical(this, other)) {
return true;
}
return other is CommentModelIdentifier &&
id == other.id;
}
@override
int get hashCode =>
id.hashCode;
}

Issue #, if available
Description of how you validated changes
Checklist
- [x] PR description included
- [x]
yarn testpasses - [x] Tests are changed or added
- [x] Relevant documentation is changed or added (and PR referenced)
- [x] Breaking changes to existing customers are released behind a feature flag or major version update
- [x] Changes are tested using sample applications for all relevant platforms (iOS/android/flutter/Javascript) that use the feature added/modified
By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.
@amondnet Thanks for the contribution. It is normal that the generated files does not fully follow the lint rules as it is commented at the beginning of the file. However, I tried to reproduce and did not find the same lint error in the screenshot. I think it might be additional lint rules defined in your project. Could you share the specific lint error? What lint rules do you have for your project?
@AaronZyLee
Hi, I am using very_good_analysis rule. When I changed it to flutter_lints, the problem disappeared.