在null

时间:2019-10-23 17:33:48

标签: flutter dart

我正在为儿童创建一个应用程序。它具有菜单屏幕,从中可以通过单击相应的按钮进入不同的游戏。游戏结束后,开始播放星星动画。动画制作完成后,我希望我的应用返回菜单屏幕。这是问题所在。动画结束时,我会收到以下错误消息:在null上调用了getter'userGestureInProgress'。此外,没有堆栈跟踪,因此我无法确定此错误的确切发生位置。

这是我的代码:

class OddOneOutPage extends StatefulWidget {
 @override
 State<StatefulWidget> createState() {
 return OddOneOutPageState();
 }
}

class OddOneOutPageState extends State<OddOneOutPage>
with SingleTickerProviderStateMixin {
  Widget _pageContent;
  ValueNotifier<bool>_animationFinished;
  Particles particles;
  bool _gameFinished = false;

  @override
  void initState() {
    super.initState();
   _animationFinished = ValueNotifier(false);

   _animationFinished.addListener(() {
      if(_animationFinished.value) {
        Navigator.pop(context); // this line causes a problem
      }
   });

   particles = Particles(30, _animationFinished);
  }

  @override
  Widget build(BuildContext context) {
    Widget body;

  // some code to check if game is finished

    if (_gameFinished) {
      body = Stack(
        children: <Widget>[
          AnimatedSwitcher(
            duration: Duration(milliseconds: 300),
            child: _pageContent,
          ),
          Positioned.fill(child: particles)
        ],
      );
    } else {
      body = AnimatedSwitcher(
          duration: Duration(milliseconds: 300), child: _pageContent);
    }
    return Scaffold(
      appBar: AppBar(
        title: Text(MyLocalizations.of(context, StringKeys.oddOneOut)),
      ),
      body: body,
    ),
  );
}

以下是例外日志:

════════动画库捕获到异常═══════════════════════

在通知AnimationController的状态侦听器时引发了以下断言: 在框架中按计划进行构建。

在构建,布局和绘制小部件树的同时,计划了一个新的框架来重建小部件树。这可能是因为setState()是从布局或绘画回调中调用的。如果需要更改小部件树,则应在构建树时应用它。安排下一帧的更改会导致接口滞后一帧。如果这样做是为了使您的构建依赖于在布局时测量的大小,请考虑使用LayoutBuilder,CustomSingleChildLayout或CustomMultiChildLayout。另一方面,如果一个帧延迟是理想的效果(例如,因为这是动画),请考虑使用SchedulerBinding.addPostFrameCallback或使用AnimationController触发动画,以在后帧回调中调度帧。 引发异常时,这是堆栈: 0 WidgetsBinding._handleBuildScheduled。 (软件包:flutter / src / widgets / binding.dart:637:9) 1个WidgetsBinding._handleBuildScheduled(package:flutter / src / widgets / binding.dart:656:6) 2 BuildOwner.scheduleBuildFor(包:flutter / src / widgets / framework.dart:2232:7) 3 Element.markNeedsBuild(package:flutter / src / widgets / framework.dart:3706:11) 4 State.setState(包:flutter / src / widgets / framework.dart:1161:14) ... AnimationController通知状态侦听器是:AnimationController#677b4(◀1.000;对于MaterialPageRoute(null)) ══════════════════════════════════════════════════ ══════════════════════════════════════════════════

════════(2)小部件库caught捕获到异常════════════════════ getter'userGestureInProgress'在null上被调用。 接收者:null 尝试调用:userGestureInProgress 用户创建的导致错误的小部件的祖先是:   MaterialApp文件:/// C:/Users/olgam/Desktop/FlutterProjects/Projects/Kids%20Development/kids_development/lib/main.dart:10:12 ══════════════════════════════════════════════════ ════════════

这是Flutter Doctor结果:

[√] Flutter(频道稳定,v1.9.1 + hotfix.4,在Microsoft Windows [Version 10.0.18362.418],语言环境en-US)     •Flutter版本1.9.1 + hotfix.4位于C:\ Users \ olgam \ source \ flutter     •框架修订版cc949a8e8b(4周前),2019-09-27 15:04:59 -0700     •引擎修订版b863200c37     •Dart 2.5.0版

[√] Android工具链-为Android设备开发(Android SDK版本28.0.3)     •位于以下位置的Android SDK:C:\ Users \ olgam \ AppData \ Local \ Android \ sdk     •未配置Android NDK位置(可选;对本机性能分析支持很有用)     •平台android-28,构建工具28.0.3     •Java二进制文件位于:C:\ Program Files \ Android \ Android Studio \ jre \ bin \ java     •Java版本OpenJDK运行时环境(内部版本1.8.0_202-发行-1483-b03)     •接受所有Android许可。

[√] Android Studio(3.5版)     •位于C:\ Program Files \ Android \ Android Studio的Android Studio     •Flutter插件版本40.2.2     •Dart插件版本191.8593     •Java版本OpenJDK运行时环境(内部版本1.8.0_202-release-1483-b03)

[√]已连接设备(1个可用)     •为x86构建的Android SDK•仿真器-5554•android-x86•Android 7.0(API 24)(仿真器)

•找不到问题!

1 个答案:

答案 0 :(得分:0)

好吧,很难说清楚,因为显然没有显示所有代码。 但是我看不到将某些内容推入Navigator的视图堆栈中的位置。我看到您正在从导航器中弹出,但是如果您之前实际在其中导航,则该代码不会显示在代码中。

对我来说,您似乎没有正确使用AnimatedSwitcher。该小部件假定其子项可以更改,并且当该子项更改时,它将应用动画,因此新老子级之间的过渡看起来“不错”。并且在您的代码中,您仅使用AnimatedSwitcher的两个不同实例,具体取决于_gameFinished的值。尝试考虑一下并更改您的实现,希望对您有所帮助。