Получение значения открытого статического поля / свойства класса по его имени в виде строки в dart через отражаемое
Скажем, у меня есть класс:
class Icons {
static const IconData threesixty = IconData(0xe577, fontFamily: 'MaterialIcons');
}
Теперь у меня есть строковая переменная со значением "threesixty":
String fieldName = "threesixty";
как я могу получить значение threesixty в классе Icons с помощью переменной fieldName?
Я использую отражающий пакет и уже использовал другие функции ClassMirrors во флаттере, но не знаю, как это сделать.
2 ответа
То, что вы хотите, требует использования отражения. В флаттере отражение не поддерживается из-за тряски деревьев. Встряхивание дерева - это процесс удаления неиспользуемого кода из пакета приложения (apk, ipa) с целью уменьшения размера пакета. Когда используется отражение, весь код может использоваться неявно, поэтому флаттер не сможет узнать, от каких частей кода избавиться, поэтому они решили не поддерживать отражение (зеркала в контексте дротика). Вы должны попытаться решить вашу проблему с наследованием, если это возможно, или в зависимости от вашей конкретной проблемы вы можете попытаться использовать статическую генерацию кода.
Изменить: Вы можете вызвать статический геттер с отражаемым, как это;
import 'package:reflectable/reflectable.dart';
class Reflector extends Reflectable {
const Reflector() : super(staticInvokeCapability);
}
const reflector = const Reflector();
@reflector
class ClassToReflect {
static double staticPropertyToInvoke = 15;
}
Main.dart
import 'package:reflectable/reflectable.dart';
import 'main.reflectable.dart';
void main() {
initializeReflectable();
ClassMirror x = reflector.reflectType(ClassToReflect);
var y = x.invokeGetter('staticPropertyToInvoke');
debugPrint(y);
}
PS main.reflectable.dart - файл, сгенерированный отражаемым пакетом.
Насколько я знаю, это невозможно без использования зеркальной библиотеки.
Смотрите: Получить доступ к свойству объекта, используя скобки в дартс