This library contains the core Unimodule infrastructure and a collection of Unimodules and interfaces that are commonly depended on by other Unimodules. You will need to install this before using libraries from Foundation, like `expo-camera`, `expo-media-
$ npm install @unimodules/core
$ yarn add @unimodules/core
# or
$ npm install @unimodules/core --save
If you are using react-native-unimodules
, this package will already be installed and configured!
If you're using Cocoapods, add the following dependency to your Podfile
:
pod 'UMCore', path: '../node_modules/@unimodules/core/ios'
and run npx pod-install
.
android/settings.gradle
:include ':unimodules-core'
project(':unimodules-core').projectDir = new File(rootProject.projectDir, '../node_modules/@unimodules/core/android')
android/app/build.gradle
:compile project(':unimodules-core')
-keepclassmembers class * {
@org.unimodules.interfaces.ExpoProp *;
}
-keepclassmembers class * {
@org.unimodules.interfaces.ExpoMethod *;
}
Native code — iOS/Android native code.
Client code — code over the bridge, for React Native it's the JavaScript app.
Internal module — a class implementing UMInternalModule
/org.unimodules.interfaces.InternalModule
interface. Its instance can be exposed internally to other modules via Module Registry (how dependants reference modules differs between platforms).
Module interface — an interface that should be implemented by the dependency so it can act as an implementation of it.
On Android modules implement an external interface (expo-file-system
package implements interface provided by expo-file-system-interface
). Dependants may access the implementations by calling
public <T> T getModule(Class<T> interfaceClass);
method on the module registry.
On iOS its the consumer who defines required protocol. Implementations are identified by a protocol. Dependants access the implementation by calling
- (id)getModuleImplementingProtocol:(Protocol *)protocol;
method on the module registry.
Module Registry — well, a registry of modules. Instance of this class is used to fetch another internal or exported module.
Exported methods — a subset of instance methods of a given module that should get exposed to client code by specific platform adapter.
Exported module — a subclass of {UM,org.unimodules.}ExportedModule
. Its methods annotated with org.unimodules.ExpoMethod
/UM_EXPORT_METHOD_AS
are exported to client code.
View manager — a class capable of providing platform adapter with custom views.
<UMCore/UMInternalModule.h>
.UMModule
to a list of implemented interfaces by the module instances (eg. NSObject <UMInternalModule>
).UM_REGISTER_MODULE();
macro to register the module.org.unimodules.interfaces.InternalModule
to your class's imports.InternalModule
interface.
public List<Class> getExportedInterfaces();
. Return a list of module interfaces implemented by the class, for example:return Collections.singletonList((Class) org.unimodules.interfaces.filesystem.FileSystem.class);
Package
class for your module, unless you already have one.
Package
class should implement org.unimodules.Package
interface (a BasePackage
class is provided for you not to have to implement all the initialization flavors at once).Package
to a List
provided to ModuleRegistryBuilder
.new ModuleRegistryBuilder(
Arrays.<Package>asList(
new FileSystemPackage()
)
)
List<InternalModule> createInternalModules(Context context);
.When registering your module for export to client code, you must first decide whether the class will only be exported to client code or will it be both internal and exported module. If the former is applicable, you easily just subclass UMExportedModule
and use macro UM_EXPORT_MODULE(clientCodeName)
to provide a name under which it should be exported. If your module should be both internal and exported module, you also have to subclass UMExportedModule
, but this time use UM_REGISTER_MODULE()
in the implementation and then manually override methods exportedInterfaces
and exportedModuleName
.
Subclass org.unimodules.ExportedModule
and add your module to a list returned by Package
in createExportedModules()
.
Use UM_EXPORT_METHOD_AS(exportedName, definition)
macro to export given method to client code. Note that for the module to be available in the client code you have to provide a non-empty client code name in UM_EXPORT_MODULE(clientCodeName)
or - (const NSString *)exportedModuleName
. For now, arguments have to use basic, object types, like NSString *
, NSDictionary *
, NSNumber *
. Methods are required to receive UMPromiseResolveBlock
and UMPromiseRejectBlock
as two last arguments.
Given that your module subclasses org.unimodules.ExportedModule
and it is returned by the respective Package
, you just have to annotate the given method with @ExpoMethod
annotation. Methods are required to receive org.unimodules.Promise
as the last argument.
Implement - (NSDictionary *)constantsToExport
method to export constants to client code.
Override public Map<String, Object> getConstants();
method to export constants to client code.
Subclass UMViewManager
and override at least - (UIView *)view
and - (NSString *)viewName
. Register it with UM_REGISTER_MODULE()
.
Use UM_VIEW_PROPERTY(propName, propClass, viewClass)
to define custom view properties.
TODO: ViewManager from interface to a class
Implement org.unimodules.interfaces.ViewManager
in your class and respond with its instance in List<ViewManager> createViewManagers(Context context);
in corresponding Package
.
Annotate prop setter methods with @ExpoProp(name = <name>)
to define custom view properties.
© 2010 - cnpmjs.org x YWFE | Home | YWFE