Skip to content

✨ Feature Request: Global Default Storage Configuration #1

@moazelsawaf

Description

@moazelsawaf

Hi @SPiercer πŸ‘‹πŸ»

Thank you for creating this excellent package! I think this enhancement would make it even more convenient to use πŸ™πŸ»

πŸ€” Problem

Currently, every Saveable value requires passing the storage parameter:

final counter = Saveable<int>(
  key: 'counter',
  storage: myStorage,  // ← Repetitive πŸ˜“
  defaultValue: 0,
);

final username = Saveable<String>(
  key: 'username',
  storage: myStorage,  // ← Repetitive πŸ˜“
  defaultValue: '',
);

final isLoggedIn = Saveable<bool>(
  key: 'is_logged_in',
  storage: myStorage,  // ← Repetitive πŸ˜“
  defaultValue: false,
);

This becomes verbose and repetitive in apps with many saveable values.

πŸ’‘ Proposed Solution

Configure a default storage once at app startup, while keeping it optional for value-specific overrides:

// Configure once at startup βš™οΈ
void main() async {
  final prefs = await SharedPreferences.getInstance();
  final storage = SharedPreferencesStorage(prefs);
  
  Saveable.setDefaultStorage(storage);  // ← Global configuration ✨
  
  runApp(MyApp());
}

// Use without storage parameter πŸŽ‰
final counter = Saveable<int>(
  key: 'counter',
  defaultValue: 0,
  // storage automatically uses default
);

final username = Saveable<String>(
  key: 'username',
  defaultValue: '',
);

// Override for specific values when needed πŸ”
final secureToken = Saveable<String>(
  key: 'auth_token',
  storage: secureStorage,  // ← Optional override for sensitive data
);

🎯 Benefits

  • Less boilerplate πŸ“‰: No need to pass storage for every value
  • Cleaner code ✨: Focus on the value configuration, not storage plumbing
  • Flexible πŸ”„: Can still override storage for specific values (e.g., secure storage for tokens)
  • Easier refactoring πŸ› οΈ: Change default storage in one place

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions