我有以下类型:
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
,但有没有办法识别Dart中的TypeEditor
或AddressEditor
。
我需要使这些识别符合验证结果。
由于
答案 0 :(得分:4)
更新
事实证明,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
只是一个不同的类和构造函数名称。
<强> ORIGINAL 强>
我非常确定上面的is
示例工作正常并且问题出在其他地方(这些值不是AddressEditors
或TypeEditors
而只是{{} 1}}。
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}');
}