#flutter #dart #future #flutter-provider #riverpod
Вопрос:
В настоящее время я создаю проект Udacity Sunshine в Flutter. У меня есть два разных поставщика для получения текущей температуры и ежедневных прогнозов.
Я хочу объединить двух провайдеров и создать нового единого провайдера под названием weatherProvider.
Файл: weather_data.dart
import 'package:app/models/current_weather_data.dart'; import 'one_call_weather_data.dart'; class WeatherData { final OneCallWeatherData oneCallWeatherData; final CurrentWeatherData currentWeatherData; WeatherData({ required this.oneCallWeatherData, required this.currentWeatherData, }); }
Файл:weather_provider.dart
import 'package:app/models/current_weather_data.dart'; import 'package:app/models/one_call_weather_data.dart'; import 'package:app/services/weather.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; var oneCallWeatherProvider = FutureProviderlt;OneCallWeatherDatagt;((ref) async { return await WeatherService.getOneCallWeatherData(); }); var currentWeatherProvider = FutureProviderlt;CurrentWeatherDatagt;((ref) async { return await WeatherService.getCurrentWeatherData(); }); final weatherProvider = FutureProviderlt;WeatherDatagt;((ref) async { final currentWeatherData = ref.watch(currentWeatherProvider); final onecallWeatherData = ref.watch(oneCallWeatherProvider); // How to return WeatherData here?? });
В вышеперечисленных поставщиках я пытаюсь получить данные от двух будущих поставщиков и получить объекты для currentWeatherData и onecallWeatherData. Я хотел бы дождаться их здесь и получить эти два данные. Эти два данных также отправляют ошибку, если ошибка. Теперь, как отправить данные в пользовательский интерфейс от поставщика, чтобы я мог работать .when(data:xx, error: xx, loading: xx)
с виджетом и безопасно получать обе данные?
Примечание: Я могу получить все данные без объединения поставщиков, создав один поставщик будущего и ожидая использования двух фьючерсов Future.wait()
. Тем не менее, я пытаюсь научиться объединять поставщиков. Таким образом, любое решение сообщества высоко ценится.
Ответ №1:
Вы должны делать это таким образом.
Пример:
final weatherProvider = FutureProviderlt;WeatherDatagt;((ref) async { final currentWeatherData = ref.watch(currentWeatherProvider); final onecallWeatherData = ref.watch(oneCallWeatherProvider); return WeatherData( oneCallWeatherData: onecallWeatherData, currentWeatherData: currentWeatherData, ); });
Ответ №2:
Вы можете использовать provider.future
для получения Future
, которое вы можете затем дождаться
Это позволяет вам писать:
final weatherProvider = FutureProviderlt;WeatherDatagt;((ref) async { final currentWeatherData = ref.watch(currentWeatherProvider.future); final onecallWeatherData = ref.watch(oneCallWeatherProvider.future); return WeatherData( oneCallWeatherData: await onecallWeatherData, currentWeatherData: await currentWeatherData, ); });