У приложения нет тега скрипта, поэтому эквивалент — пакет и один вызов; что он вам даёт, смотрите в измерении приложения. Пакет Skomi для Flutter не зависит ни от чего, кроме самого Flutter.
Исходники и демонстрационное приложение, отчитывающееся само о себе, лежат в skomi-sdk-flutter.
Запустите его один раз
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Skomi.start(SkomiOptions(appId: 'your-app-id'));
runApp(const MyApp());
}
Идентификатор приложения берётся в разделе Мои приложения в Skomi. Он не секрет и место ему в вашем исходном коде: он опознаёт приложение, а не удостоверяет его, так же, как идентификатор сайта.
Назовите экраны
// там, где экран становится видимым
Skomi.screen('checkout/review', props: {'tier': 'gold'});
Автоматического захвата имён маршрутов нет, и это намеренно: имя класса виджета — то, как экран называет ваш код, а не то, как вы назвали бы его в отчёте. До 20 свойств на экран: строки, числа, логические значения.
Две вещи, которые Flutter ему сказать не может
Версия вашего приложения. У Flutter нет для неё API на уровне фреймворка, поэтому передайте её сами:
final info = await PackageInfo.fromPlatform(); // package_info_plus
await Skomi.start(SkomiOptions(appId: '…', appVersion: info.version));
Не передадите, и каждый экран отчитается без версии, а панель версий так и скажет, вместо того чтобы гадать: честно и почти бесполезно.
Где живёт очередь без сети. Без пути она ложится во временный каталог приложения. Он приватен для приложения и переживает перезапуск, но операционная система может забрать его под нехватку места; дайте путь к документам, если потерять поставленную в очередь сессию для вас важно.
Что вы получаете, ни о чём не прося
Сессии, экраны, версии приложения, разбивки по платформе, устройству и операционной системе и долю сессий без падений. Очередь переживает отсутствие сети, выход и падение, а каждый экран несёт идентификатор, выданный один раз, так что повторно отправленная пачка опознаётся, а не считается дважды.
Работает на Android, iOS, macOS, Windows и Linux. Сборка для веба компилируется и не собирает ничего, намеренно: приложение Flutter для веба — это сайт, а сайту полагается скрипт.
Ошибки — что он ловит и чего не может
try {
await checkout();
} catch (error, stack) {
Skomi.captureError(error, stack: stack);
showRetry();
}
start подцепляется к FlutterError.onError и PlatformDispatcher.instance.onError, поэтому всё, что вы поставили раньше, продолжает работать. Он ловит ошибки, возникшие внутри фреймворка Flutter, и необработанные ошибки в корневом изоляте.
⚠ Это не система отчётов о падениях и не должна использоваться как таковая. Нативное падение (segfault в C++ какого-нибудь плагина, убийство по нехватке памяти, NSException из канала платформы) убивает тот изолят, который мог бы об этом сообщить. Оставьте для этого Crashlytics, Sentry или собственную отчётность магазина. Skomi добавляет половину со стороны Dart, на одной странице с ошибками, о которых вы сообщаете сами, и долю сессий без падений, которую можно читать рядом с числами выпуска.
Сбои группируются по типу, а не по сообщению: в сообщении есть идентификаторы, пути и суммы, так что группировка по нему даёт по строке на каждый случай и отчёт, который ничего не говорит.
Проверьте, что работает
Запустите приложение, перейдите между двумя экранами и посмотрите в свою панель. Если ничего не пришло, обычные причины — идентификатор не того приложения и start, которого не дождались через await.