如何让 Dart 在全球范围内检测来自不同文件的枚举扩展名?
How to make Dart detects enum extensions from different file globally?
我想为从放大模型生成器生成的枚举创建一个扩展,所以我在不同的文件中创建了扩展(因为枚举是自动生成的)但是当我尝试使用它时 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();
}
}
}
错误
extension unrecognized
注意: 宠物模型正在使用 PetsType 枚举作为 属性 类型。
扩展方法是语法糖。它们不是 class(或在本例中为 enum
)接口的一部分,无法自动检测和使用。 (Dart 编译器怎么知道去哪里检测可用的扩展?)
您可以做的是:
- 将自动生成的
enum
定义移动到私有 .dart
文件 (the convention is to put private implementation files in a src/
subdirectory)。
- 将您的扩展名放在一个 public 文件中,该文件
import
是那个私有文件,export
是 enum
。
- 预计消费者
import
public 文件。
这应该(主要)确保 enum
的消费者也同时使用该扩展。 (不能保证;病态的消费者可以 import
私人文件,如果他们明确选择,他们也可以明确地 hide
扩展 import
ing public 文件。然而,与故意试图变得病态的人战斗无论如何都是浪费时间。)
我想为从放大模型生成器生成的枚举创建一个扩展,所以我在不同的文件中创建了扩展(因为枚举是自动生成的)但是当我尝试使用它时 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();
}
}
}
错误 extension unrecognized
注意: 宠物模型正在使用 PetsType 枚举作为 属性 类型。
扩展方法是语法糖。它们不是 class(或在本例中为 enum
)接口的一部分,无法自动检测和使用。 (Dart 编译器怎么知道去哪里检测可用的扩展?)
您可以做的是:
- 将自动生成的
enum
定义移动到私有.dart
文件 (the convention is to put private implementation files in asrc/
subdirectory)。 - 将您的扩展名放在一个 public 文件中,该文件
import
是那个私有文件,export
是enum
。 - 预计消费者
import
public 文件。
这应该(主要)确保 enum
的消费者也同时使用该扩展。 (不能保证;病态的消费者可以 import
私人文件,如果他们明确选择,他们也可以明确地 hide
扩展 import
ing public 文件。然而,与故意试图变得病态的人战斗无论如何都是浪费时间。)