ابرووا
شروع رایگان
☰ فهرست مستندات · SDK فلاتر

Flutter SDK

ثبت خطاها، breadcrumbها، لاگ‌ها، عملکرد و کرش‌های نیتیو در اپ‌های Flutter روی وب، Android، iOS، دسکتاپ و افزونه‌های Chrome.

Flutter 0.2.5Dart 3.8+Android API 19+iOS 12+به‌روزرسانی: ۵ آبان ۱۴۰۵
راه‌اندازی ساده

راه‌اندازی تنها با چند خط کد

چندسکویی

روی وب، Android، iOS و افزونه‌های Chrome کار می‌کند

ثبت خودکار خطا

خطاهای مدیریت‌نشده را خودکار می‌گیرد

گزارش دستی خطا

ثبت خطاها و پیام‌های دلخواه

تشخیص پلتفرم

پلتفرمی را که اپ روی آن اجرا می‌شود خودکار تشخیص می‌دهد

قابل تنظیم

گزینه‌های پیکربندی انعطاف‌پذیر

زمینه‌ی کامل

افزودن داده‌ی دلخواه، تگ و اطلاعات کاربر به خطاها

Breadcrumbها

ثبت کارهای کاربر و رویدادهای پیش از خطا

لاگ

دریافت لاگ ساخت‌یافته با ارسال دسته‌ای و سطح‌بندی

پایش عملکرد

اندازه‌گیری درخواست‌های 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:

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، هر جا که پروژه‌ی شما مخزن‌ها را فهرست می‌کند):

groovy
allprojects {
    repositories {
        google()
        mavenCentral()
        maven { url "https://center.abrova.ir/api/packages/abrova/maven" }
    }
}

در iOS، این خط را داخل target اپ در ios/Podfile اضافه کنید:

ruby
pod 'AbrovaTrace', :git => 'https://github.com/Abrova-co/abrova-trace-ios-sdk.git', :tag => '0.2.4'

سپس نصب کنید:

bash
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_… را در اپ قرار ندهید.

شروع سریع#

راه‌اندازی پایه

dart
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 است.

dart
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ها

dart
try {
  riskyOperation();
} catch (e, stackTrace) {
  await AbrovaTrace.captureException(
    e,
    stackTrace: stackTrace,
    message: 'Failed to perform risky operation',
    extra: {'user_id': 'user123'},
  );
}

ثبت پیام‌ها

dart
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. پیام‌ها را برای چیزهایی به کار ببرید که اپ عمداً گزارش می‌دهد («پرداخت شروع شد»، «همگام‌سازی تمام شد»)؛ برای داده‌های عیب‌یابی پرحجم از لاگ‌ها استفاده کنید.

زمینه‌ی دلخواه برای خطا

dart
await AbrovaTrace.captureException(
  exception,
  extra: {
    'user_id': 'user123',
    'feature': 'shopping_cart',
    'action': 'checkout',
    'cart_items': 5,
    'total_amount': 99.99,
  },
);

اطلاعات کاربر#

خطاها و لاگ‌ها را به کاربر مشخصی نسبت دهید و metadata دلخواه اضافه کنید. اگر از Abrova Auth استفاده می‌کنید، شناسه‌ی کاربرِ واردشده را بدهید.

تعیین شناسه‌ی کاربر

dart
// Set after user login
AbrovaTrace.setUserId('user_123');

// Get current user ID
final userId = AbrovaTrace.getUserId();

داده‌ی اضافه‌ی دلخواه

dart
// 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();

تگ‌ها

dart
// 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ها کارهای کاربر و رویدادهای منتهی به خطا را ثبت می‌کنند تا بفهمید پیش از کرش چه اتفاقی افتاده است.

dart
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 است — چند بار صدا زدنش مشکلی ندارد.

dart
await AbrovaTrace.initWithZone(
  AbrovaTraceConfig(apiKey: 'ab_live_...'),
  () async {
    WidgetsFlutterBinding.ensureInitialized();

    // Enable automatic tap breadcrumbs
    AbrovaTrace.enableGestureBreadcrumbs();

    runApp(MyApp());
  },
);

چه چیزی ثبت می‌شود

هر لمس روی یک ویجت تعاملیِ شناخته‌شده، breadcrumbی مثل این می‌سازد:

json
{
  "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 اضافه کنید تا بتوانید آن را در کدتان جست‌وجو کنید:

dart
IconButton(
  key: const ValueKey('cart-remove-row-2'),  // ← surfaces in breadcrumb
  icon: const Icon(Icons.delete),
  onPressed: _removeItem,
)

غیرفعال‌سازی

dart
AbrovaTrace.disableGestureBreadcrumbs();
حریم خصوصی.

ردیاب برچسب قابل مشاهده‌ی ویجت را ثبت می‌کند — معمولاً متن دکمه‌ای مثل «Pay» یا «Add to Cart». مقدار فیلدهای فرم، محتوای text field یا هر چیزی که کاربر وارد کرده ثبت نمی‌شود. ValueKey علاوه بر برچسب گزارش می‌شود، نه به‌جای آن؛ پس متن حساس را در برچسب ویجت‌های قابل لمس نگذارید.

لاگ#

دریافت لاگ ساخت‌یافته با ارسال دسته‌ای خودکار و آگاه از چرخه‌ی حیات اپ موبایل. یک بار فعالش کنید و بعد از هر جای اپ از متدهای سطح‌بندی استفاده کنید:

dart
// 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 خودکار

dart
// 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 گزارش می‌دهد. وقتی می‌خواهید یک کلاینت موجود را بپوشانید یا خودتان آن را بسازید، مستقیم از آن استفاده کنید:

dart
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ها در بخش ابرووا تریس › عملکرد نمایش داده می‌شوند.

اندازه‌گیری عملیات دلخواه

dart
final result = await AbrovaTrace.trackOperation(
  'load_user_profile',
  () async {
    final user = await fetchUser();
    await cacheUser(user);
    return user;
  },
  operationType: 'custom',
);

گزارش دستی span

dart
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

dart
void main() async {
  await AbrovaTrace.init(AbrovaTraceConfig(
    apiKey: 'ab_live_your_api_key',
    environment: 'production',
    debug: false, // Disable in production extensions
  ));

  runApp(MyExtensionApp());
}

اپ موبایل

dart
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());
}

