Как дифференцировать типы дротиков
У меня есть следующие типы:
class AddressEditor extends TextEditor {}
class TypeEditor extends TextEditor {}
Я попытался идентифицировать редакторов как таковых:
void validationErrorHandler( ValidationError e )
{
var editor = e.editor;
if( editor is AddressEditor )
print( editor.runtimeType.toString() ) // prints TextEditor
if( editor is TypeEditor )
print( editor.runtimeType.toString() ) // prints TextEditor
}
Если я использую зеркала
import 'dart:mirrors';
getTypeName(dynamic obj)
{
return reflect(obj).type.reflectedType.toString();
}
void validationErrorHandler( ValidationError e )
{
var editor = e.editor;
if( editor is AddressEditor )
print( getTypeName( editor ) ) // prints TextEditor
if( editor is TypeEditor )
print( getTypeName( editor ) ) // prints TextEditor
}
Почему тип редактора TypeEditor
а также AddressEditor
не быть идентифицированным? Да я знаю что либо TextEditor
, но есть ли способ определить TypeEditor
или AddressEditor
в дартс.
Мне нужно сделать эти идентификационные данные для работы с результатом проверки.
Спасибо
1 ответ
ОБНОВИТЬ
Оказывается, что TextEditor
есть метод newInstance()
который вызывается для получения новых экземпляров редактора BWU Datagrid
(в принципе TextEditor
это фабрика и реализация в одном).
Так как TypeEditor
а также AddressEditor
не переопределяйте этот метод, внутренне чистый TextEditor
экземпляры созданы.
Чтобы получить желаемое поведение, вам нужно переопределить newInstance
и реализовать конструктор, используемый этим методом. Потому что конструктор в TextEditor
является частным, его нельзя использовать повторно, и его необходимо скопировать (я пересмотрю этот дизайн). Первые две строки скопированного конструктора нужно немного адаптировать.
AddressEditor будет выглядеть так
class AddressEditor extends TextEditor {
AddressEditor() : super();
@override
TextEditor newInstance(EditorArgs args) {
return new AddressEditor._(args);
}
AddressEditor._(EditorArgs args) {
this.args = args;
$input = new TextInputElement()
..classes.add('editor-text');
args.container.append($input);
$input
..onKeyDown.listen((KeyboardEvent e) {
if (e.keyCode == KeyCode.LEFT || e.keyCode == KeyCode.RIGHT) {
e.stopImmediatePropagation();
}
})
..focus()
..select();
}
}
TypeEditor
это то же самое, просто другое имя класса и конструктора.
ОРИГИНАЛ
Я уверен, что приведенный выше пример с is
работает нормально, и что проблема кроется где-то еще (что эти значения не AddressEditors
или же TypeEditors
но просто TextEditors
,
class TextEditor {}
class AddressEditor extends TextEditor {}
class TypeEditor extends TextEditor {}
void main() {
check(new AddressEditor());
check(new TypeEditor());
check(new TextEditor());
}
void check(TextEditor editor) {
if(editor is AddressEditor) print('AddressEditor: ${editor.runtimeType}');
if(editor is TypeEditor) print('TypeEditor: ${editor.runtimeType}');
if(editor is TextEditor) print('TextEditor: ${editor.runtimeType}');
}
выход
AddressEditor: AddressEditor
TextEditor: AddressEditor
TypeEditor: TypeEditor
TextEditor: TypeEditor
TextEditor: TextEditor