[flutter] 플러터 RxDart로 사용자 정의 애니메이션 구현하기

플러터(Flutter)는 크로스 플랫폼 모바일 앱 개발을 위한 프레임워크로서, 사용자 정의 애니메이션 구현을 위한 다양한 기능을 제공합니다. 이 중에서 RxDart를 활용하면 간편하게 사용자 정의 애니메이션을 만들 수 있습니다.

RxDart란?

RxDart는 Dart 언어를 위한 반응형 프로그래밍 라이브러리입니다. 이 라이브러리는 Dart언어의 Stream과 StreamController를 사용하여 순차적이고 비동기적인 데이터 흐름을 구현할 수 있도록 도와줍니다. 사용자 정의 애니메이션 구현에 있어 RxDart는 강력한 도구 역할을 할 수 있습니다.

애니메이션 컨트롤러 클래스 구현하기

먼저 애니메이션을 제어하는 컨트롤러 클래스를 구현해야 합니다. 이 클래스에서는 애니메이션을 시작하고 멈출 수 있으며, 애니메이션 값의 변화를 다른 클래스로 알려줄 수 있도록 기능을 제공합니다.

import 'package:rxdart/rxdart.dart';

class AnimationController {
  final BehaviorSubject<double> _animationSubject = BehaviorSubject<double>();

  Stream<double> get animationStream => _animationSubject.stream;

  void startAnimation() {
    // 애니메이션 시작 로직 구현

    // 애니메이션 값을 Subject에 전달
    _animationSubject.add(0.0); // 애니메이션 시작 값을 0.0으로 설정
  }

  void stopAnimation() {
    // 애니메이션 정지 로직 구현

    _animationSubject.close();
  }
}

위 코드에서는 AnimationController 클래스를 정의하였습니다. 이 클래스는 애니메이션 값을 다른 클래스 또는 위젯으로 전달하기 위한 Stream을 제공합니다. animationStream getter를 통해 해당 Stream을 가져올 수 있습니다. 또한, startAnimation 메서드와 stopAnimation 메서드를 구현하여 애니메이션을 시작하고 정지할 수 있습니다.

애니메이션 사용하기

위에서 구현한 AnimationController 클래스를 사용하여 애니메이션을 구현해보도록 하겠습니다.

import 'package:flutter/material.dart';

class AnimatedWidgetExample extends StatefulWidget {
  @override
  _AnimatedWidgetExampleState createState() => _AnimatedWidgetExampleState();
}

class _AnimatedWidgetExampleState extends State<AnimatedWidgetExample>
    with SingleTickerProviderStateMixin {
  AnimationController _animationController;

  @override
  void initState() {
    super.initState();
    _animationController = AnimationController();
  }

  @override
  void dispose() {
    _animationController.stopAnimation();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Animated Widget Example'),
      ),
      body: Center(
        child: StreamBuilder(
          stream: _animationController.animationStream,
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              double animationValue = snapshot.data;

              // 애니메이션 값에 따라 위젯을 변화시키는 로직 구현

              return Container(
                width: animationValue * 100,
                height: animationValue * 100,
                color: Colors.blue,
              );
            } else {
              return Container();
            }
          },
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          _animationController.startAnimation();
        },
        child: Icon(Icons.play_arrow),
      ),
    );
  }
}

위 코드는 AnimatedWidgetExample라는 StatefulWidget을 정의하고, AnimationController를 사용하여 애니메이션을 구현한 예제입니다. initState 메서드에서 _animationController를 생성하고, dispose 메서드에서 정리하도록 구현하였습니다. build 메서드에서는 StreamBuilder를 사용하여 애니메이션 값 변화에 따라 위젯을 업데이트하도록 하였습니다. 마지막으로, floatingActionButton을 사용하여 애니메이션을 시작할 수 있는 버튼을 추가하였습니다.

이제 위 코드를 실행하면 애니메이션을 사용하는 예제를 확인할 수 있습니다.

결론

RxDart를 사용하여 플러터에서 사용자 정의 애니메이션을 구현하는 방법을 알아보았습니다. RxDart를 활용하면 반응형 프로그래밍의 개념을 통해 효율적이고 유연한 애니메이션 구현이 가능합니다. 플러터에서 사용자 정의 애니메이션을 구현할 때에는 RxDart를 적극적으로 활용해보세요.

참고 자료