如何使Dart全局检测来自不同文件的枚举扩展名



我想为放大模型生成器生成的枚举创建一个扩展名,所以我在不同的文件中创建了扩展名(因为枚举是自动生成的(,但当我尝试使用它时,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();
}
}
}

错误扩展无法识别

注意:宠物模型使用PetsType枚举作为属性类型。

扩展方法是语法糖。它们不是类(或者在本例中是enum(接口的一部分,不能自动检测和使用。(Dart编译器怎么知道去哪里检测可用的扩展?(

你能做的是:

  1. 将自动生成的enum定义移动到专用.dart文件(约定是将专用实现文件放在src/子目录中(
  2. 把你的扩展名放在一个公共文件中,import是那个私有文件,exportenum
  3. 期望使用者import公共文件

这应该(主要(确保enum的使用者也同时使用扩展。(这是不能保证的;如果病态消费者明确选择的话,他们可以直接import私人文件,当import访问公共文件时,他们也可以明确hide扩展名。然而,与故意试图成为病态的人斗争无论如何都是浪费时间。(

最新更新