You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
📦 Constants: noFlags for empty state, all for combined flags
Use Cases
Bitmask flags are ideal when you need to store multiple boolean options in a single integer value. Common scenarios include:
🔐 File/Resource Permissions
enumPermissionwithEnumFlag { read, write, execute, delete }
// Store user permissions in a single int (e.g., in a database)final adminPermissions =Permission.values.all; // 15final guestPermissions = [Permission.read].flag; // 1// Check accessif (userPermissions.hasFlag(Permission.write)) {
// Allow editing
}
👥 User Roles & Capabilities
enumRolewithEnumFlag { viewer, editor, moderator, admin }
// Users can have multiple rolesfinal userRoles = [Role.editor, Role.moderator].flag;
if (userRoles.hasAnyFlag([Role.admin, Role.moderator])) {
// Show moderation panel
}
🚀 Feature Flags
enumFeaturewithEnumFlag { darkMode, notifications, analytics, betaFeatures }
// Enable features per user or environmentvar enabledFeatures = noFlags;
enabledFeatures = enabledFeatures.addFlag(Feature.darkMode);
enabledFeatures = enabledFeatures.addFlag(Feature.notifications);
// Check feature availabilityif (enabledFeatures.hasFlag(Feature.betaFeatures)) {
// Show experimental UI
}
🎮 Game States & Attributes
enumStatusEffectwithEnumFlag { poisoned, burning, frozen, stunned, blessed }
// Apply multiple status effects to a charactervar playerStatus = noFlags;
playerStatus = playerStatus.addFlag(StatusEffect.poisoned);
playerStatus = playerStatus.addFlag(StatusEffect.burning);
// Check and display active effectsprint('Active: ${playerStatus.describeFlags(StatusEffect.values)}');
// Output: 'Active: poisoned | burning'// Remove effect when healed
playerStatus = playerStatus.removeFlag(StatusEffect.poisoned);
📡 API Response Filtering
enumIncludeFieldwithEnumFlag { metadata, timestamps, relations, stats }
// Client requests specific fieldsfinal requestedFields = [IncludeField.metadata, IncludeField.stats].flag;
// Server checks what to includeif (requestedFields.hasFlag(IncludeField.relations)) {
// Load and include related entities
}
final flags =3;
List<Permission> active = flags.getFlags(Permission.values);
print(active); // [Permission.read, Permission.write]
Manipulating Flags
var flags = noFlags; // Start with no flags (0)
flags = flags.addFlag(Permission.read); // 1
flags = flags.addFlag(Permission.write); // 3
flags = flags.removeFlag(Permission.read); // 2
flags = flags.toggleFlag(Permission.write); // 0
Bulk Operations
// Add multiple flags at oncevar flags = noFlags.addFlags([Permission.read, Permission.write, Permission.execute]); // 7// Remove multiple flags at once
flags = flags.removeFlags([Permission.read, Permission.execute]); // 2// Toggle multiple flags at once
flags = flags.toggleFlags([Permission.write, Permission.delete]); // 8
Null-Safe Operations
int? userFlags =getUserFromDatabase()?.permissions; // May be null// Safe flag checking (returns false if null)if (userFlags.hasFlagOrFalse(Permission.read)) {
// User has read permission
}
// Safe with multiple flags
userFlags.hasAnyFlagOrFalse([Permission.read, Permission.write]); // false if null
userFlags.hasAllFlagsOrFalse([Permission.read, Permission.write]); // false if null// Get value or default to noFlagsfinal safeFlags = userFlags.orNoFlags(); // 0 if null