


# AsyncProxyController&lt;T> class









<p>A controller for Future based proxies.</p>




## Constructors

[AsyncProxyController](../package-fidl_fidl/AsyncProxyController/AsyncProxyController.md) ({String $serviceName, String $interfaceName})

Creates proxy controller.   


## Properties

##### [$interfaceName](../package-fidl_fidl/AsyncProxyController/$interfaceName.md) &#8594; String



The name of the interface of <code>T</code>.  
_final_



##### [$serviceName](../package-fidl_fidl/AsyncProxyController/$serviceName.md) &#8594; String



The service name associated with <code>T</code>, if any.  
_final_



##### [hashCode](../package-fidl_fidl/AsyncProxyController/hashCode.md) &#8594; int



The hash code for this object.  
_read-only, inherited_



##### [isBound](../package-fidl_fidl/AsyncProxyController/isBound.md) &#8594; bool



Is this interface bound?  
_read-only, inherited_



##### [isClosed](../package-fidl_fidl/AsyncProxyController/isClosed.md) &#8594; bool



Is this interface closed?  
_read-only, inherited_



##### [isUnbound](../package-fidl_fidl/AsyncProxyController/isUnbound.md) &#8594; bool



Is this interface unbound?  
_read-only, inherited_



##### [onEpitaphReceived](../package-fidl_fidl/AsyncProxyController/onEpitaphReceived.md) &#8596; [EpitaphHandler](../package-fidl_fidl/EpitaphHandler.md)



Called when an epitaph is received (from channel closure).  
_read / write_



##### [onResponse](../package-fidl_fidl/AsyncProxyController/onResponse.md) &#8596; [IncomingMessageSink](../package-fidl_fidl/IncomingMessageSink.md)



Called whenever this object receives a response on a bound channel.  
_read / write_



##### [runtimeType](../package-fidl_fidl/AsyncProxyController/runtimeType.md) &#8594; Type



A representation of the runtime type of the object.  
_read-only, inherited_



##### [state](../package-fidl_fidl/AsyncProxyController/state.md) &#8596; [InterfaceState](../package-fidl_fidl/InterfaceState.md)



Gets the current state.  
_read / write, inherited_



##### [stateChanges](../package-fidl_fidl/AsyncProxyController/stateChanges.md) &#8594; Stream&lt;[InterfaceState](../package-fidl_fidl/InterfaceState.md)>



A stream of state changes.  
_read-only, inherited_



##### [whenBound](../package-fidl_fidl/AsyncProxyController/whenBound.md) &#8594; Future&lt;void>



A future that completes when the interface becomes bound.  
_read-only, inherited_



##### [whenClosed](../package-fidl_fidl/AsyncProxyController/whenClosed.md) &#8594; Future&lt;void>



A future that completes when the interface is closed.  
_read-only, inherited_





## Methods

##### [bind](../package-fidl_fidl/AsyncProxyController/bind.md)([InterfaceHandle](../package-fidl_fidl/InterfaceHandle-class.md)&lt;T> interfaceHandle) void



Binds the proxy to the given interface handle.  




##### [close](../package-fidl_fidl/AsyncProxyController/close.md)() void



Close the channel bound to the proxy.  




##### [getCompleter](../package-fidl_fidl/AsyncProxyController/getCompleter.md)(int txid) Completer



Returns the completer associated with the given response message.  




##### [noSuchMethod](../package-fidl_fidl/AsyncProxyController/noSuchMethod.md)(Invocation invocation) dynamic



Invoked when a non-existent method or property is accessed.  
_inherited_



##### [proxyError](../package-fidl_fidl/AsyncProxyController/proxyError.md)([FidlError](../package-fidl_fidl/FidlError-class.md) error) void



close the channel and forwards error to any open completers.  




##### [request](../package-fidl_fidl/AsyncProxyController/request.md)() [InterfaceRequest](../package-fidl_fidl/InterfaceRequest-class.md)&lt;T>



Creates an interface request whose peer is bound to this interface proxy.  




##### [sendMessage](../package-fidl_fidl/AsyncProxyController/sendMessage.md)([OutgoingMessage](../package-fidl_fidl/OutgoingMessage-class.md) message) void



Sends the given messages over the bound channel.  




##### [sendMessageWithResponse](../package-fidl_fidl/AsyncProxyController/sendMessageWithResponse.md)([OutgoingMessage](../package-fidl_fidl/OutgoingMessage-class.md) message, Completer completer) void



Sends the given messages over the bound channel and registers a Completer
to handle the response.  




##### [toString](../package-fidl_fidl/AsyncProxyController/toString.md)() String



A string representation of this object.  
_inherited_



##### [unbind](../package-fidl_fidl/AsyncProxyController/unbind.md)() [InterfaceHandle](../package-fidl_fidl/InterfaceHandle-class.md)&lt;T>



Unbinds the proxy and returns the unbound channel as an interface handle.  






## Operators

##### [operator ==](../package-fidl_fidl/AsyncProxyController/operator_equals.md)(Object other) bool



The equality operator.  
_inherited_















