How does the UI drop_fn work?

I am looking at this reference https://docs.omniverse.nvidia.com/kit/docs/omni.ui/latest/omni.ui/omni.ui.StringField.html

It would be helpful to have some explanation relating to the keywords and callbacks, especially for drop_fn.

Short of an in-depth explanation for the docs, here are some specific points of confusion (for me):

  1. What is the difference with call and set, since they have same description?
  2. If stringfield is a widget, why is there a drop_fn on the stringfield in addition to the call and set?
  3. Why would you need to use accept_drop_fn (or why wouldn’t you always use it)? – You still need to manually check what the drop is, which can be done in the drop_fn callback.

Following the same convention from regular callbacks, such as ui.Button("reset", clicked_fn=reset), I tried to use ui.StringField(drop_fn=accept_drops), but the callback never happens. Instead, I need to use:

asset_field = ui.StringField()
asset_field.set_accept_drop_fn(accept_drops)
asset_field.set_drop_fn(accept_drops)
  1. Why?