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)
你应该这样做。
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)
| 归档时间: |
|
| 查看次数: |
2720 次 |
| 最近记录: |