我正在为儿童创建一个应用程序。它具有菜单屏幕,从中可以通过单击相应的按钮进入不同的游戏。游戏结束后,开始播放星星动画。动画制作完成后,我希望我的应用返回菜单屏幕。这是问题所在。动画结束时,我会收到以下错误消息:在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)(仿真器)
•找不到问题!
答案 0 :(得分:0)
好吧,很难说清楚,因为显然没有显示所有代码。
但是我看不到将某些内容推入Navigator
的视图堆栈中的位置。我看到您正在从导航器中弹出,但是如果您之前实际在其中导航,则该代码不会显示在代码中。
对我来说,您似乎没有正确使用AnimatedSwitcher
。该小部件假定其子项可以更改,并且当该子项更改时,它将应用动画,因此新老子级之间的过渡看起来“不错”。并且在您的代码中,您仅使用AnimatedSwitcher
的两个不同实例,具体取决于_gameFinished
的值。尝试考虑一下并更改您的实现,希望对您有所帮助。