Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 颤振-如何使用ChangeNotifier正确获取数据_Flutter_Dart_Flutter Provider - Fatal编程技术网

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

  • 使用类型数据定义值通知程序
  • 然后,如果数据已经获取,则更改该值
  • 或者在我的例子中,我通常使用listen状态的值通知程序

    _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(
    天气:价值,
    ),
    ),
    
    以下是我使用值通知程序获取数据的最佳实践

  • 使用类型数据定义值通知程序
  • 然后,如果数据已经获取,则更改该值
  • 或者在我的例子中,我通常使用listen状态的值通知程序

    _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(){