[英]How to make Dart detects enum extensions from different file globally?
我想为从 amplify model 生成器生成的枚举创建一个扩展,所以我在不同的文件中创建了扩展(因为枚举是自动生成的)但是当我尝试使用它时 Dart 没有检测到我的扩展。
自动生成枚举 PetsType.dart
/*
* 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, file_names, unnecessary_new, prefer_if_null_operators, prefer_const_constructors, slash_for_doc_comments, annotate_overrides, non_constant_identifier_names, unnecessary_string_interpolations, prefer_adjacent_string_concatenation, unnecessary_const, dead_code
enum PetsType { DOG, CAT, BIRD, HAMSTER, FISH, OTHER }
pets_type_extension.dart
extension EnumPetCategoryExtension on PetsType {
Color get color => _getColor(this);
IconData get icon => _getIcon(this);
String get valueString => _getUiValue(this);
Color _getColor(PetsType category) {
switch (category) {
case PetsType.DOG:
return const Color(0xffFFB56B);
case PetsType.CAT:
return const Color(0xffFFD977);
case PetsType.BIRD:
return const Color(0xff826491);
case PetsType.HAMSTER:
return const Color(0xffA66551);
case PetsType.FISH:
return const Color(0xff6DB5AD);
case PetsType.OTHER:
return const Color(0xffFFB56B);
}
}
IconData _getIcon(PetsType category) {
switch (category) {
case PetsType.DOG:
return Icons.ac_unit;
case PetsType.CAT:
return Icons.account_tree_outlined;
case PetsType.BIRD:
return Icons.airline_seat_legroom_reduced;
case PetsType.HAMSTER:
return Icons.bookmark_add_sharp;
case PetsType.FISH:
return Icons.bed;
case PetsType.OTHER:
return Icons.computer_sharp;
}
}
String toShortString() {
return toString().split('.').last;
}
String toUpperCase() {
return toShortString().toUpperCase();
}
String _getUiValue(PetsType category) {
switch (category) {
case PetsType.DOG:
return LocaleKeys.petTypes_dog.tr();
case PetsType.CAT:
return LocaleKeys.petTypes_cat.tr();
case PetsType.BIRD:
return LocaleKeys.petTypes_bird.tr();
case PetsType.HAMSTER:
return LocaleKeys.petTypes_hamster.tr();
case PetsType.FISH:
return LocaleKeys.petTypes_fish.tr();
case PetsType.OTHER:
return LocaleKeys.petTypes_others.tr();
}
}
}
无法识别错误扩展名
注意: Pet model 使用 PetsType 枚举作为属性类型。
扩展方法是语法糖。 它们不是 class(或在本例中为enum
)接口的一部分,无法自动检测和使用。 (Dart 编译器怎么知道到哪里去检测可用的扩展?)
你可以做的是:
enum
定义移动到私有.dart
文件( 约定是将私有实现文件放在src/
子目录中)。import
该私有文件并export
该enum
。import
公共文件。 这应该(主要)确保enum
的消费者也同时使用扩展。 (不能保证;如果病态消费者明确选择,他们可以直接import
私有文件,并且他们也可以在import
公共文件时明确hide
扩展名。但是,与故意病态的人作斗争是一种浪费反正时间。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.