


# Module class






    *[<Null safety>](https://dart.dev/null-safety)*



<p>The <a href="../package-fuchsia_modular_module/Module-class.md">Module</a> class provides a mechanism for module authors
to interact with the underlying framework. The main responsibilities
of the <a href="../package-fuchsia_modular_module/Module-class.md">Module</a> class are to implement the intent handler
interface and the lifecycle interface.</p>




## Constructors

[Module](../package-fuchsia_modular_module/Module/Module.md) ()

returns a shared instance of this.   _factory_


## Properties

##### [hashCode](../package-fuchsia_modular_module/Module/hashCode.md) &#8594; int



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



##### [runtimeType](../package-fuchsia_modular_module/Module/runtimeType.md) &#8594; Type



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





## Methods

##### [noSuchMethod](../package-fuchsia_modular_module/Module/noSuchMethod.md)(Invocation invocation) dynamic



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



##### [removeSelfFromStory](../package-fuchsia_modular_module/Module/removeSelfFromStory.md)() void



When <code>RemoveSelfFromStory()</code> is called the framework will stop the
module and remove it from the story. If there are no more running modules
in the story the story will be stopped.  




##### [toString](../package-fuchsia_modular_module/Module/toString.md)() String



A string representation of this object.  
_inherited_





## Operators

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



The equality operator.  
_inherited_















