Вызов функции при загрузке с помощью 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"
Другие вопросы по тегам