我的涉及 GravitySimulation 的动画不会动画

My Animation involving a GravitySimulation won't animate

正在制作动画的容器小部件停留在动画的起点,即。动画不会启动,但如果使用单个小部件而不是像我制作的 particles 列表那样的小部件列表,则动画可以正常工作。 为什么会这样,我该如何解决?提前致谢!

这是我的代码:

import 'package:flutter/material.dart';
import 'package:flutter/animation.dart';
import 'package:flutter/physics.dart';
import 'dart:math';

void main() => runApp(PhysicsAnimation());

class PhysicsAnimation extends StatefulWidget {
  _PhysicsAnimation createState() => _PhysicsAnimation();
}

class _PhysicsAnimation extends State<PhysicsAnimation>
    with TickerProviderStateMixin{
  AnimationController controller;
  GravitySimulation simulation;
  List<Widget> particles=[];
  bool isLoad=true;

  Random random=new Random();
  @override
  void initState() {
    super.initState();

    simulation = GravitySimulation(
      100, // acceleration
      0.0, // starting point
      2000.0, // end point
      5, // starting velocity
    );


    controller =
    AnimationController(vsync: this, upperBound: 800)
      ..addListener(() {
        setState(() {});
      });

    controller.animateWith(simulation);
  }

  @override
  Widget build(BuildContext context) {
   if (isLoad) {
     for(int i=0;i<20;i++){
      particles.add(Positioned(
          left: 50+random.nextDouble()*100,
          top: controller.value,
          height: 10,
          width: 10,
          child: Container(
            color: Colors.redAccent,
          )));}
   }
    isLoad=false;
      return MaterialApp(
      home: Stack(
          children:

            particles

      ),
    );
  }

  @override
  void dispose() {
    controller.dispose();
    super.dispose();
  }
}

我知道这已经有一段时间了,但是您设法解决了这个问题吗?我认为您需要在 setState 中重置 isLoad 并在添加更多粒子之前清除粒子列表。

controller = AnimationController(vsync: this, upperBound: 800)
  ..addListener(() {
    setState(() {
      **isLoad = true;**
    });
  });

...

Widget build(BuildContext context) {
if (isLoad) {
  **particles.clear();**
  for (int i = 0; i < 5; i++) {
    particles.add(Positioned(
        left: 50 + random.nextDouble() * 500,
        top: controller.value,
        height: 10,
        width: 10,
        child: Container(
          color: Colors.redAccent,
        )));
  }
}
isLoad = false;
return Stack(children: particles);

}