I discovered that sometimes I cannot change the value in NumberField when it initialized with another one (visually value is changed of course, but field's getValue() returns the old one).

ViewData contains last and current value, the field's value is only updated when these are not equal. But ViewData is constructed and cleared each time the finishEditing method is called. When it is constructed it has last and current value both equal! So the fields value is not updated. Before leaving the finishEditing() view data is cleared. Next time you focus a field and do a single change then focus to other field ViewData will be constructed, again with last and current value both equal. So the situation is possible when field's value will never change.
It is easier to repeat and understand the issue if use copy-pase with mouse and do not use buttons at all, or press the button only one time between focus changes (and thus ViewData clearing).
Proposed solution is not to initialize last and current members of ViewData with the same value during its construction.

Code:
public void onBrowserEvent(Context context, Element parent, T value, NativeEvent event, ValueUpdater<T> valueUpdater) {
 ...
 } else if ("keyup".equals(eventType)) {
  // Record keys as they are typed.
 FieldViewData vd = getViewData(key);
 if (vd == null) { // null after each finishEditing call
   vd = new FieldViewData(getText(XElement.as(parent))); // last value == current value! see ViewData
 setViewData(key, vd);
 }
 vd.setCurrentValue(getText(XElement.as(parent))); //if vd was null we do not need to setCurrentValue on it as the current value was set in FieldViewData custructor earlier!
// this line should be placed in ELSE branch of the condition. }<br>
 &nbsp;&nbsp;}
 

 public void finishEditing(Element parent, T value, Object key, ValueUpdater<T> valueUpdater) {
 
 String newValue = getText(XElement.as(parent));
 
 // Get the view data.
 FieldViewData vd = getViewData(key);
 if (vd == null) {
 vd = new FieldViewData(newValue); // current value == last value
 setViewData(key, vd);
 }
 vd.setCurrentValue(newValue);
 
 // Fire the value updater if the value has changed.
 if (valueUpdater != null && !vd.getCurrentValue().equals(vd.getLastValue())) { //cannot satisfy the condition
 ...
 valueUpdater.update(newValue.equals("") ? null : getPropertyEditor().parse(newValue));
  ...
 }
 clearViewData(key); 
 ...
 }