Flutter SDK
ثبت خطاها، breadcrumbها، لاگها، عملکرد و کرشهای نیتیو در اپهای Flutter روی وب، Android، iOS، دسکتاپ و افزونههای Chrome.
راهاندازی تنها با چند خط کد
روی وب، Android، iOS و افزونههای Chrome کار میکند
خطاهای مدیریتنشده را خودکار میگیرد
ثبت خطاها و پیامهای دلخواه
پلتفرمی را که اپ روی آن اجرا میشود خودکار تشخیص میدهد
گزینههای پیکربندی انعطافپذیر
افزودن دادهی دلخواه، تگ و اطلاعات کاربر به خطاها
ثبت کارهای کاربر و رویدادهای پیش از خطا
دریافت لاگ ساختیافته با ارسال دستهای و سطحبندی
اندازهگیری درخواستهای HTTP و عملیات دلخواه
کرشهای نیتیو را در iOS و Android ثبت میکند و در اجرای بعدی اپ گزارش میدهد
از دستیار هوش مصنوعی استفاده میکنید؟ از دکمهی Copy page for AI در بالای همین صفحه استفاده کنید و متن را در گفتوگو جایگذاری کنید. دستیارهای هوش مصنوعی را ببینید.
پلتفرمهای پشتیبانیشده#
- Flutter Web — پشتیبانی کامل همراه با گرفتن خطاهای JS
- افزونهی Chrome — بهینهشده برای محیط افزونه
- Android — خطاهای Dart بهعلاوهی ثبت کرش نیتیو (SDK نیتیو ابرووا تریس همراه پکیج است)
- iOS — خطاهای Dart بهعلاوهی ثبت کرش نیتیو (SDK نیتیو ابرووا تریس همراه پکیج است)
- دسکتاپ — Windows، macOS و Linux (فقط خطاهای Dart؛ کرش نیتیو ثبت نمیشود)
نصب#
پکیج از Abrova Center میآید، پس به هیچ مخزن پکیج دیگری نیاز ندارید. دو مرحله دارد: پروژه را به مخزن ابرووا وصل کنید و بعد نصب کنید.
۱. پکیج را از مخزن ابرووا اضافه کنید در pubspec.yaml:
# pubspec.yaml
dependencies:
abrova_trace_flutter_sdk:
hosted: https://center.abrova.ir/api/packages/abrova/pub
version: ^0.2.5۲. منبع SDKهای نیتیو را اضافه کنید. این پلاگین برای ثبت کرش از SDKهای نیتیو Android و iOS استفاده میکند.
در Android، مخزن Maven ابرووا را در android/build.gradle اضافه کنید (یا در android/settings.gradle، هر جا که پروژهی شما مخزنها را فهرست میکند):
allprojects {
repositories {
google()
mavenCentral()
maven { url "https://center.abrova.ir/api/packages/abrova/maven" }
}
}در iOS، این خط را داخل target اپ در ios/Podfile اضافه کنید:
pod 'AbrovaTrace', :git => 'https://github.com/Abrova-co/abrova-trace-ios-sdk.git', :tag => '0.2.4'
سپس نصب کنید:
flutter pub get
پیشنیازها: Dart SDK نسخهی 3.8.1 یا بالاتر. Android: نسخهی API 19 (Android 4.4) یا بالاتر. iOS: نسخهی 12.0 یا بالاتر، ساختهشده با Xcode 15.3+ (Swift 5.10). در وب، خطاهای Dart، پیامها، لاگها و عملکرد کار میکنند؛ ثبت کرش نیتیو فقط در Android و iOS است.
از کلید عمومی پروژه، یعنی ab_live_…، در کنسول ابرووا استفاده کنید. قرار دادن آن داخل اپ امن است. هرگز کلید سرور ab_srv_… را در اپ قرار ندهید.
شروع سریع#
راهاندازی پایه
import 'package:flutter/material.dart';
import 'package:abrova_trace_flutter_sdk/abrova_trace_flutter_sdk.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// Initialize AbrovaTrace
await AbrovaTrace.init(AbrovaTraceConfig(
apiKey: 'ab_live_your_api_key',
environment: 'production',
release: '1.0.0',
));
runApp(MyApp());
}روش پیشنهادی: راهاندازی با Zone (گرفتن بهتر خطاها)
با initWithZone خطاهای async هم گرفته میشوند که در غیر این صورت از دست میروند. این روش پیشنهادی برای اپهای production است.
import 'package:flutter/material.dart';
import 'package:abrova_trace_flutter_sdk/abrova_trace_flutter_sdk.dart';
void main() async {
// IMPORTANT: Initialize AbrovaTrace FIRST, before WidgetsFlutterBinding
await AbrovaTrace.initWithZone(
AbrovaTraceConfig(
apiKey: 'ab_live_your_api_key',
environment: 'production',
release: '1.0.0',
captureUncaughtErrors: true,
),
() async {
// Move all initialization inside this callback
WidgetsFlutterBinding.ensureInitialized();
// Any other async initialization goes here
// await Firebase.initializeApp();
// await setupDatabase();
runApp(MyApp());
},
);
}ثبت خطاها#
ثبت Exceptionها
try {
riskyOperation();
} catch (e, stackTrace) {
await AbrovaTrace.captureException(
e,
stackTrace: stackTrace,
message: 'Failed to perform risky operation',
extra: {'user_id': 'user123'},
);
}ثبت پیامها
await AbrovaTrace.captureMessage(
'User completed onboarding',
extra: {'step': 'welcome_screen'},
);
// With a level and tags
await AbrovaTrace.captureMessage(
'API rate limit approaching',
level: MessageLevel.warning,
tags: {'feature': 'sync'},
);پیامها در کنسول، در بخش ابرووا تریس › پیامها، همراه با سطح، پلتفرم، دادههای اضافه و breadcrumbها نمایش داده میشوند. پیامها هیچوقت مشکل (issue) نمیسازند. سطحها: MessageLevel.debug، info (پیشفرض)، warning و error. پیامها را برای چیزهایی به کار ببرید که اپ عمداً گزارش میدهد («پرداخت شروع شد»، «همگامسازی تمام شد»)؛ برای دادههای عیبیابی پرحجم از لاگها استفاده کنید.
زمینهی دلخواه برای خطا
await AbrovaTrace.captureException(
exception,
extra: {
'user_id': 'user123',
'feature': 'shopping_cart',
'action': 'checkout',
'cart_items': 5,
'total_amount': 99.99,
},
);اطلاعات کاربر#
خطاها و لاگها را به کاربر مشخصی نسبت دهید و metadata دلخواه اضافه کنید. اگر از Abrova Auth استفاده میکنید، شناسهی کاربرِ واردشده را بدهید.
تعیین شناسهی کاربر
// Set after user login
AbrovaTrace.setUserId('user_123');
// Get current user ID
final userId = AbrovaTrace.getUserId();دادهی اضافهی دلخواه
// Set individual extra
AbrovaTrace.setExtra('subscription', 'premium');
// Set multiple extras at once
AbrovaTrace.setExtras({
'subscription': 'premium',
'feature_flags': 'dark_mode,beta',
});
// Read extra data
final sub = AbrovaTrace.getExtra('subscription');
final allExtras = AbrovaTrace.getExtras();
// Clear all extras
AbrovaTrace.clearExtras();تگها
// Set individual tag
AbrovaTrace.setTag('team', 'checkout');
// Set multiple tags at once
AbrovaTrace.setTags({
'team': 'checkout',
'module': 'payments',
});
// Read tags
final team = AbrovaTrace.getTag('team');
final allTags = AbrovaTrace.getTags();
// Clear all tags
AbrovaTrace.clearTags();Breadcrumbها#
Breadcrumbها کارهای کاربر و رویدادهای منتهی به خطا را ثبت میکنند تا بفهمید پیش از کرش چه اتفاقی افتاده است.
import 'package:abrova_trace_flutter_sdk/abrova_trace_flutter_sdk.dart';
// User action breadcrumb
AbrovaTrace.addUserBreadcrumb('Added item to cart', data: {
'product_id': 'abc',
'quantity': 2,
});
// Navigation breadcrumb
AbrovaTrace.addNavigationBreadcrumb('HomeScreen', 'ProductDetail');
// HTTP request breadcrumb
AbrovaTrace.addHttpBreadcrumb('POST', 'https://api.example.com/orders', statusCode: 201);
// Generic breadcrumb
AbrovaTrace.addBreadcrumb(
'Order placed',
type: BreadcrumbType.info,
data: {'order_id': '12345', 'total': 99.99},
);
// Clear all breadcrumbs
AbrovaTrace.clearBreadcrumbs();ثبت خودکار لمسها (Breadcrumbهای ژست)#
هر لمس کاربر را خودکار بهصورت breadcrumb ثبت کنید. این قابلیت روی همهی targetهای Flutter کار میکند — وب، Android، iOS، macOS، Windows و Linux — چون به pointer router خود فریمورک وصل میشود، نه به کد پلتفرم.
وقتی خطایی رخ میدهد، جزئیات مشکل نشان میدهد کاربر درست پیش از آن روی کدام ویجت زده است — معمولاً همین برای بازتولید باگ کافی است، حتی بدون stack trace کامل. این مخصوصاً در Flutter Web مفید است، چون بهخاطر inline شدن کد توسط dart2js ممکن است stack traceهای production فقط تا حدی symbolicate شوند.
فعالسازی
یک بار بعد از init و بعد از WidgetsFlutterBinding.ensureInitialized() صدا بزنید. این متد idempotent است — چند بار صدا زدنش مشکلی ندارد.
await AbrovaTrace.initWithZone(
AbrovaTraceConfig(apiKey: 'ab_live_...'),
() async {
WidgetsFlutterBinding.ensureInitialized();
// Enable automatic tap breadcrumbs
AbrovaTrace.enableGestureBreadcrumbs();
runApp(MyApp());
},
);چه چیزی ثبت میشود
هر لمس روی یک ویجت تعاملیِ شناختهشده، breadcrumbی مثل این میسازد:
{
"message": "Tap on ElevatedButton: \"Pay\"",
"type": "user",
"timestamp": "2026-05-15T14:32:18.421Z",
"data": {
"action": "tap",
"widget": "ElevatedButton",
"label": "Pay",
"key": "checkout-pay-button",
"path": "CheckoutPage > Scaffold",
"route": "/checkout",
"position": { "x": 187, "y": 614 }
}
}فیلد route وقتی پر میشود که AbrovaTraceNavigatorObserver() را به navigatorObservers اپ اضافه کنید (این observer breadcrumbهای جابهجایی بین صفحهها را هم خودکار ثبت میکند).
ویجتهای شناختهشده
ردیاب این نوع ویجتها را بدون تنظیم اضافه تشخیص میدهد (نوعهای مشخصتر اولویت دارند):
- ElevatedButton
- TextButton
- OutlinedButton
- FilledButton
- IconButton
- FloatingActionButton
- Switch
- Checkbox
- Radio
- Slider
- PopupMenuButton
- DropdownButton
- InkWell
- InkResponse
- GestureDetector
- CupertinoButton
نکته: به ویجتهای مهم ValueKey بدهید
Breadcrumb برچسب را به این ترتیب پیدا میکند: فرزند Text ← Semantics.label ← Tooltip.message ← Icon.semanticLabel.
برای ویجتهای بدون متن (مثل IconButton) یک ValueKey اضافه کنید تا بتوانید آن را در کدتان جستوجو کنید:
IconButton(
key: const ValueKey('cart-remove-row-2'), // ← surfaces in breadcrumb
icon: const Icon(Icons.delete),
onPressed: _removeItem,
)غیرفعالسازی
AbrovaTrace.disableGestureBreadcrumbs();
ردیاب برچسب قابل مشاهدهی ویجت را ثبت میکند — معمولاً متن دکمهای مثل «Pay» یا «Add to Cart». مقدار فیلدهای فرم، محتوای text field یا هر چیزی که کاربر وارد کرده ثبت نمیشود. ValueKey علاوه بر برچسب گزارش میشود، نه بهجای آن؛ پس متن حساس را در برچسب ویجتهای قابل لمس نگذارید.
لاگ#
دریافت لاگ ساختیافته با ارسال دستهای خودکار و آگاه از چرخهی حیات اپ موبایل. یک بار فعالش کنید و بعد از هر جای اپ از متدهای سطحبندی استفاده کنید:
// Enable logging after AbrovaTrace.init()
AbrovaTrace.enableLogging(sourceId: 'my-flutter-app');
AbrovaTrace.info('User login successful', metadata: {'user_id': 'user_123'});برای جزئیات کامل — ارسال دستهای، سطحهای لاگ، ارسال در پسزمینه، flush دستی و پیکربندی — صفحهی لاگ در Flutter SDK را ببینید.
پایش عملکرد#
زمان پاسخ درخواستهای HTTP و عملیات دلخواه را برای APM اندازه بگیرید.
کلاینت HTTP خودکار
// Create an HTTP client that automatically tracks all requests
final client = AbrovaTrace.createPerformanceClient();
final response = await client.get(Uri.parse('https://api.example.com/users'));
// Duration, status code, and errors are automatically reportedمتد createPerformanceClient() همان گزینههای PerformanceHttpClient (پایینتر) را میگیرد و کلید API، آدرس API، environment، release و پلتفرم را از پیکربندی پر میکند: inner، addBreadcrumbs (پیشفرض true)، excludedHosts و minDurationMs (پیشفرض 0).
PerformanceHttpClient
کلاس PerformanceHttpClient یک http.BaseClient (از package:http) است که زمان هر درخواست را اندازه میگیرد و آن را بهصورت یک span از نوع http گزارش میدهد. وقتی میخواهید یک کلاینت موجود را بپوشانید یا خودتان آن را بسازید، مستقیم از آن استفاده کنید:
import 'package:http/http.dart' as http;
import 'package:abrova_trace_flutter_sdk/abrova_trace_flutter_sdk.dart';
final client = PerformanceHttpClient(
apiKey: 'ab_live_...', // Required
environment: 'production',
releaseVersion: '1.0.0',
inner: http.Client(), // Default: a new http.Client()
addBreadcrumbs: true, // Also add HTTP breadcrumbs (default: true)
excludedHosts: {'analytics.example.com'}, // Hosts to skip
minDurationMs: 50, // Skip requests faster than this (default: 0)
);
final response = await client.get(Uri.parse('https://api.example.com/users'));
// Or wrap an existing client
final tracked = http.Client().withPerformanceTracking(apiKey: 'ab_live_...');
// Send buffered spans now, and stop the client when done
await client.flush();
client.close();Spanها بافر میشوند و در دستههای ۱۰تایی یا هر ۱۰ ثانیه ارسال میشوند. درخواستها به hostهای ابرووا هیچوقت اندازهگیری نمیشوند. در آدرس breadcrumbها، پارامترهای حساس query (token، password، api_key و …) با [REDACTED] جایگزین میشوند. Spanها در بخش ابرووا تریس › عملکرد نمایش داده میشوند.
اندازهگیری عملیات دلخواه
final result = await AbrovaTrace.trackOperation(
'load_user_profile',
() async {
final user = await fetchUser();
await cacheUser(user);
return user;
},
operationType: 'custom',
);گزارش دستی span
final start = DateTime.now();
// Report a single performance span
await AbrovaTrace.reportPerformanceSpan(
PerformanceSpan.fromHttpRequest(
method: 'GET',
url: 'https://api.example.com/products',
statusCode: 200,
startTime: start,
durationMs: 245,
),
);
// Report a batch of spans
await AbrovaTrace.reportPerformanceSpanBatch([
PerformanceSpan.fromHttpRequest(
method: 'GET',
url: '/api/users',
statusCode: 200,
startTime: start,
durationMs: 150,
),
PerformanceSpan.custom(
operation: 'image_processing',
startTime: start,
durationMs: 800,
),
]);استفاده بر اساس پلتفرم#
افزونهی Chrome
void main() async {
await AbrovaTrace.init(AbrovaTraceConfig(
apiKey: 'ab_live_your_api_key',
environment: 'production',
debug: false, // Disable in production extensions
));
runApp(MyExtensionApp());
}اپ موبایل
void main() async {
// Required before init() on Android and iOS
WidgetsFlutterBinding.ensureInitialized();
await AbrovaTrace.init(AbrovaTraceConfig(
apiKey: 'ab_live_your_api_key',
environment: 'production',
captureUncaughtErrors: true, // Recommended for mobile
));
runApp(MyMobileApp());
}اپ وب
void main() async {
await AbrovaTrace.init(AbrovaTraceConfig(
apiKey: 'ab_live_your_api_key',
environment: 'production',
debug: kDebugMode, // Enable debug in development
));
runApp(MyWebApp());
}تشخیص کرش#
ابرووا تریس برای هر اپ Flutter، فارغ از کتابخانهها یا کد نیتیوی که استفاده میکنید، تشخیص کامل خطا فراهم میکند.
- Exceptionهای Dart — بهصورت لحظهای ثبت میشوند
- خطاهای async — بهصورت لحظهای ثبت میشوند (با initWithZone)
- Exceptionهای پلتفرم — بهصورت لحظهای ثبت میشوند
- کرشهای نیتیو — فقط در iOS و Android؛ در اجرای بعدی اپ گزارش میشوند
تشخیص کرش نیتیو چطور کار میکند
این پلاگین SDKهای نیتیو ابرووا تریس را برای iOS و Android همراه خود دارد و آنها را هنگام init() / initWithZone() راهاندازی میکند:
- iOS — کتابخانهی PLCrashReporter کرشهای ناشی از signal و Mach exception را روی دیسک ذخیره میکند
- Android — یک handler برای exceptionهای مدیریتنشده، بهعلاوهی
ApplicationExitInfo(Android 11 / API 30+) برای کرشهای نیتیو و ANRها - در اجرای بعدی، SDK نیتیو گزارش ذخیرهشده را میخواند و آن را بهصورت یک مشکل به ابرووا تریس میفرستد
به کد اضافهای نیاز نیست. کرشها در اجرای بعدی ارسال میشوند، پس کرش بعد از اینکه کاربر اپ را دوباره باز کند ظاهر میشود.
متد AbrovaTrace.close() لاگهای در صف را ارسال میکند و SDK را آزاد میکند. برای تشخیص کرش لازم نیست. بعد از close()، فراخوانیهایی مثل captureException() خطا میدهند تا وقتی که دوباره init() را صدا بزنید؛ پس فقط وقتی صدایش بزنید که اپ واقعاً در حال بسته شدن است.
گزینههای پیکربندی#
AbrovaTraceConfig(
apiKey: 'ab_live_your_api_key', // Required
environment: 'production', // Default: 'production'
release: '1.0.0', // Optional
captureUncaughtErrors: true, // Default: true
enabled: true, // Default: true
debug: false, // Default: false
timeout: 30, // Default: 30 seconds
sampleRate: 1.0, // 0.0 to 1.0
maxBreadcrumbs: 20, // Default: 20
enableOfflineStorage: true, // Default: true
collectDeviceInfo: true, // Default: true
logHandler: (level, message, error, stackTrace) {}, // Optional
)| گزینه | نوع | اجباری | توضیح |
|---|---|---|---|
| apiKey | String | بله | کلید API پروژه |
| environment | String | خیر | نام محیط (پیشفرض: "production") |
| release | String | خیر | شناسهی نسخهی اپ |
| captureUncaughtErrors | bool | خیر | گرفتن خودکار خطاهای مدیریتنشده (پیشفرض: true) |
| enabled | bool | خیر | فعال/غیرفعال کردن SDK (پیشفرض: true) |
| debug | bool | خیر | فعال کردن لاگهای debug (پیشفرض: false) |
| timeout | int | خیر | مهلت درخواست HTTP بر حسب ثانیه (پیشفرض: 30) |
| sampleRate | double | خیر | نرخ نمونهبرداری ثبت خطا بین 0.0 تا 1.0 (پیشفرض: 1.0) |
| maxBreadcrumbs | int | خیر | حداکثر تعداد breadcrumbهای نگهداشتهشده (پیشفرض: 20) |
| enableOfflineStorage | bool | خیر | خطاهایی را که بهخاطر آفلاین بودن دستگاه ارسال نمیشوند نگه میدارد و بعداً میفرستد (پیشفرض: true؛ نه در وب). بخش «ذخیرهسازی آفلاین» در پایین را ببینید |
| collectDeviceInfo | bool | خیر | افزودن اطلاعات دستگاه، سیستمعامل و اپ به خطاها و پیامها (پیشفرض: true) |
| apiUrl | String | خیر | تغییر آدرس API (پیشفرض: https://trace.abrova.ir) |
| logHandler | AbrovaTraceLogCallback | خیر | دریافت خطوط لاگ داخلی SDK (level، message، error، stackTrace) |
ذخیرهسازی آفلاین
وقتی enableOfflineStorage روشن باشد (پیشفرض)، خطاهایی که بهخاطر آفلاین بودن دستگاه ارسال نمیشوند روی دستگاه نگه داشته میشوند و بعداً ارسال میشوند. فقط خطاها نگه داشته میشوند — پیامها، لاگها و دادههای عملکرد روی دیسک ذخیره نمیشوند.
- خطاهای نیتیو (Android، iOS) — این گزینه به SDKهای نیتیو همراه پکیج داده میشود که تا ۱۰۰ خطای ارسالنشده را نگه میدارند و بعداً میفرستند. به نسخهی 0.2.5 یا بالاتر نیاز دارد.
- خطاهای Dart — وقتی ارسال با خطای شبکه یا timeout شکست بخورد، خطا در یک فایل ذخیره میشود (تا ۱۰۰ مورد؛ قدیمیترها اول حذف میشوند) و دفعهی بعد که اپ اجرا شود دوباره ارسال میشود؛ هم با
AbrovaTrace.init()و هم باAbrovaTrace.initWithZone()(برایinitWithZone()نسخهی 0.2.5 یا بالاتر لازم است). خطای ذخیرهشدهای که سرور برای همیشه رد کند، بهجای تلاش دوباره در هر اجرا، حذف میشود؛ اما اگر سرور بخواهد بعداً دوباره تلاش شود (HTTP 408، 429) یا خودش مشکل داشته باشد (5xx)، نگه داشته میشود. - وب — چیزی ذخیره نمیشود.
نسخهی 0.2.5 ممکن است هنگام شروع، وقتی از initWithZone() همراه با WidgetsFlutterBinding.ensureInitialized() داخل تابع اپ استفاده میکنید، پیام AbrovaTrace: Failed to initialize offline storage: Binding has not yet been initialized را چاپ کند. این پیام بیخطر است: ذخیرهسازی آفلاین بهمحض اجرای اپ راه میافتد.
اطلاعاتی که همراه خطا ثبت میشود#
SDK این اطلاعات را خودکار همراه هر خطا ثبت میکند:
- پیام خطا — پیام exception یا پیام دلخواه
- Stack trace — stack trace کامل برای عیبیابی
- پلتفرم — پلتفرم تشخیصدادهشده (flutter_web، flutter_android و …)
- محیط — نام محیط (production، development و …)
- Release — شناسهی نسخه/release اپ
- زمان — زمان وقوع خطا
- شناسهی کاربر، شناسهی نشست، extraها، تگها و breadcrumbها — هر چیزی که روی SDK تنظیم کردهاید
- اطلاعات دستگاه — مدل دستگاه، سیستمعامل و نسخهی آن، نسخه و build اپ (وقتی
collectDeviceInfoروشن است؛ در وب فقط locale و منطقهی زمانی) - User Agent — نسخهی SDK، پلتفرم و release (در وب، user agent مرورگر)
- URL — آدرس صفحهی فعلی (فقط وب)
نمونهی کامل#
import 'package:flutter/material.dart';
import 'package:abrova_trace_flutter_sdk/abrova_trace_flutter_sdk.dart';
void main() async {
await AbrovaTrace.initWithZone(
AbrovaTraceConfig(
apiKey: 'ab_live_your_api_key',
environment: const String.fromEnvironment('ENV', defaultValue: 'development'),
release: '1.0.0',
captureUncaughtErrors: true,
sampleRate: 1.0,
maxBreadcrumbs: 20,
enableOfflineStorage: true,
debug: true,
),
() async {
WidgetsFlutterBinding.ensureInitialized();
// Auto-capture taps as breadcrumbs (all platforms)
AbrovaTrace.enableGestureBreadcrumbs();
// Enable logging
AbrovaTrace.enableLogging(
sourceId: 'my-flutter-app',
sourceName: 'My Flutter App',
);
runApp(MyApp());
},
);
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
home: HomeScreen(),
);
}
}
class HomeScreen extends StatefulWidget {
const HomeScreen({super.key});
@override
State<HomeScreen> createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
@override
void initState() {
super.initState();
AbrovaTrace.setUserId('user_123');
AbrovaTrace.setTag('screen', 'HomeScreen');
AbrovaTrace.addNavigationBreadcrumb('Launch', 'HomeScreen');
}
Future<void> _handlePurchase() async {
AbrovaTrace.addUserBreadcrumb('Initiated purchase', data: {'product': 'Premium'});
try {
await AbrovaTrace.trackOperation('process_purchase', () async {
await processPurchase();
});
AbrovaTrace.info('Purchase successful', metadata: {'amount': 99.99});
} catch (e, stackTrace) {
await AbrovaTrace.captureException(
e,
stackTrace: stackTrace,
message: 'Purchase failed',
extra: {'user_id': 'user_123', 'screen': 'HomeScreen'},
);
}
}
Future<void> processPurchase() async {
// ... purchase logic
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('My App')),
body: Center(
child: ElevatedButton(
onPressed: _handlePurchase,
child: const Text('Purchase'),
),
),
);
}
}توصیهها#
ابرووا تریس را پیش از runApp() راهاندازی کنید تا همهی خطاها از لحظهی شروع اپ گرفته شوند
در اپهای production برای گرفتن بهتر خطاهای async از initWithZone استفاده کنید
متد close() لاگها را ارسال و SDK را خاموش میکند؛ تشخیص کرش نیتیو به آن وابسته نیست
بعد از ورود، setUserId() را صدا بزنید تا خطاها به کاربران نسبت داده شوند
برای کارهای مهم کاربر (خرید، جابهجایی بین صفحهها، ارسال فرم) breadcrumb اضافه کنید
برای ثبت خودکار لمسها enableGestureBreadcrumbs() را صدا بزنید. در Flutter Web که stack traceها ممکن است ناقص باشند، این کار حیاتی است
دکمههای پرداخت، فیلدهای پرداخت و کارهای کلیدی را با ValueKey مشخص کنید تا در breadcrumbهای لمس قابل شناسایی باشند
تگهایی مثل team، module یا feature تنظیم کنید تا خطاها را در داشبورد راحت فیلتر کنید
لاگ را بلافاصله بعد از init() فعال کنید تا همهی رویدادها از شروع اپ ثبت شوند
با تنظیم environment، خطاهای production، staging و development را از هم جدا کنید
در زمان توسعه debug: true را تنظیم کنید تا لاگهای SDK را ببینید و درستی یکپارچگی را بررسی کنید