Flutter 颤振-如何使用ChangeNotifier正确获取数据
我想在应用程序运行后获取整个应用程序的天气统计数据 我的Flutter 颤振-如何使用ChangeNotifier正确获取数据,flutter,dart,flutter-provider,Flutter,Dart,Flutter Provider,我想在应用程序运行后获取整个应用程序的天气统计数据 我的变更通知程序: class WeatherStatsNotifier扩展了ChangeNotifier{ 天气服务天气服务; 未来统计数据; WeatherStatsNotifier({this.weatherService}); 未来获取统计数据=>\u统计数据; void refreshtstats(){ _stats=weatherService.fetchWeatherStats(); notifyListeners();//当我删
变更通知程序
:
class WeatherStatsNotifier扩展了ChangeNotifier{
天气服务天气服务;
未来统计数据;
WeatherStatsNotifier({this.weatherService});
未来获取统计数据=>\u统计数据;
void refreshtstats(){
_stats=weatherService.fetchWeatherStats();
notifyListeners();//当我删除这一行时,它会工作
}
}
我的主文件:
final WeatherService WeatherService=new WeatherService();
void main()=>runApp(ChangeNotifierProvider(
创建:(上下文)=>WeatherStatsNotifier(weatherService:weatherService),
child:App());
类应用程序扩展StatefulWidget{
@凌驾
_AppState createState();
}
类_AppState扩展了状态{
@凌驾
void didChangeDependencies(){
Provider.of(context,listen:false).refreshStats();
super.didChangeDependencies();
}
//…构建方法
}
在更深的地方:
@覆盖
小部件构建(构建上下文){
退货消费者(
生成器:(上下文、值、子级){
回归未来建设者(
future:value.stats,
生成器:(上下文,快照){
返回_buildForSnapshot(快照);
},
);
},
);
}
最后我得到一个错误:
======== Exception caught by widgets library =======================================================
The following assertion was thrown building ChangeNotifierProvider<WeatherStatsNotifier>(message: 'package:flutter/src/widgets/framework.dart': Failed assertion: line 4195 pos 12: '!_dirty': is not true.\nSee also: https://flutter.dev/docs/testing/errors, dirty, renderObject: RenderErrorBox#c84e8 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE DETACHED):
'package:flutter/src/widgets/framework.dart': Failed assertion: line 4195 pos 12: '!_dirty': is not true.
=======小部件库捕获的异常=======================================================
生成ChangeNotifierProvider时引发了以下断言(消息:“package:flatter/src/widgets/framework.dart”:失败的断言:第4195行位置12:“!\u dirty”:不正确。\n另请参阅:https://flutter.dev/docs/testing/errors,脏,RenderRobject:RenderRorBox#c84e8需要-布局需要-绘制需要-合成-位-更新分离):
“package:flatter/src/widgets/framework.dart”:失败的断言:第4195行位置12:“_这不是真的。
如何以正确的方式做这件事?我是否能够在
initState
或didChangeDependencies
中使用context
_weatherBloc.listen(
(state) {
if (state is weatherLoadedState) {
_weatherStatsNotifier.value = state.weather;
}
},
);
4.使用数据作为数据字符串的返回
ValueListenableBuilder<String>(
valueListenable: _weatherStatsNotifier,
builder: (context, value, _) => NextScreen(
Weather: value,
),
),
ValueListenableBuilder(
valueListenable:\u weatherStatsNotifier,
生成器:(上下文,值,)=>NextScreen(
天气:价值,
),
),
以下是我使用值通知程序获取数据的最佳实践
_weatherBloc.listen(
(state) {
if (state is weatherLoadedState) {
_weatherStatsNotifier.value = state.weather;
}
},
);
4.使用数据作为数据字符串的返回
ValueListenableBuilder<String>(
valueListenable: _weatherStatsNotifier,
builder: (context, value, _) => NextScreen(
Weather: value,
),
),
ValueListenableBuilder(
valueListenable:\u weatherStatsNotifier,
生成器:(上下文,值,)=>NextScreen(
天气:价值,
),
),
考虑将您的方法包装在SchedulerBinding.instance.addPostFrameCallback中,以便在下一帧调用该方法,而不仅仅是在重建小部件时调用该方法
class _AppState extends State<App> {
@override
void didChangeDependencies() {
SchedulerBinding.instance.addPostFrameCallback((timeStamp) {
Provider.of<WeatherStatsNotifier>(context, listen: false).refreshStats();
}
super.didChangeDependencies();
}
});
class\u AppState扩展状态{
@凌驾
void didChangeDependencies(){
SchedulerBinding.instance.addPostFrameCallback((时间戳){
Provider.of(context,listen:false).refreshStats();
}
super.didChangeDependencies();
}
});
考虑将您的方法包装在SchedulerBinding.instance.addPostFrameCallback中,以便在下一帧调用该方法,而不仅仅是在重建小部件时调用该方法
class _AppState extends State<App> {
@override
void didChangeDependencies() {
SchedulerBinding.instance.addPostFrameCallback((timeStamp) {
Provider.of<WeatherStatsNotifier>(context, listen: false).refreshStats();
}
super.didChangeDependencies();
}
});
class\u AppState扩展状态{
@凌驾
void didChangeDependencies(){
SchedulerBinding.instance.addPostFrameCallback((时间戳){
Provider.of(context,listen:false).refreshStats();
}
super.didChangeDependencies();
}
});
当依赖项发生变化时,即WeatherStatsNotifier,didChangeDependencies
被调用。小部件已经被认为是脏的,并且正在进行构建(可以有多个侦听器)
但是,您的refreshStats
正在同步通知侦听器,这意味着应该重新构建侦听器,但它们已经在构建了。这可能会导致帧中的不一致性,因此这是一个错误。这也是为什么要删除这个notifyListeners()代码>正在“修复”问题
修复它的方法是通过addPostFrameCallback
或Future.microtask
异步执行更改
@override
void didChangeDependencies() {
super.didChangeDependencies();
Future.microtask(() {
Provider.of<WeatherStatsNotifier>(context, listen: false).refreshStats();
});
}
@覆盖
void didChangeDependencies(){
super.didChangeDependencies();
Future.microtask(){
Provider.of(context,listen:false).refreshStats();
});
}
请注意,如果您有多个依赖项,您可能应该检查实例是否在didChangeDependencies
中发生了更改。当依赖项发生更改时,即WeatherStatsNotifier,调用了didChangeDependencies
。小部件已经被认为是脏的,并且正在进行构建(可以有多个侦听器)
但是,您的refreshStats
正在同步通知侦听器,这意味着应该重新构建侦听器,但它们已经在构建了。这可能会导致帧中的不一致性,因此这是一个错误。这也是为什么要删除这个notifyListeners()代码>正在“修复”问题
修复它的方法是通过addPostFrameCallback
或Future.microtask
异步执行更改
@override
void didChangeDependencies() {
super.didChangeDependencies();
Future.microtask(() {
Provider.of<WeatherStatsNotifier>(context, listen: false).refreshStats();
});
}
@覆盖
void didChangeDependencies(){
super.didChangeDependencies();
Future.microtask(){