FeedState Enum
Represents the state of a feed as a flags enumeration.
Namespace: DevBitsLab.Feeds
Assembly: DevBitsLab.Feeds.dll
[Flags]
public enum FeedState
Values
| Value | Binary | Description |
|---|---|---|
None |
0000 |
Initial state — no data loaded |
Loading |
0001 |
Currently fetching data |
HasValue |
0010 |
Successfully loaded a value |
HasError |
0100 |
Error occurred during load |
Refreshing |
0011 |
Loading + HasValue |
Retrying |
0101 |
Loading + HasError |
Understanding Flags
FeedState uses [Flags] to allow combined states:
// Refreshing = Loading | HasValue
if (feed.State == FeedState.Refreshing) {
ShowRefreshingOverlay();
}
// Check individual flags
if (feed.State.HasFlag(FeedState.Loading)) {
ShowLoadingIndicator();
}
State Diagram
┌────────────┐
Initial → │ None │ ← No load function
│ (0000) │ or CreateDeferred
└─────┬──────┘
│ RefreshAsync()
▼
┌────────────┐
│ Loading │
│ (0001) │
└──┬─────┬───┘
success │ │ error
▼ ▼
┌───────────┐ ┌───────────┐
│ HasValue │ │ HasError │
│ (0010) │ │ (0100) │
└─────┬─────┘ └─────┬─────┘
│ │
Refresh ───┤ │── Retry
▼ ▼
┌───────────┐ ┌───────────┐
│Refreshing │ │ Retrying │
│ (0011) │ │ (0101) │
└───────────┘ └───────────┘
Checking States
Using Properties (Recommended)
if (feed.IsLoading) // State.HasFlag(Loading)
if (feed.HasValue) // State.HasFlag(HasValue)
if (feed.HasError) // State.HasFlag(HasError)
Using HasFlag
// Check if loading (includes Refreshing, Retrying)
if (feed.State.HasFlag(FeedState.Loading)) {
ShowLoadingIndicator();
}
Exact Match
// Only true during initial load
if (feed.State == FeedState.Loading) {
ShowFullPageSpinner();
}
// Only true when refreshing existing data
if (feed.State == FeedState.Refreshing) {
ShowSubtleRefreshIndicator();
}
Common Patterns
UI State Binding
feed.StateChanged += (s, e) => {
switch (e.NewState) {
case FeedState.None:
ShowEmptyState();
break;
case FeedState.Loading:
ShowFullPageLoader();
break;
case FeedState.HasValue:
ShowContent(feed.Value!);
break;
case FeedState.HasError:
ShowError(feed.Error!);
break;
case FeedState.Refreshing:
ShowContent(feed.Value!);
ShowRefreshIndicator();
break;
case FeedState.Retrying:
ShowError(feed.Error!);
ShowRetryIndicator();
break;
}
};
Layered Loading Indicators
// Full page spinner for initial load only
fullPageSpinner.Visible = feed.State == FeedState.Loading;
// Subtle indicator whenever loading
refreshIndicator.Visible = feed.State.HasFlag(FeedState.Loading);
// Content visible when we have data
content.Visible = feed.State.HasFlag(FeedState.HasValue);
// Error panel when error (but not retrying)
errorPanel.Visible = feed.State == FeedState.HasError;
Detecting Transitions
feed.StateChanged += (s, e) => {
// Load completed successfully
if (e.OldState.HasFlag(FeedState.Loading) &&
e.NewState == FeedState.HasValue) {
OnLoadSuccess();
}
// Error just occurred
if (!e.OldState.HasFlag(FeedState.HasError) &&
e.NewState.HasFlag(FeedState.HasError)) {
OnError(feed.Error!);
}
// Started refreshing
if (e.OldState == FeedState.HasValue &&
e.NewState == FeedState.Refreshing) {
OnRefreshStarted();
}
};
FeedStateChangedEventArgs
Event data for StateChanged events.
public sealed class FeedStateChangedEventArgs : EventArgs {
public FeedState OldState { get; }
public FeedState NewState { get; }
}
Example:
feed.StateChanged += (sender, e) => {
Log.Info($"Feed state: {e.OldState} → {e.NewState}");
};