본문 바로가기
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()에서 컨트롤러를 정리하는 것이 좋습니다. 이렇게 하면 애니메이션 컨트롤러가 정확하게 처리되어 오류를 방지할 수 있습니다.