如何让 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 编译器怎么知道去哪里检测可用的扩展?)

您可以做的是:

  1. 将自动生成的 enum 定义移动到私有 .dart 文件 (the convention is to put private implementation files in a src/ subdirectory)。
  2. 将您的扩展名放在一个 public 文件中,该文件 import 是那个私有文件,exportenum
  3. 预计消费者 import public 文件。

这应该(主要)确保 enum 的消费者也同时使用该扩展。 (不能保证;病态的消费者可以 import 私人文件,如果他们明确选择,他们也可以明确地 hide 扩展 importing public 文件。然而,与故意试图变得病态的人战斗无论如何都是浪费时间。)