Flutter Provider通知监听器但未传递数据问题求助
Flutter Provider通知监听器但数据未传递到页面的解决方法
核心问题分析
你的WeatherProvider中,weatherCaller方法里声明了局部变量firstCall和weatherOfToday,这会覆盖类的成员变量,导致接口返回的数据并没有赋值到Provider的状态属性中。虽然你调用了notifyListeners(),但页面监听的成员变量还是初始的空对象,自然拿不到新数据。
修正后的Provider代码
把方法里的var去掉,直接给类的成员变量赋值:
import 'package:flutter/material.dart'; import 'package:weather_app/exthernal/models/first_call_model.dart'; import 'package:weather_app/exthernal/models/w_response_model.dart'; import 'package:weather_app/exthernal/w_service.dart'; class WeatherProvider extends ChangeNotifier { WeatherService firtCaller = WeatherService(); WeatherService weatherCall = WeatherService(); FirstCallModel firstCall = FirstCallModel(); WeatherResponseModel weatherOfToday = WeatherResponseModel(); weatherCaller() async { // 移除var,直接赋值给类成员变量 firstCall = await firtCaller.getFirstCall(); weatherOfToday = await weatherCall.getHttp(); notifyListeners(); } }
额外优化建议
- 异常处理:给异步请求添加try-catch,避免请求失败导致崩溃:
weatherCaller() async { try { firstCall = await firtCaller.getFirstCall(); weatherOfToday = await weatherCall.getHttp(); } catch (e) { print('天气请求失败: $e'); // 可以在这里添加错误状态通知用户 } finally { notifyListeners(); } } - 加载状态:可以在Provider中添加
isLoading变量,页面根据状态显示加载提示,提升体验:
页面中就可以根据bool isLoading = false; weatherCaller() async { isLoading = true; notifyListeners(); try { firstCall = await firtCaller.getFirstCall(); weatherOfToday = await weatherCall.getHttp(); } catch (e) { print('天气请求失败: $e'); } finally { isLoading = false; notifyListeners(); } }value.isLoading显示加载圈:value.isLoading ? CircularProgressIndicator() : Text(value.weatherOfToday.nombre ?? 'empty')
内容的提问来源于stack exchange,提问作者uollas
相关产品推荐
相关产品推荐

