Объединение поставщиков Futureprovider с помощью речного модуля FutureProvider

#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,  ); });