loadData method
Loads the data.
To get the data it either calls loader function or listen the source stream.
Updates the data state and notify listeners of StatefulData object on changes.
Implementation
Future<void> loadData() async {
if (!_isLoading) {
_error = null;
_isLoading = true;
notifyListeners();
}
try {
// One-time data loading
if (_loader != null) {
_data = await _loader!();
_error = null;
_isLoading = false;
notifyListeners();
}
// Watching on data changes
else if (_source != null) {
await _subscription?.cancel();
_subscription = _source!().listen(
(result) {
_data = result;
_error = null;
_isLoading = false;
notifyListeners();
},
onError: (error) {
_error = StatefulDataError(
message: 'Unexpected error while watching the data',
originalError: error,
);
_isLoading = false;
notifyListeners();
},
cancelOnError: false,
);
} else {
// We should not hit this branch.
throw Exception('StatefulData must have either "loader" or "watcher"');
}
} catch (e) {
_error = StatefulDataError(message: e.toString(), originalError: e);
_isLoading = false;
notifyListeners();
rethrow;
}
}