> For the complete documentation index, see [llms.txt](https://docs.facephi.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.facephi.com/docs.facephi-pt-br/sdks/sdk-mobile/framework-plugins/flutter/componentes/componente-principal.md).

# Componente principal

A instalação do **Core** **Plugin** é obrigatória, independentemente dos produtos que se queira utilizar e do caso de uso definido. Contém funcionalidades básicas para o funcionamento do SDK, além de outras funcionalidades transversais e necessárias para os plugins auxiliares.

## Dependências <a href="#id-2-dependencia" id="id-2-dependencia"></a>

### Flutter:

<pre class="language-swift"><code class="lang-swift">dependencies:
  fphi_sdkmobile_core:
<strong>    hosted:
</strong>      name: fphi_sdkmobile_core
      url: https://facephicorp.jfrog.io/artifactory/api/pub/pub-pro-fphi/
    version: ^&#x3C;Versão>
</code></pre>

### Android - Gradle:

```kotlin
api "com.facephi.androidsdk:sdk:$version"
api "com.facephi.androidsdk:core:$version"
implementation "com.facephi.androidsdk:tracking_component:$version"
```

### iOS - CocoaPods:

```swift
s.dependency 'FPHISDKMainComponent', '~> $version'
s.dependency 'FPHISDKTrackingComponent', '~> $version'
s.dependency 'FPHISDKLicensingComponent', '~> $version'
s.dependency 'FPHISDKTokenizeComponent', '~> $version'
s.dependency 'FPHISDKStatusComponent', '~> $version'
```

## Métodos disponíveis

Este componente contém vários métodos que executam diferentes funcionalidades:

<table data-header-hidden><thead><tr><th width="233.64453125"></th><th></th></tr></thead><tbody><tr><td><strong>Método</strong></td><td><strong>Descrição</strong></td></tr><tr><td>initSession</td><td>Controlador principal do componente, que se encarrega de validar as licenças entre outras coisas.</td></tr><tr><td>initOperation</td><td>Método que se encarrega de gerar uma nova operação. O id da mesma é recuperado no objeto de resultado, parâmetro data.</td></tr><tr><td>getExtraData</td><td>O método getExtraData permite gerar os identificadores necessários para uma operação que deva continuar no <em>Serviço de Validações da Facephi</em> (Backend).</td></tr><tr><td>closeSession</td><td>Antes que a aplicação seja destruída, a sessão do SDK deverá ser encerrada para informar à plataforma sobre sua finalização.</td></tr></tbody></table>

### initSession <a href="#id-2-inicializacion-de-la-sesion" id="id-2-inicializacion-de-la-sesion"></a>

Antes de poder utilizar qualquer componente, a sessão da SDK deverá ser inicializada. Essa inicialização deve ser feita o mais cedo possível, preferencialmente no início da aplicação. Ao mesmo tempo, uma vez terminadas todas as operações com o SDK Mobile, a sessão também deverá ser encerrada.

O componente atual pode ser inicializado de duas formas, dependendo de como você deseja injetar a licença.

O novo método de licenciamento permite gerenciar as licenças de forma transparente para o integrador. A licença pode ser injetada de duas maneiras:

* Obtendo a licença por meio de um serviço através de uma URL e API-KEY
* Injetando a licença diretamente como String

Em ambos os casos, o resultado será retornado por meio de uma Promise, que contém um objeto da classe **CoreResult**.

```dart
@override
Future<Map> initSession({ required CoreConfigurationInitSession widgetConfigurationJSON }) async {
  final Map res = await methodChannel.invokeMethod('initSession', {"widgetConfigurationJSON": widgetConfigurationJSON.toJson()});
  return res;
}
```

## Configuração básica <a href="#id-5-configuracion-basica" id="id-5-configuracion-basica"></a>

Para iniciar o componente atual, deverá ser criado um objeto ***CoreConfigurationInitSession*** que será a configuração do controlador do componente.

A configuração básica necessária é a seguinte:

```dart
class CoreConfigurationInitSession
{
  String mLicenseUrl;
  String mLicenseApiKey;
  String mLicense;
  String? mLocale;
  bool? mEnableTracking;
  bool? mEnableDebugMode;
  dynamic mInternalOptions
}
```

### Configuração avançada do componente

A seguir, são detalhados todos os campos que fazem parte desta classe.

{% content-ref url="/pages/03cb56bdf3e20441fdb5f45be73ac546bf090d72" %}
[Configuração de Init Session](/docs.facephi-pt-br/sdks/sdk-mobile/framework-plugins/extras/core/init-session-configuracion.md)
{% endcontent-ref %}

***

### initOperation <a href="#id-3-inicializacion-de-la-operacion" id="id-3-inicializacion-de-la-operacion"></a>

Ao iniciar um processo ou Fluxo, **sempre** deverá ser feita a chamada ao método initOperation

```dart
@override
Future<Map> initOperation({ required TrackingConfiguration widgetConfigurationJSON }) async {
  final Map res = await methodChannel.invokeMethod('initOperation', {"widgetConfigurationJSON": widgetConfigurationJSON.toJson()});
  return res;
}
```

## Configuração básica <a href="#id-5-configuracion-basica" id="id-5-configuracion-basica"></a>

Para iniciar o componente atual, deverá ser criado um objeto ***TrackingConfiguration*** que será a configuração do controlador do componente.

A configuração básica necessária é a seguinte:

```dart
class TrackingConfiguration
{
  TrackingOperationType mType;
  String mCustomerId;
}
```

### Configuração avançada do componente

A seguir, são detalhados todos os campos que fazem parte desta classe.

{% content-ref url="/pages/102fd5577a5f062acf9f2589d10f09751e946e78" %}
[Configuração de Init Operation](/docs.facephi-pt-br/sdks/sdk-mobile/framework-plugins/extras/core/init-operation-configuracion.md)
{% endcontent-ref %}

***

### closeSession <a href="#id-6-cierre-de-sesion" id="id-6-cierre-de-sesion"></a>

Antes que a aplicação seja destruída, a sessão da SDK deverá ser encerrada para informar à plataforma sobre sua finalização. Para isso, o trecho de código a seguir é executado:

```dart
@override
Future<Map> closeSession() async {
  final Map res = await methodChannel.invokeMethod('closeSession', {});
  return res;
}
```

***

### getExtraData <a href="#id-7-metodo-extradata" id="id-7-metodo-extradata"></a>

O método getExtraData permite gerar os identificadores necessários para uma operação que deva continuar no *Serviço de Validações da Facephi* (Backend). Essa situação geralmente ocorre em casos nos quais, uma vez obtidas as informações necessárias na aplicação do cliente, elas devem ser enviadas a um determinado serviço para sua posterior validação ou análise. Caso os resultados desses processos devam ser rastreados na Plataforma, ela deverá ser capaz de unificar a primeira parte do processo realizada no cliente com a última realizada no serviço, já que no final fazem parte da mesma operação.

```dart
@override
Future<Map> getExtraData() async {
  final Map res = await methodChannel.invokeMethod('getExtraData', {});
  return res;
}
```

## Lançamento de IDV <a href="#lanzamiento-de-idv" id="lanzamiento-de-idv"></a>

O processo de IDV lança um fluxo configurado na plataforma a partir do seu ID (flowID). Para isso, será necessário invocar dois métodos: **initFlow + startFlow**.

### initFlow

Neste método será definida a configuração necessária. O ID do fluxo configurado na plataforma (flowID) e o ID do cliente (customerID). Veja o código:

```dart
await FphiSdkmobileCore().initFlow(widgetConfigurationJSON: FlowConfiguration(
    mCustomerId: customerId,
    mFlow: "f40c098c-a878-4976-aef1-2af6bbf55148"
));
```

Para configurar o controlador de fluxos, será criada uma lista dos controladores dos componentes que participarão do processo, o que permite inicializá-los corretamente. A ordem em que forem definidos não é importante; será o próprio fluxo que indicará a ordem em que serão executados. Por exemplo:

* **setSelphiFlow**: Captura facial
* **setSelphidFlow**: Captura de documentos

Código para o lançamento:

<pre class="language-dart"><code class="lang-dart">// Si initFlow retorna STATUS_OK. Llamo a los flujos, invocando uno a uno los controladores
CoreWidget().initFlow().then((r) async
{
  r.map((r) async
  {
    if (r.finishStatus == SdkFinishStatus.STATUS_OK).
    {
      /* Se llamarán tantos métodos de seteos del flow's como flujos se usen */
      /* En el ejemplo un flow típico de onboarding */
      await SelphiFaceWidget().setSelphiFlow().then((value) {
        if (kDebugMode) {
          print(value);
        }
      });
      await SelphIDWidget().setSelphidFlow().then((value) {
        if (kDebugMode) {
          print(value);
        }
      });
      
      /* Al final de agregar los flujos, se lanza el startFlow(Siempre que los métodos anteriores no fallen) */
      await CoreWidget().startFlow().then((value)
      {
        if (kDebugMode) {
          print(value);
        }
      }).onError((error, stackTrace) {
        if (kDebugMode) {
          print(error);
        }
      });
    }
  });
}).onError((error, stackTrace) {
  if (kDebugMode) {
    print(error);
  }
});

/* Los resultados se escuchan implementando un BasicMessage, con el key 'core.flow' */
const channel = BasicMessageChannel&#x3C;dynamic>('core.flow', StringCodec());
channel.setMessageHandler((message) async
{
  if (jsonDecode(message!)['flow'] == "SELPHID")
  {
    if (kDebugMode) {
      print(SelphIDResult.fromMap(jsonDecode(message)));
    }
  }
  else if (jsonDecode(message!)['flow'] == "SELPHI")
  {
    if (kDebugMode) {
      print(SelphiFaceResult.fromMap(jsonDecode(message)));
    }
  }
  else
  {
    if (kDebugMode) {
      print(jsonDecode(message));
    }
  }
  return '';
<strong>});
</strong></code></pre>

## Recebimento do resultado <a href="#id-6-recepcion-del-resultado" id="id-6-recepcion-del-resultado"></a>

O lançamento de ***TODOS*** os métodos devolverão as informações em formato CoreResult. Podendo diferenciar-se entre um lançamento correto e um incorreto:

```dart
class CoreResult {
  final SdkFinishStatus finishStatus;
  final String finishStatusDescription;
  final String errorDiagnostic;
  final String? errorMessage;
  final String? data;
}
```

{% content-ref url="/pages/c342a4710e152e7e7ff9a672ab3a979b9ecb8f22" %}
[Core Resultado](/docs.facephi-pt-br/sdks/sdk-mobile/framework-plugins/extras/core/core-resultado.md)
{% endcontent-ref %}
