2016-11-06 6 views
1

Мне нужно использовать отражаемый на стороннем lib, но он не работает.Использовать дротик, отражаемый на внешнем lib

Рассмотрим такой сценарий:

Библиотека А имеет декларацию рефлектора:

class Reflector extends Reflectable { 
    const Reflector() 
     : super(invokingCapability, 
     typeRelationsCapability, 
     metadataCapability, 
     superclassQuantifyCapability, 
     reflectedTypeCapability); 
} 

const Reflector reflector = const Reflector(); 

библиотека B имеет классы, которые аннотированные с отражателем:

import 'package:library_a/library_a.dart' show reflector; 

@reflector 
class whateverz {} 

Теперь о потребности приложения C использовать отражение на любом классе, который находится внутри библиотеки B.

Моя проблема в том, что отражающая lib не может видеть класс anyz, аннотированный. Конструкция предупреждает «reflector.dart: Этот отражатель ничего не соответствует»

И если я делаю «print (reflector.annotatedClasses)»; он печатает [] в консоли.

Возможно ли это? Чтобы аннотировать классы в третьей стороне lib, которые я буду использовать в приложении с отражением? Если да, то что я делаю неправильно?

ответ

1

Я подозреваю, что преобразование не выполняется в правильном основном файле.

Трансформатор способен искать любое объявление в вашей программе, поэтому, если в вашей программе есть библиотека, которая импортирует библиотеку B (и, следовательно, также библиотеку A), то трансформатор, безусловно, должен иметь возможность генерировать зеркало для class whateverz, и вы должны найти это зеркало в reflector.annotatedClasses.

Но набор файлов, принимаемых во внимание при трансформации является транзитивное замыкание импорта из точки входа (то есть соответствующий элемент в entry_points, указанный в вашем pubspec.yaml), так что если вы указываете точку входа, которая а не фактический основной файл, тогда трансформатор может работать с меньшим (или просто другим) набором библиотек. Например, если вы используете библиотеку A в качестве точки входа, трансформатор не будет знать, что существует библиотека B (при условии, что библиотека A напрямую или косвенно не импортирует библиотеку B), поэтому трансформатор не обнаружит никаких деклараций в библиотеке B, и вы не получите соответствующие зеркала.

Если вы работаете в библиотеке, что другие разработчики будут импортировать и использовать, вы должны сказать им, чтобы включить reflectable трансформатор в их pubspec.yaml и добавить элемент в entry_points (или убедитесь, что они используют подстановочные знаки, которые уже соответствует всем желаемым точкам входа).

Вы можете проверить three_files_test.dart увидеть крошечный пример, в котором отражатель в одном файле используется для аннотирования классов в разных файлах, и вы можете проверить meta_reflectors_test.dart, чтобы увидеть, как вы можете отвязать отражатели, целевые классы и другие элементы, даже больше (например, используя GlobalQuantifyCapability, чтобы связать определенный отражатель с определенным целевым классом без редактирования файла, который содержит целевой класс).

Смежные вопросы