首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flutter :在AnimationController.dispose() AnimationController方法之后调用的AnimationController.stop()不应在调用dispose之后使用。)

Flutter :在AnimationController.dispose() AnimationController方法之后调用的AnimationController.stop()不应在调用dispose之后使用。)
EN

Stack Overflow用户
提问于 2021-11-28 03:38:41
回答 1查看 270关注 0票数 1

当动画正在运行时,我想返回到下一页或上一页...但是这个错误显示“在调用dispose之后不应该使用AnimationController.dispose() AnimationController方法”。

请帮帮我。

代码语言:javascript
复制
          import 'package:flutter/material.dart';
          import 'package:flutter_screenutil/flutter_screenutil.dart';
          import 'package:get/get.dart';
          import 'package:sanduk/utils/app_colors.dart';
          import 'package:sanduk/utils/text_widget.dart';
          import 'dart:math' as math;

          class QuizSearchingPlayers extends StatefulWidget {
            const QuizSearchingPlayers({Key? key}) : super(key: key);

            @override
            _QuizSearchingPlayersState createState() => _QuizSearchingPlayersState();
          }

          class _QuizSearchingPlayersState extends State<QuizSearchingPlayers>
              with SingleTickerProviderStateMixin {
            late AnimationController _controller;

            @override
            void initState() {
              super.initState();
              _controller = AnimationController(
                duration: const Duration(seconds: 2),
                vsync: this,
              )..repeat();

              _controller.addListener(() async {
                await stoppingAnimation();
              });
            }

            Future stoppingAnimation() async {
              await Future.delayed(const Duration(seconds: 10));
              _controller.reset();
              _controller.stop();
              return true;
            }

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

            @override
            Widget build(BuildContext context) {
              return SafeArea(
                child: Scaffold(
                  backgroundColor: AppColors.darkThemeBackground,
                  body: Container(
                    height: Get.height,
                    width: Get.width,
                    padding: EdgeInsets.all(20.h),
                    child: Column(
                      children: [
                        TextWidget(
                          "BIOLOGY QUIZ",
                          styles: TextStyles.size18_500,
                          color: AppColors.white,
                        ),
                        Container(
                          padding: EdgeInsets.symmetric(vertical: 5, horizontal: 10.w),
                          child: CircleAvatar(
                            radius: 150.r,
                            backgroundColor: AppColors.transparent,
                            child: AnimatedBuilder(
                              animation: _controller,
                              child: Padding(
                                padding: const EdgeInsets.all(8.0),
                                child: Stack(
                                  children: [
                                    Align(
                                      alignment: Alignment.center,
                                      child: CircleAvatar(
                                        radius: 120.r,
                                        backgroundColor: AppColors.blue,
                                        child: CircleAvatar(
                                          radius: 115.r,
                                          backgroundColor: AppColors.darkThemeBackground,
                                        ),
                                      ),
                                    ),
                                    Align(
                                      alignment: Alignment.centerLeft,
                                      child: CircleAvatar(
                                          radius: 40.r,
                                          backgroundColor: AppColors.red,
                                          backgroundImage: const AssetImage(
                                              "assets/images/sardar.png")),
                                    ),
                                    Align(
                                        alignment: Alignment.centerRight,
                                        child: CircleAvatar(
                                          radius: 40.r,
                                          backgroundColor: AppColors.darkBlue,
                                          backgroundImage: const AssetImage(
                                              "assets/images/sardar.png"),
                                        )),
                                  ],
                                ),
                              ),
                              builder: (context, child) {
                                return Transform.rotate(
                                  angle: _controller.value * 2 * math.pi,
                                  child: child,
                                );
                              },
                            ),
                          ),
                        ),
                        TextWidget(
                          "Searching For Opponent..",
                          styles: TextStyles.size32_400,
                          color: AppColors.blue,
                          maxLines: 2,
                        ),
                      ],
                    ),
                  ),
                ),
              );
            }
          }

一切都很好,直到我导航回到另一个屏幕...当我在stoppingAnimation()方法中打印某些行时,它会一直打印下去,我该如何停止打印呢?

EN

回答 1

Stack Overflow用户

发布于 2021-11-29 07:00:37

通过将我的stoppingAnimation方法保留在addlistener方法之外来解决

代码语言:javascript
复制
           @override
          void initState() {
            super.initState();
            _controller = AnimationController(
              duration: const Duration(seconds: 2),
              vsync: this,
            )..repeat();

            _controller.addListener(() {
              if (_controller.status == AnimationStatus.dismissed) {
                setState(() {
                  opponentFound = true;
                  _quizAnimationController.countDownTogetReady();
                });
              }
            });

            stoppingAnimation();
          }

          Future stoppingAnimation() async {
            await Future.delayed(const Duration(seconds: 5));
            _controller.reset();
            _controller.stop();
          }

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

我不确定我认为_controller.addListener()方法正在静默地运行,监听发生的事件,就像我的stoppingAnimation()方法中的"print statement“一样。这就是打印多次发生的原因。因此,我只是在_controller.addListener()方法之外使用了stopingAnimation()方法,并且工作得很好。

我是这个颤动社区的新手,所以不确定事情是如何运作的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70140488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档