Найти в Дзене
flaton

Flutter и работа с нативным кодом на примере библиотеки для работы с NFC

Несмотря на обширные возможности кроссплатформенной разработки во Flutter, иногда требуется доступ к функциям, поддерживаемым только на нативном уровне. Один из таких случаев — работа с NFC, когда приходится взаимодействовать напрямую с платформенными API. В этой статье мы рассмотрим, как интегрировать нативный код в приложение на Flutter, чтобы реализовать полноценную NFC-функциональность. В большинстве случаев при работе с флаттером разработчику никак не приходится взаимодействовать с нативным кодом (Java/Kotlin и ObjectiveC/Swift), потому что инструментарий флаттера довольно богат. Но иногда возникают случаи, когда без этого не обойтись. Самым частым примером является работа с датчиками телефона.
Рассмотрим проблему: представим что вам нужно сделать чтение данных карты с NFC. Вы выбрали плагин, в нашем случае это был nfc_manager 3.1.0, который позволяет это делать, но на android из него не возвращается номер карты, который вам необходим. Что делать? С такой проблемой мы недавно сто

Несмотря на обширные возможности кроссплатформенной разработки во Flutter, иногда требуется доступ к функциям, поддерживаемым только на нативном уровне. Один из таких случаев — работа с NFC, когда приходится взаимодействовать напрямую с платформенными API. В этой статье мы рассмотрим, как интегрировать нативный код в приложение на Flutter, чтобы реализовать полноценную NFC-функциональность.

Как исправлять недочеты в нативных библиотеках при работе с флаттером на примере NFC

В большинстве случаев при работе с флаттером разработчику никак не приходится взаимодействовать с нативным кодом (Java/Kotlin и ObjectiveC/Swift), потому что инструментарий флаттера довольно богат. Но иногда возникают случаи, когда без этого не обойтись. Самым частым примером является работа с датчиками телефона.

Рассмотрим проблему: представим что вам нужно сделать чтение данных карты с NFC. Вы выбрали плагин, в нашем случае это был nfc_manager 3.1.0, который позволяет это делать, но на android из него не возвращается номер карты, который вам необходим. Что делать? С такой проблемой мы недавно столкнулись и сейчас расскажем как это решается.
Для решения данной проблемы нужно выполнить несколько шагов.
Во-первых необходимо скопировать код библиотеки к себе в проект. Должно получиться так:

Читать на Habr

-2

Так же небольшой совет: при наличии нескольких таких пакетов лучше вынести их в отдельную папку на том же уровне вложенности и назвать ее, например, packages.

Затем нам необходимо локализовать момент, в котором не происходит считывание номера банковской карты. Для старта считывания из flutter вызывается метод "startSession", который, в свою очередь, вызывает нативный метод "Nfc#startSession". Внутри него все устроено довольно просто:

-3

Теперь нам необходимо немного модифицировать данный код, чтобы мы могли отправить в flutter номер карты.
Для этого сначала в файл
build.gradle добавим импорт соответствующей нативной библиотеки:
implementation 'com.github.devnied.emvnfccard:library:3.0.1'
Затем нам нужно сделать реализацию для интерфейса из этой библиотеки
IProvider, который передает команды на карту. Необходимая для нас реализация выглядит так:

-4

Затем отредактируем непосредственно сам код перед отправкой данных в flutter в "onDiscovered". Для чтения данных карты нам необходимо добавить выше созданную реализацию интерфейса, а также конфиг и парсер. Код выглядит примерно так:

-5

После этого нам необходимо подключиться к карте и считать необходимые для нас данные:

-6

И наконец отправим необходимы для нас данные в flutter, добавив к map полученные данные карты:

-7

Теперь мы можем получать данные карты с NFC.