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;
}
}