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 在生成过程中调用flatter Mobx-setState()或markNeedsBuild()_Flutter_Mobx - Fatal编程技术网

Flutter 在生成过程中调用flatter Mobx-setState()或markNeedsBuild()

Flutter 在生成过程中调用flatter Mobx-setState()或markNeedsBuild(),flutter,mobx,Flutter,Mobx,当我试图从一个页面导航到另一个页面时,我得到的错误如下。经过一些研究,我发现了一些解决方案,比如在SchedulerBinding.instance.addPostFrameCallback中调用导航,但即使在某些情况下解决了这个问题,对于这种特定情况,它们都不起作用 我正在使用一个IndexedStack,它有三个动画功能,可以包装一个不同的页面。除了错误之外,IndexedStack呈现其内容的方式可能是什么? 似乎是因为它同时呈现所有页面,而只显示当前索引。但是如果我需要在这些状态相同的页

当我试图从一个页面导航到另一个页面时,我得到的错误如下。经过一些研究,我发现了一些解决方案,比如在SchedulerBinding.instance.addPostFrameCallback中调用导航,但即使在某些情况下解决了这个问题,对于这种特定情况,它们都不起作用

我正在使用一个IndexedStack,它有三个动画功能,可以包装一个不同的页面。除了错误之外,IndexedStack呈现其内容的方式可能是什么? 似乎是因为它同时呈现所有页面,而只显示当前索引。但是如果我需要在这些状态相同的页面之间切换,我如何解决这个问题呢?我尝试使用PageView,但当从一个页面更改到另一个页面时,状态为miss

有人能帮我吗

════════ Exception caught by flutter_mobx ══════════════════════════════════════
The following MobXCaughtException was thrown:
setState() or markNeedsBuild() called during build.
This Observer widget cannot be marked as needing to build because the framework is already in the process of building widgets.  A widget can be marked as needing to be built during the build phase only if one of its ancestors is currently building. This exception is allowed because the framework builds parent widgets before children, which means a dirty descendant will always be built. Otherwise, the framework might not visit this widget during this build phase.
The widget on which setState() or markNeedsBuild() was called was:
  Observer
The widget which was currently being built when the offending call was made was:
  AnimatedOpacity

When the exception was thrown, this was the stack
#0      Element.markNeedsBuild.<anonymous closure> 
package:flutter/…/widgets/framework.dart:4167
#1      Element.markNeedsBuild 
package:flutter/…/widgets/framework.dart:4182
#2      ObserverElementMixin.invalidate 
package:flutter_mobx/src/observer_widget_mixin.dart:70
#3      ReactionImpl._run 
package:mobx/…/core/reaction.dart:119
#4      ReactiveContext._runReactionsInternal 
package:mobx/…/core/context.dart:345
...
════════ flutter_mobx捕获异常══════════════════════════════════════
引发了以下MobXCaughtException:
在生成过程中调用setState()或markNeedsBuild()。
无法将此观察者小部件标记为需要构建,因为框架已经在构建小部件的过程中。只有当一个小部件的祖先当前正在构建时,才可以将其标记为需要在构建阶段构建。此异常是允许的,因为框架在子部件之前构建父部件,这意味着将始终构建脏子部件。否则,框架可能不会在构建阶段访问此小部件。
调用setState()或markNeedsBuild()的小部件是:
观察者
发出违规呼叫时当前正在构建的小部件是:
动产能力
当抛出异常时,这是堆栈
#0 Element.markNeedsBuild。
包:flatter/../widgets/framework.dart:4167
#1.Element.markNeedsBuild
包:flatter/../widgets/framework.dart:4182
#2 ObserverElementMixin.invalidate
软件包:flift\u mobx/src/observer\u widget\u mixin。dart:70
#3反应impl.\u运行
包:mobx/../core/reaction.dart:119
#4反应上下文。\u运行反应内部
包:mobx/../core/context.dart:345
...
构建方法:
@覆盖
小部件构建(构建上下文){
返回索引堆栈(
索引:索引,,
儿童:[
动产能力(
key:key('animatedOpacity_0'),
不透明度:指数==0?1.0:0.0,
持续时间:持续时间(毫秒:500),
子项:第1页(),
),
动产能力(
key:key('animatedOpacity_1'),
不透明度:指数==1?1.0:0.0,
持续时间:持续时间(毫秒:500),
子项:第2页(),
),
动产能力(
key:key('animatedOpacity_2'),
不透明度:指数==2?1.0:0.0,
持续时间:持续时间(毫秒:500),
子项:第3页(),
),
],
);
}
更新:


问题发生在第三个AnimatedOpacity上,如果我删除AnimatedOpacity小部件,问题不会发生,但我不知道为什么。有人对此有一些解释吗?

我只能想出一种非常老套的方法,用当前的设置来解决这个问题(那是不值得的)。您是否可以从使用
IndexedStack
切换到
AnimatedSwitcher
?您只需在构建方法中切换它上面使用的子级,它就会将一个子级淡入下一个子级。好吧,这是过渡的一个解决方法,它可能会起作用。但我想知道是什么导致了动画能力的错误。
@override
  Widget build(BuildContext context) {
    return IndexedStack(
      index: index,
      children: <Widget>[
        AnimatedOpacity(
          key: Key('animatedOpacity_0'),
          opacity: index == 0 ? 1.0 : 0.0,
          duration: Duration(milliseconds: 500),
          child: Page1(),
        ),
        AnimatedOpacity(
          key: Key('animatedOpacity_1'),
          opacity: index == 1 ? 1.0 : 0.0,
          duration: Duration(milliseconds: 500),
          child: Page2(),
        ),
        AnimatedOpacity(
          key: Key('animatedOpacity_2'),
          opacity: index == 2 ? 1.0 : 0.0,
          duration: Duration(milliseconds: 500),
          child: Page3(),
        ),
      ],
    );
  }