Home > Back-end >  How to make Dart detects enum extensions from different file globally?
How to make Dart detects enum extensions from different file globally?

Time:03-06

I wanted to create an extension for generated enum from amplify model generator, so I created the extension in different file (because the enum is autogenerated) but Dart is not detecting my extension when I try to using it.

Auto Generated Enum 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();
    }
  }
}

ERROR extension unrecognized

Note: Pet model is using PetsType enum as a property type.

CodePudding user response:

Extension methods are syntactic sugar. They are not part of the class (or in this case, enum) interface and can't be automatically detected and used. (How would the Dart compiler even know where to look to detect available extensions?)

What you could do is:

  1. Move the autogenerated enum definition to a private .dart file (the convention is to put private implementation files in a src/ subdirectory).
  2. Put your extension in a public file that imports that private file and exports the enum.
  3. Expect that consumers import the public file.

That should (mostly) ensure that consumers of the enum also consume the extension at the same time. (It wouldn't be guaranteed; pathological consumers could import the private file directly if they explicitly choose to, and they also could explicitly hide the extension when importing the public file. However, fighting people intentionally trying to be pathological is a waste of time anyway.)

  • Related