问题描述
我试图从这里传递列表位置并收到此错误:无法将参数类型“动画”分配给参数类型“动画”。我按照 youtuber 的步骤操作,可以在此处查看完整代码:https://github.com/codespiration/petadoption/blob/master/menu_frame.dart。真的很感谢你们的帮助
> @override void initState() {
> super.initState();
> _animationController = AnimationController(vsync: this,duration: duration);
> scaleAnimation =
> Tween<double>(begin: 1.0,end: 0.6).animate(_animationController);
> smallerScaleAnimation =
> Tween<double>(begin: 1.0,end: 0.5).animate(_animationController);
>
> scaleAnimations = [
> Tween<double>(begin: 1.0,end: 0.7).animate(_animationController),> Tween<double>(begin: 1.0,end: 0.6).animate(_animationController),end: 0.5).animate(_animationController),> ];
> _animationController.forward(); }
>
> Widget buildScreenStack(int position) {
> final deviceWidth = MediaQuery.of(context).size.width;
> return AnimatedPositioned(
> duration: duration,> top: 0,> bottom: 0,> left: menuOpen ? deviceWidth * 0.35 : 0.0,> right: menuOpen ? deviceWidth * -0.65 : 0.0,> child: ScaleTransition(
> scale: scaleAnimations[position],> child: GestureDetector(
> onTap: () {
> if (menuOpen) {
> setState(() {
> menuOpen = false;
> _animationController.reverse();
> });
> }
> },> child: AbsorbPointer(
> absorbing: menuOpen,> child: Stack(
> children: <Widget>[
> Material(
> animationDuration: duration,> borderRadius: BorderRadius.circular(menuOpen ? 30.0 : 0.0),> child: screens[position],> ),> ],> ),> ),> ),> ),> ); }
>
> @override Widget build(BuildContext context) {
> final deviceWidth = MediaQuery.of(context).size.width;
> return Stack(
> children: finalStack(),> ); } }
解决方法
scaleAnimations
字段被声明为 List<Animation>
,并且由于 Animation
是通用的,这与 List<Animation<dynamic>>
隐式相同。因此,运行时会将列表中的任何元素解释为 Animation<dynamic>
,即使它们实际上具有 Animation<double>
类型。
要解决此问题,您只需更改字段声明:
List<Animation<double>> scaleAnimations;