getUserId method

Future<String> getUserId()

Gets the unique user ID for this device.

This method implements a lazy initialization pattern for user identification:

  • First Call: Generates a new UUID v4 and stores it persistently
  • Subsequent Calls: Returns the existing stored UUID

UUID Format

The generated UUID follows the version 4 specification:

  • Format: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
  • Randomness: 122 bits of cryptographic randomness
  • Collision Probability: Negligible for practical purposes

Storage Behavior

  • Persistence: Survives app restarts, updates, and device reboots
  • Platform Storage: Uses platform-specific secure storage
  • Backup: May be included in device backups (platform-dependent)
  • Clearing: Removed only when app data is cleared or app is uninstalled

Performance Characteristics

  • First Call: ~1-5ms (includes UUID generation and storage)
  • Subsequent Calls: <1ms (simple string retrieval)
  • Memory Usage: Minimal (single string in SharedPreferences cache)

Error Handling

The method is designed to be robust and should not throw exceptions under normal circumstances. However, it may fail if:

  • Device storage is full or corrupted
  • SharedPreferences access is denied by the platform
  • UUID generation fails (extremely rare)

Returns a unique string identifier for this device/user.

Example:

final userId = await userService.getUserId();
print('User ID: $userId');
// Output: User ID: 550e8400-e29b-41d4-a716-446655440000

// Subsequent calls return the same ID
final sameUserId = await userService.getUserId();
assert(userId == sameUserId);

Implementation

Future<String> getUserId() async {
  // Try to get the existing user ID from storage.
  String? userId = _prefs.getString(_userIdKey);

  // If the user ID is not found (null), it's the user's first time.
  if (userId == null) {
    // Generate a new, random, version 4 UUID.
    userId = _uuid.v4();

    // Save the new ID to the device's persistent storage.
    await _prefs.setString(_userIdKey, userId);
    print('New user ID generated and saved: $userId');
  } else {
    print('Existing user ID retrieved: $userId');
  }

  return userId;
}