본문 바로가기
Flutter

Flutter에서 AnimationController Listener Notification 중 발생하는 오류 해결하기

by 난타코다옹 2023. 10. 6.

목차

    오류 메시지:

    'package:flutter/src/widgets/framework.dart': Failed assertion: line 4263 pos 12: '_debugLifecycleState != _ElementLifecycle.defunct': is not true.

    원인:

    위 코드에서 애니메이션 컨트롤러를 사용하는 방법이 잘못되었습니다. 애니메이션 컨트롤러가 위젯의 라이프사이클에 따라 정확하게 처리되지 않아서 오류가 발생합니다.

    해결:

    애니메이션 컨트롤러를 사용할 때는 애니메이션을 시작하기 전에 initState()에서 컨트롤러를 초기화하고 dispose()에서 컨트롤러를 정리해야합니다. 이렇게 하면 위젯의 라이프사이클에 맞게 애니메이션 컨트롤러가 처리됩니다.

    아래는 해결 방법의 예시 코드입니다:

    class MyWidget extends StatefulWidget {
      @override
      _MyWidgetState createState() => _MyWidgetState();
    }
    
    class _MyWidgetState extends State<MyWidget> with SingleTickerProviderStateMixin {
      AnimationController _controller;
    
      @override
      void initState() {
        super.initState();
        _controller = AnimationController(
          vsync: this,
          duration: Duration(seconds: 1),
        );
      }
    
      @override
      void dispose() {
        _controller.dispose();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return SingleChildScrollView(
          child: Container(
            decoration: BoxDecoration(
              image: DecorationImage(
                image: AssetImage("images/sidebg.png"),
                fit: BoxFit.cover,
              ),
            ),
            child: Column(
              children: [
                pageIndex == 0 ? DashboardScreen() : Container(),
                pageIndex == 1 ? MapScreen() : Container(),
                pageIndex == 3 ? ServiceCenter() : Container(),
                pageIndex == 4 ? ProfileScreen() : Container(),
              ],
            ),
          ),
        );
      }
    }

    분석:

    애니메이션 컨트롤러를 사용할 때는 항상 위젯의 라이프사이클을 고려해야합니다. initState()에서 컨트롤러를 초기화하고 dispose()에서 컨트롤러를 정리하는 것이 좋습니다. 이렇게 하면 애니메이션 컨트롤러가 정확하게 처리되어 오류를 방지할 수 있습니다.