اپ وب

dart
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() راه‌اندازی می‌کند:

  1. iOS — کتابخانه‌ی PLCrashReporter کرش‌های ناشی از signal و Mach exception را روی دیسک ذخیره می‌کند
  2. Android — یک handler برای exceptionهای مدیریت‌نشده، به‌علاوه‌ی ApplicationExitInfo (Android 11 / API 30+) برای کرش‌های نیتیو و ANRها
  3. در اجرای بعدی، SDK نیتیو گزارش ذخیره‌شده را می‌خواند و آن را به‌صورت یک مشکل به ابرووا تریس می‌فرستد

به کد اضافه‌ای نیاز نیست. کرش‌ها در اجرای بعدی ارسال می‌شوند، پس کرش بعد از این‌که کاربر اپ را دوباره باز کند ظاهر می‌شود.

خاموش کردن.

متد AbrovaTrace.close() لاگ‌های در صف را ارسال می‌کند و SDK را آزاد می‌کند. برای تشخیص کرش لازم نیست. بعد از close()، فراخوانی‌هایی مثل captureException() خطا می‌دهند تا وقتی که دوباره init() را صدا بزنید؛ پس فقط وقتی صدایش بزنید که اپ واقعاً در حال بسته شدن است.

گزینه‌های پیکربندی#

dart
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
)
گزینهنوعاجباریتوضیح
apiKeyStringبلهکلید API پروژه
environmentStringخیرنام محیط (پیش‌فرض: "production")
releaseStringخیرشناسه‌ی نسخه‌ی اپ
captureUncaughtErrorsboolخیرگرفتن خودکار خطاهای مدیریت‌نشده (پیش‌فرض: true)
enabledboolخیرفعال/غیرفعال کردن SDK (پیش‌فرض: true)
debugboolخیرفعال کردن لاگ‌های debug (پیش‌فرض: false)
timeoutintخیرمهلت درخواست HTTP بر حسب ثانیه (پیش‌فرض: 30)
sampleRatedoubleخیرنرخ نمونه‌برداری ثبت خطا بین 0.0 تا 1.0 (پیش‌فرض: 1.0)
maxBreadcrumbsintخیرحداکثر تعداد breadcrumbهای نگه‌داشته‌شده (پیش‌فرض: 20)
enableOfflineStorageboolخیرخطاهایی را که به‌خاطر آفلاین بودن دستگاه ارسال نمی‌شوند نگه می‌دارد و بعداً می‌فرستد (پیش‌فرض: true؛ نه در وب). بخش «ذخیره‌سازی آفلاین» در پایین را ببینید
collectDeviceInfoboolخیرافزودن اطلاعات دستگاه، سیستم‌عامل و اپ به خطاها و پیام‌ها (پیش‌فرض: true)
apiUrlStringخیرتغییر آدرس API (پیش‌فرض: https://trace.abrova.ir)
logHandlerAbrovaTraceLogCallbackخیردریافت خطوط لاگ داخلی 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 — آدرس صفحه‌ی فعلی (فقط وب)

نمونه‌ی کامل#

dart
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() راه‌اندازی کنید تا همه‌ی خطاها از لحظه‌ی شروع اپ گرفته شوند

از initWithZone استفاده کنید

در اپ‌های production برای گرفتن بهتر خطاهای async از initWithZone استفاده کنید

close() را فقط هنگام بسته شدن صدا بزنید

متد close() لاگ‌ها را ارسال و SDK را خاموش می‌کند؛ تشخیص کرش نیتیو به آن وابسته نیست

شناسه‌ی کاربر را بعد از ورود تنظیم کنید

بعد از ورود، setUserId() را صدا بزنید تا خطاها به کاربران نسبت داده شوند

Breadcrumb اضافه کنید

برای کارهای مهم کاربر (خرید، جابه‌جایی بین صفحه‌ها، ارسال فرم) breadcrumb اضافه کنید

Breadcrumbهای ژست را فعال کنید

برای ثبت خودکار لمس‌ها enableGestureBreadcrumbs() را صدا بزنید. در Flutter Web که stack traceها ممکن است ناقص باشند، این کار حیاتی است

به ویجت‌های مهم ValueKey بدهید

دکمه‌های پرداخت، فیلدهای پرداخت و کارهای کلیدی را با ValueKey مشخص کنید تا در breadcrumbهای لمس قابل شناسایی باشند

برای فیلتر کردن از تگ استفاده کنید

تگ‌هایی مثل team، module یا feature تنظیم کنید تا خطاها را در داشبورد راحت فیلتر کنید

لاگ را زود فعال کنید

لاگ را بلافاصله بعد از init() فعال کنید تا همه‌ی رویدادها از شروع اپ ثبت شوند

محیط‌ها را جدا کنید

با تنظیم environment، خطاهای production، staging و development را از هم جدا کنید

حالت debug را در توسعه روشن کنید

در زمان توسعه debug: true را تنظیم کنید تا لاگ‌های SDK را ببینید و درستی یکپارچگی را بررسی کنید

این صفحه مفید بود؟
گزارش مشکل