使用 FutureProvider RiverPod 组合 FutureProvider

Ari*_*iel 5 future dart flutter flutter-provider riverpod

我目前正在 Flutter 中制作 Udacity Sunshine 项目。我有两个不同的提供商来获取当前温度和每日预报。

我想合并这两个提供程序并创建一个名为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,
  });
}
Run Code Online (Sandbox Code Playgroud)

文件: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 = FutureProvider<OneCallWeatherData>((ref) async {
  return await WeatherService.getOneCallWeatherData();
});

var currentWeatherProvider = FutureProvider<CurrentWeatherData>((ref) async {
  return await WeatherService.getCurrentWeatherData();
});

final weatherProvider = FutureProvider<WeatherData>((ref) async {
  final currentWeatherData = ref.watch(currentWeatherProvider);

  final onecallWeatherData = ref.watch(oneCallWeatherProvider);

 // How to return WeatherData here??
});
Run Code Online (Sandbox Code Playgroud)

在上面的提供程序中,我尝试从两个未来的提供程序获取数据并获取 currentWeatherData 和 onecallWeatherData 的对象。我想在这里等他们,拿到这两个数据。如果有错误,这两个数据也会发送错误。现在,如何将数据从提供者发送到 UI,以便我可以.when(data:xx, error: xx, loading: xx)在小部件上执行操作并安全地获取这两个数据?

注意:我可以通过创建一个 FutureProvider 并使用 等待两个 future 来获取整个数据,而无需组合提供程序Future.wait()。然而,我正在努力学习如何结合提供者。因此,社区的任何解决方案都受到高度赞赏。

Rém*_*let 18

您可以使用provider.future它来获取Future然后您可以等待

这允许您编写:

final weatherProvider = FutureProvider<WeatherData>((ref) async {
  final currentWeatherData = ref.watch(currentWeatherProvider.future);
  final onecallWeatherData = ref.watch(oneCallWeatherProvider.future);

  return WeatherData(
    oneCallWeatherData: await onecallWeatherData,
    currentWeatherData: await currentWeatherData,
  );
});
Run Code Online (Sandbox Code Playgroud)


Arn*_*nas 0

你应该这样做。

例子:

final weatherProvider = FutureProvider<WeatherData>((ref) async {
  final currentWeatherData = ref.watch(currentWeatherProvider);
  final onecallWeatherData = ref.watch(oneCallWeatherProvider);

  return WeatherData(
    oneCallWeatherData: onecallWeatherData,
    currentWeatherData: currentWeatherData,
  );
});
Run Code Online (Sandbox Code Playgroud)