Вызов функции при загрузке с помощью RiverPod и StateNotifiers
Я следил за учебником Resocoder о том, как управлять состояниями с помощью RiverPod и StateNotifier.
Какие у меня поездки, как называть
.getWeather
при начальной загрузке с некоторым, скажем, значением по умолчанию. Пример только иллюстрирует использование
context.read(..)
в
onPressed(..)
функция, рекомендованная в документации к Riverpod.
Но тогда как на самом деле сделать вызов при загрузке, если это будет означать вызов
context.read
в методе сборки, который крайне не рекомендуется. (упоминается в последней части этого раздела )
2 ответа
Потому что
.getWeather
является функцией Future, вы можете добавить будущую инициализацию внутри конструктора
WeatherNotifier
и пусть сам обновит состояние.
final weatherNotifierProvider = StateNotifierProvider(
(ref) => WeatherNotifier(ref.watch(weatherRepositoryProvider)),
);
class WeatherNotifier extends StateNotifier<WeatherState> {
final WeatherRepository _weatherRepository;
WeatherNotifier(this._weatherRepository) : super(WeatherInitial()){
getWeather('some city name'); // add here
}
Future<void> getWeather(String cityName) async {
try {
state = WeatherLoading();
final weather = await _weatherRepository.fetchWeather(cityName);
state = WeatherLoaded(weather);
} on NetworkException {
state = WeatherError("Couldn't fetch weather. Is the device online?");
}
}
}
Посмотрите в
.family
модификатор, вы можете передать данные провайдеру, вернувшему данные/состояние.
https://riverpod.dev/docs/concepts/modifiers/семья
Прослушивание состояния с параметром:
final state = ref.watch(myProvider('my arg'));
Создание провайдера:
myProvider = StateNotifierProvider.family<String>((ref, arg) => "Hello $arg");
Если вы напечатаете состояние, вы получите
print(state); //prints "Hello my arg"